Action访问Servlet API(通过ActionContext类访问)

来源:互联网 发布:淘宝c店会员积分 编辑:程序博客网 时间:2024/06/06 01:06
 

实现Action(三)——Action访问Servlet API

标签: actionservletstrutsapplicationsessionstring
 1834人阅读 评论(2) 收藏 举报
 分类:
 

本文摘自:李刚 著 《轻量级 Java EE企业应用实战 Struts2+spring+hibernate整合开发》

 

 

        Struts2的Action没有和任何Servlet API进行耦合,这是Struts2的一个改良之处,因为Struts2 不再和Servlet进行耦合,从而能够更加轻松的测试该Action。

        但对于web应用的控制器而言,不访问Servlet API基本是不可能的,例如,跟踪HTTP Session状态等等。Struts2框架提供了一种更轻松的方式来访问Servlet API。在web应用中通常要访问Servlet API的就是HttpServletRequest、HttpSession和ServletContext,这三个类别分别代表JSP内置对象中的request、session和application。

        Struts2提供了一个ActionContext类,Struts2的Action通常可以通过该类来访问Servlet API。下面是ActionContext类中包含的几个常用方法:

(1)Object get(Object key): 该方法类似于调用HttpServletRequest的getAttribute(String name)方法。

(2)Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。

(3)static ActionContext getContext():静态方法,获取系统的ActionContext实例。

(4)Map getparameters():获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap()方法。

(5)Map getSession():返回一个Map对象,该对象模拟一个HttpSession实例。

(6)void setApplication(Map application):直接传入一个Map实例,该Map实例里面的key-value对转换成application的属性名、属性值。

(7)void setSession(Map session):直接传入一个Map实例,该Map实例里面的key-value对转换成session的属性名、属性值。

 

        下列代码将在Action类中通过ActionContext访问Servlet API,该Action中示范了向request、session和application范围设置属性值:

[html] view plain copy
  1. package ppp;  
  2.   
  3. import com.opensymphony.xwork.ActionContext;  
  4.   
  5. public class LoginAction implements Action {  
  6.   
  7.     private String username;  
  8.     private String password;  
  9.   
  10.     public String getUsername() {  
  11.         return username;  
  12.     }  
  13.   
  14.     public void setUsername(String username) {  
  15.         this.username = username;  
  16.     }  
  17.   
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.   
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25.   
  26.     public String execute() throws Exception {  
  27.         ActionContext ctx = ActionContext.getContext();  
  28.         // 通过ActionContext访问application范围的属性值  
  29.         Integer counter = (Integer) ctx.getApplication().get("counter");  
  30.         if (counter == null) {  
  31.             counter = 1;  
  32.         } else {  
  33.             counter = counter + 1;  
  34.         }  
  35.         // 通过ActionContext设置application属性值  
  36.         ctx.getApplication().put("counter", counter);  
  37.         // 通过ActionContext设置session属性值  
  38.         if (getUsername().equals("scott") && getPassword().equals("tiger")) {  
  39.             // 通过ApplicationContext设置request范围  
  40.             ctx.put("tip", "服务器提示:您已经成功登陆");  
  41.             return SUCCESS;  
  42.         } else {  
  43.             // 通过ApplicationContext设置request范围  
  44.             ctx.put("tip", "服务器提示:登陆失败");  
  45.             return ERROR;  
  46.         }  
  47.     }  
  48. }  

        上述代码第29行,该Action试图从application范围内读取counter属性值,如果该属性不存在,则设置counter为1,然后将该属性放置于application范围中;如果该counter属性存在,则将该counter属性值加1——也就实现了一个简单的计数器功能。

        上面的Action包含了username和password两个属性,则意味着提交到Action的表单里应该包含username和password两个属性。

敲打

 

         struts.xml配置文件代码如下:

[html] view plain copy
  1. <!DOCTYPE struts PUBLIC    
  2. “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”    
  3. “http://struts.apache.org/dtds/struts-2.0dtd “>    
  4. <struts>    
  5. <!—指定全局化资源文件base名 -->    
  6. <constant name = “struts.custom.i18n.resources” value = “messageResource”/>    
  7. < !—指定国际化编码所使用的字符集 -->    
  8. < constant name = “struts.i18n.encoding” value = “GBK”/>    
  9. <!—所有的Action定义都应该放在package下-->    
  10. <package name = "login " extends = “struts-default”>    
  11. <action name = "login" class = “ppp.LoginAction”>    
  12.       <!--如果处理结果返回error,则对应/error.jsp视图资源-->    
  13.       <result name = “error”>/error.jsp</result>   
  14.       <!--如果处理结果返回success,则对应/welcome.jsp视图资源-->     
  15.       <result name = “success”>/welcome.jsp</result>   
  16. </action>    
  17. </package>    
  18. </struts>   

        上面的配置文件中,当ppp.LoginAction返回success逻辑视图名后,系统将会使用/welcome作为实际视图资源。/welcome.jsp代码如下:

[html] view plain copy
  1. <%@page language = “java” contentType = “text/html; charset = UTF-8;”%>  
  2. <html>  
  3. <head>  
  4. <titile>成功页面</title>  
  5. </head>  
  6. <body>  
  7. 本站访问次数为:${applicationScope.counter}<br>  
  8.     ${sessionScope.user>,您已经登陆!<br>  
  9.     ${requestScope.tip>  
  10. </body>  
  11. </html>  

        上面的7、8、9行代码使用了表达式语言来输出application、session和request范围内的指定属性。前提是这些属性存在并且有值,这些值当然只能在前面的Action中设置。


0 0