上一篇博文我已经基本上讲解了struts.xml的基本配置,但是实际上配置过程最为主要的是action的动态配置。
一、Action的创建方法
1)实现Action接口
2)继承ActionSupport类,覆写其中的方法
3)不继承任何类都可以实现,关键是在struts.xml中进行配置
二、Action动态方法的调用
在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担
第一种方法: 在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)
第二种方法: jsp页面中指定你要调用的那个方法
<form action=”login!myfun.action”,method=”post”>
在客户端请求中进行动态的配置:映射名!方法名.action
这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置
第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)
在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用
<action name="*user" class="com.zzjmay.action.UserAction" method="{1}"> //这种通配是针对的是同一个action中,响应不同的方法 在jsp页面中调用的时候 <form action="loginuser.action" method="post"> <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 --> 用户名:<input type="text" name="username" id="username"><br> 密 码:<input type="password" name="password" id="password"> <br> <input type="submit" value="提交"> </form>
注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法
通过通配符实现,不同的类响应不同的类中的方法:
<action name=“*_*" class="action.{1}Action" method="{2}"> <result >/{2}.jsp</result> </action>
|
三、 Action的动态结果的配置
含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。
UserAction.java public class UserAction extends ActionSupport { private String nextResult; ... }
|
Struts2.xml <action name="user" class="action.UserAction"> <result>/{nextResult}</result> </action>
|
在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。
实现ModelDriven接口
步骤:
u 实现用户登录功能
u 创建User.java类
? 声明用户登录信息
? 创建无参构造
u 创建Action类
? 实现com.opensymphony.xwork2.ModelDriven接口
? 声明User类对象并实例化
? 实现getModel ()方法,返回User类对象
u 创建JSP页面
? 表单元素使用”属性”设置name属性
注意:
1) 首先,action要实现ModelDriven的接口,默认实现getModel()方法
2) 要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的
3) 比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来
UserAction.java
public class UserAction implements ModelDriven<User> { //要实例化 private User user=new User(); public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String myfun() throws Exception { System.out.println("username="+user.getUsername()); System.out.println("password="+user.getPassword()); System.out.println("myfun....."); //用来进行处理 if(user.getUsername().equals(user.getPassword())){ return "success"; }else{ return "error"; } } public User getModel() { // TODO Auto-generated method stub return user; } }login.jsp
<form action="loginuser.action" method="post"> <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 --> 用户名:<input type="text" name="username" id="username"><br> 密 码:<input type="password" name="password" id="password"> <br> <input type="submit" value="提交"> </form>
五、在Action中访问Servlet API
访问Servlet API的实际项目中有两种的方法访问Servlet API
1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)
public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{ private User user = new User(); private Map<String, Object> requestMap; private Map<String, Object> sessionMap; private Map<String, Object> applicationMap; public void setApplication(Map<String, Object> applicationMap) { this.applicationMap=applicationMap; } public void setSession(Map<String, Object> sessionMap) { this.sessionMap=sessionMap; } public void setRequest(Map<String, Object> requestMap) { this.requestMap=requestMap; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String myfun() throws Exception { System.out.println("username=" + user.getUsername()); System.out.println("password=" + user.getPassword()); System.out.println("myfun2....."); // 用来进行处理 if (user.getUsername().equals(user.getPassword())) { sessionMap.put("Succ", "成功的哇2!!!"); Bookbiz bookbiz=new Bookbiz(); applicationMap.put("books",bookbiz.getBooks()); return "success"; } else { requestMap.put("errorMsg", "登陆失败了2"); return "error"; } } public User getModel() { // TODO Auto-generated method stub return user; }
2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象
public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{ private User user = new User(); private HttpServletRequest request; private HttpSession session; private ServletContext application; public void setServletContext(ServletContext application) { this.application = application; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } ………………
在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();
struts.xml中Action的配置详解,布布扣,bubuko.com
原文:http://blog.csdn.net/zzjmay/article/details/24172503