Struts2 DMI动态方法调用和通配符
更多请看 (www.omob.cc)
动态方法调用
1、Struts2默认关闭DMI功能,需要使用需要手动打开,配置常量
struts.enable.DynamicMethodInvocation = true
2、使用“!”方法,即action名称!方法名称。
struts.xml
<action name="query" class="action.QueryAction"> <result name="success">/success.jsp</result> <result name="update">/update.jsp</result> </action> |
请求URL为/query!success.action
,调用actio.QueryAction
的success()
方法;请求URL为/query!update
,调用actio.query
的update()
方法;
路径上的.action
可以写也可以不写,Struts2
默认添加.action
为后缀,如果更改了后缀名,例如.do
,就要显示声明。
3、好处:减少action数量,但是结果集数量不变。
通配符映射
- 不必配置
struts.enable.DynamicMethodInvocation = true
- 写法
struts.xml
<action name="*_*" class="action.{1}Action" method="{2}"> <result>{1}_{2}Succ.jsp</result> </action> |
请求URL为/Query_success
,调用actio.QueryAction
的success()
方法;
{1}、{2}
表示通配符的位置,这里{1}
表示Query,{2}
表示success;
另{0}
表示整个通配符,这里表示Query_success,所以上面的结果集也可以写成{0}
Succ.jsp
好处:减少action数量的同时,减少结果集的数量,体现“约定优于配置”,在增加代码的同时,并不需要对struts.xml文件进行更改;
URL请求顺序:当有多个action被匹配成功,例如XAction、Action、,对于请求XAction,则匹配XAction,忽视XAction的出现顺序,对于请求YAction,则由Action、在struts.xml的出现顺序决定,先出现的先调用
匹配带有“/”的路径:
(1)配置常量struts.enable.SlashesInActionNames = true
(2)有些书写用匹配带“/”的路径,但是本人实验结果不需要,直接/即可
DMI
action
package com.qianfeng.action; import com.opensymphony.xwork2.Action; import com.qianfeng.entity.User; public class UserAction { private User user; public String add(){ System.out.println("add"); return Action.SUCCESS; } public String del(){ System.out.println("del"); return Action.SUCCESS; } public String update(){ System.out.println("update"); return Action.SUCCESS; } public String other(){ System.out.println("other"); return Action.SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } |
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 打开开发模式,当修改了这个文件,不需要重启就有效果 --> <constant name="struts.devMode" value="true" /> <!-- 打开动态方法调用 --> <!-- <constant name="struts.enable.DynamicMethodInvocation" value="true"/> --> <package name="default" namespace="/" extends="struts-default"> <!-- method="update" --> <!-- <action name="add" class="com.qianfeng.action.UserAction" method="add"> <result name="success">/ok.jsp</result> </action> <action name="del" class="com.qianfeng.action.UserAction" method="del"> <result name="success">/ok.jsp</result> </action> <action name="update" class="com.qianfeng.action.UserAction" method="update"> <result name="success">/ok.jsp</result> </action> --> <!-- 客户端可以访问任意的方法 --> <!-- <action name="user" class="com.qianfeng.action.UserAction"> <result name="success">/ok.jsp</result> </action> --> <!-- 提供一个默认的欢迎页面 --> <default-action-ref name="default"/> <action name="default"> <result>/ok.jsp</result> </action> <action name="user_*" class="com.qianfeng.action.UserAction" method="{1}"> <result name="success">/ok.jsp</result> </action> </package> </struts> |
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${sessionScope.msg} <form action="login.action" method="post"> 用户名:<input type="text" name="user.username"/><br/> 密码:<input type="password" name="user.password"/><br/> <input type="submit" value="登录"/> </form> <a href="add.action">add</a> <a href="del.action">del</a> <a href="update.action">update</a> <!-- DMI --> <a href="user!add">add</a> <a href="user!del">del</a> <a href="user!update">update</a> <!-- 通配符 --> <a href="user_add">add</a> <a href="user_del">del</a> <a href="user_update">update</a> </body> </html>