Struts2通配符映射/Struts |
您所在的位置:网站首页 › 地瓜蒸多长时间才能熟了吃 › Struts2通配符映射/Struts |
struts2的关于method=“{1}"意思详解 中Login_*带*是什么意思?method= "{1} "带{}这个是什么意思? ==================================================== name= "Login_* " 代表这个action处理所有以Login_开头的请求 method= "{1} " 根据前面请求Login_methodname,调用action中的以methodname命名的方法 class= "mailreader2.Login " action的类名称 如jsp文件中请求Login_validateUser的action名称,根据上面配置,调用action类mailreader2.Login类中方法validateUser() 又如: 对于Login_update请求,将会调用mailreader2.Login的update()方法。 它的用法同webwork中的!符号的作用,相当于是一个通配符。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ struts2中的路径问题 注意:在jsp中”/”表示tomcat服务器的根目录,在struts.xml配置文件中”/”表示webapp的根路径,即MyEclipse web项目中的WebRoot路径。 总结: struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径 。 虽然可以用redirect方式解决,但redirect方式并非必要。 解决办法非常简单,统一使用绝对路径。 (在jsp中用request.getContextRoot方式来拿到webapp的路径) 或者使用myeclipse经常用的,指定basePath。 Action Method 配置: /user_add_success.jsp /user_add_success.jsp 总结: Action执行的时候并不一定要执行execute方法 1、可以在配置文件中配置Action的时候用method=来指定执行哪个方法(前者方法) 2、也可以在url地址中动态指定(动态方法调用DMI )(推荐)(后者方法) 添加用户 添加用户 前者会产生太多的action,所以不推荐使用。(注:) 再给个案例,大概介绍!使用动态调用DMI的方法,即通过!+方法名的指定方法: UserAction.java import com.opensymphony.xwork2.ActionContext; import java.util.Map; public class UserAction { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute(){ if(!userName.equals("aa")||!password.equals("aa")){ return "error"; }else{ Map session=(Map)ActionContext.getContext().getSession(); session.put("userName", userName); return "success"; } } public String loginOther(){ if(!userName.equals("bb")||!password.equals("bb")){ return "error"; }else{ Map session=(Map)ActionContext.getContext().getSession(); session.put("userName", userName); return "success"; } } } struts.xml /welcome.jsp /hello.jsp /hello.jsp /login_welcome.jsp /login_error.jsp login_welcome.jsp 欢迎 你好! login_error.jsp 登陆失败 很抱歉!你的登陆失败了!请重新登陆 login.jsp struts 2应用 红色部分,你如果想调用userAction中的loginOther方法而不想调用execute方法, 直接通过 !+方法名即可,那你就不用再设置struts.xml中注释掉的部分了,这样可以不产生太多的action Action Wildcard(Action 通配符) 配置: /Student{1}_success.jsp /{1}_{2}_success.jsp {1}、{2}表示第一第二个占位符 *为通配符 通过action name的通配匹配,获得占位符,可以使用占位符放在result和method、class中替代匹配的字符。 总结: 使用通配符,将配置量降到最低。 添加学生 删除学生 不过,一定要遵守"约定优于配置"的原则。 添加老师 删除老师 添加课程 删除课程 接收参数值 1、使用action属性接收参数 只需在action加入getter/setter方法,如参数name=a,接受到参数必须有getName/setName方法。 链接: public class UserAction extends ActionSupport { private String name; private int age; public String add() { System.out.println("name=" + name); System.out.println("age=" + age); return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 2、使用Domain Model接收参数 将之前的属性放入到POJO ,并设置属性的setter/getter方法 链接:使用Domain Model接收参数添加用户 public class UserAction extends ActionSupport { private User user; //private UserDTO userDTO; public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 3、使用ModelDriven接收参数 Action实现ModelDriven接口,实现getModel()方法。 这样user需要自己new出来,getModel返回user。 链接:使用ModelDriven接收参数添加用户 public class UserAction extends ActionSupport implements ModelDriven { private User user = new User(); public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } @Override public User getModel() { return user; } } 字符编码 配置: 在struts2.1.6中不起作用,属于bug,在struts2.1.7中修改。 解决方案: 修改web.xml 中: struts2 org.apache.struts2.dispatcher.FilterDispatcher ============================================================= Struts2一个Action内包含多个请求处理方法的处理(三种方式) Struts1提供了DispatchAction,从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。处理方式主要有以下三种方式: 1.1. 动态方法调用: DMI:Dynamic Method Invocation 动态方法调用。 动态方法调用是指:表单元素的action不直接等于某个Action的名字,而是以如下形式来指定对应的动作名: 则用户的请求将提交到名为”userOpt”的Action实例,Action实例将调用名为”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.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** *@authorqiujy *@version1.0 */ publicclass LoginAction extends ActionSupport{ private String userName; private String password; private String msg; //结果信息属性 /** *@returnthemsg */ public String getMsg() { returnmsg; } /** *@parammsgthemsgtoset */ publicvoid setMsg(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 setPassword(String password) { this.password = password; } /** *处理用户请求的login()方法 *@return结果导航字符串 *@throw***ception */ public String login() throws Exception{ if("test".equals(this.userName) && "test".equals(this.password)){ msg = "登录成功,欢迎" + this.userName; //获取ActionContext实例,通过它来访问Servlet API ActionContext context = ActionContext.getContext(); //看session中是否已经存放了用户名,如果存放了:说明已经登录了; //否则说明是第一次登录成功 if(null != context.getSession().get("uName")){ msg = this.userName + ":你已经登录过了!!!"; }else{ context.getSession().put("uName", this.userName); } returnthis.SUCCESS; }else{ msg = "登录失败,用户名或密码错"; returnthis.ERROR; } } public String regist() throws Exception{ //将用户名,密码添加到数据库中 //... msg = "注册成功。"; returnthis.SUCCESS; } } 2. struts.xml文件:没有什么变化,跟以前一样配置 /success.jsp /error.jsp 3. 页面: index.jsp 用户登录页面 用户入口 用户名: 密码: regist.jsp 用户注册页面 用户注册 用户名: 密码: 1.2. 为Action配置method属性: 将Action类中的每一个处理方法都定义成一个逻辑Action方法。 /success.jsp /error.jsp /success.jsp /error.jsp 如上,把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法,则相应的把index.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方法。
原文链接: http://java.chinaitlab.com/Strut... |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |