1、Struts2 一个 Action 内包含多个请求处理方法的处理Struts2 一个 Action 内包含多个请求处理方法的处理(三种方式)Struts1 提供了 DispatchAction,从而允许一个 Action 内包含多个请求处理方法。Struts2 也提供了类似的功能。处理方式主要有以下三种方式:1.1. 动态方法调用:DMI:Dynamic Method Invocation 动态方法调用。动态方法调用是指:表单元素的 action 不直接等于某个 Action 的名字,而是以如下形式来指定对应的动作名:则用户的请求将提交到名为”userOpt”的 Action 实例,Actio
2、n 实例将调用名为”login”方法来处理请求。同时 login 方法的签名也是跟 execute()一样,即为public String login() throws Exception。注意:要使用动态方法调用,必须设置 Struts2 允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation 常量来完成,该常量属性的默认值是true。1.1.1. 示例:修改用户登录验证示例,多增加一个注册用户功能。1. 修改 Action 类:package org.qiujy.web.struts2.action;import com.opensymphon
3、y.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;/*authorqiujy*version1.0*/publicclass LoginAction extends ActionSupportprivate String userName;private String password;private String msg; /结果信息属性/*returnthemsg*/public String getMsg() returnmsg;/*parammsgthemsgtoset*/publicvoid set
4、Msg(String msg) this.msg = msg;/*returntheuserName*/public String getUserName() returnuserName;/*paramuserNametheuserNametoset*/publicvoid setUserName(String userName) this.userName = userName;/*returnthepassword*/public String getPassword() returnpassword;/*parampasswordthepasswordtoset*/publicvoid
5、 setPassword(String password) this.password = password;/*处理用户请求的 login()方法*return 结果导航字符串*throwsException*/public String login() throws Exceptionif(“test“.equals(this.userName) /获取 ActionContext 实例,通过它来访问 Servlet APIActionContext context = ActionContext.getContext();/看 session 中是否已经存放了用户名,如果存放了:说明已经
6、登录了;/否则说明是第一次登录成功if(null != context.getSession().get(“uName“)msg = this.userName + “:你已经登录过了!“;elsecontext.getSession().put(“uName“, this.userName);returnthis.SUCCESS;elsemsg = “登录失败,用户名或密码错 “;returnthis.ERROR;public String regist() throws Exception/将用户名,密码添加到数据库中/.msg = “注册成功。 “;returnthis.SUCCESS;
7、2. struts.xml 文件:没有什么变化,跟以前一样配置/success.jsp/error.jsp3. 页面:index.jsp用户登录页面 用户入口 用户名:密码:regist.jsp用户注册页面 用户注册 用户名:密码:1.2. 为 Action 配置 method 属性:将 Action 类中的每一个处理方法都定义成一个逻辑 Action 方法。/success.jsp/error.jsp/success.jsp/error.jsp如上,把 LoginAction 中的 login 和 regist 方法都配置成逻辑 Action。要调用 login 方法,则相应的把 index
8、.jsp 中表单元素的 action 设置为“manage/userLogin.action“;要调用 regist 方法,把 regist.jsp 中表单元素的 action 设置为“manage/userRegist.action“。1.3. 使用通配符映射(wildcard mappings)方式:在 struts.xml 文件中配置 元素时,它的 name、class、method 属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。当我们使用通配符定义 Action 的 name 属性时,相当于用一个元素 action 定义了多个逻辑 Action:/success.jsp/error.jsp如上,定义一系列请求 URL 是 user_*.action 模式的逻辑 Action。同时 method 属性值为一个表达式1,表示它的值是 name 属性值中第一个*的值。例如:用户请求 URL 为 user_login.action 时,将调用到 UserAction 类的 login 方法;用户请求 URL 为 user_regist.action 时,将调用到 UserAction类的 regist 方法。