Action访问Servlet API的几种方式,其中方式三比较常用,下来是方式一,最后是方式二(实现接口的方式)


方式一:使用ActionContext类间接获取Servlet API
       Struts 2提供了一个ActionContext类,Struts 2的Action可以通过该类来访问Servlet API,以下是ActionContext类
       中常用的几个方法:
       1.Object get(Object key):类似于调用HttpServletRequest的request.getAttribute(String name)方
       2.Map getApplication();返回一个Map集合对象,该对象模拟了该应用的ServletContext实例
       3.static ActionContext getConntext();静态方法,获取系统的ActionContext实例
       4.Map getParameters();获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap()方法
       5.Map getSession();返回一个Map对象,该Map对象模拟了HttpSession实例
       6.void setApplication(Map application):将Map的键值对转换成application的属性名和属性值(保存在application对象中)
       7.void setSession(Map map);将Map的键值对转换成session的属性名,属性值(保存在session对象中)
   示例:在action类中向request,session和application范围设置属性值
       public class LoginAction Implements Action{
 
           private String username;
           private String password;
           //省略username,password的setter和getter方法
           ........................................
           public String execute(){
              //创建ActionContext实例ctx
              ActionContext ctx = ActionContext.getContext();
              //获取application范围的属性值,ctx.getApplication()的结果是一个Map集合,再通过get方法获取到count键对应的值
              int count = ctx.getApplication().get("count");
              if(count == null){
                 count = 1;
              }else{
                 count = count+1;
              }
              //设置application范围的属性值
              ctx.getApplication().put("count",count);
              //设置session范围的属性值         
              ctx.getSession.put("username","getUsername()");
              if(getUsername().equals("crazyit.org")&&getPassword().equals("leegang")){
                 //设置request范围的属性值
                 ctx.put("tip","登陆成功!");
                 return SUCCESS; 
              }else{
                 //设置request范围的属性值
                 ctx.put("tip","登录失败!");
                 return ERROR;
              }
           }
       }
       这样在登录成功页面就可获取到设置在三个范围里的属性值了,如下:
       -------------------------------------------------------
       本站访问的次数:${applicationScope.count}
       ${sessionScope.username}
       ${requestScope.tip}
       -------------------------------------------------------
     使用总结:
       1.首先创建ActionContext类的实例,创建方式为:
         ActionContext ctx = ActionContext.getContext();
       2.设置request范围的值:ctx.put("aaa","我是request中的值!"); //集合的put方法
         在jsp页面获取request的值:${requestScope.aaa}              //使用EL表达式
         在action页面获取request范围的值:ctx.get("aaa");           //集合的get方法获取键对应的值
       3.设置session范围的值:ctx.getSession().put("key","value"); //调用Map集合的put方法设置值
         在jsp页面获取session范围的值:${sessionScope.key}          //使用EL表达式获取值
         在action中获取session的值:ctx.getSession().get("key")     //根据Map集合的键获取对应的值
       4.application和session的方法使用方式一致
方式二:Struts中Action类实现对应接口,直接访问Servlet API
       在Struts中提供了如下几个接口:
       1.ServletContextAware:实现该接口的action类可以直接访问web应用的ServletContext实例
         需重写的方法:public void setServletContext(HttpServletContext context)
       2.ServletRequestAware:实现该接口的action类可以直接访问用户请求的HttpServletRequest实例
         需重写的方法:public void setServletRequest(HttpServletRequest request)
       3.ServletResponseAware:实现该接口的action类可以直接访问服务器响应的的ServletResponse实例   
         需重写的方法:public void setServletResponse(HttpServletResponse response)
       使用步骤:
       1.首先在action类中定义HttpServletResponse类型的response成员属性或者HttpServletRequest类型的request成员属性
       2.重写接口中的方法,在以上的三个接口中各有一个方法需要被重写,如ServletResponseAware接口要求重写
       public void setServletResponse(HttpServletResponse response)方法,注意到该方法中有一个HttpServletResponse
       类型的参数,就代表了Web应用对客户的响应,我们只要在该方法内通过this.response=response就可将其设置为action类
       的成员属性,从而就可以在action中使用该response对象了,request对象的使用也是如此,有了request对象session就可以
       被创建,
    示例:在action类中使用response和request对象
       public class LoginAction entends ActionSupport implements ServletRequestAware,ServletResponseAware{
         
           private String username;
           private String password;
           private HttpServletRequest request;
           private HttpServletResponse response;
        
           //重写实现ServletRequestAware接口必须实现的方法
           public void setServletRequest(HttpServletRequest request){
               this.request = request;
           }
           //重写实现ServletResponseAware接口必须实现的方法,
           public void setServletResponse(HttpServletResponse response){
               this.response = response;
           }
           //接下来request和response对象就可以在action的所有方法中使用了
           public String execute(){
              .............
           }
        }
方式三:使用ServletActionContext工具类直接访问Servlet API,不用实现什么接口,该类中常用的方法如下:
       1.static PageContext getPageContext():取得Web应用的PageContext对象
       2.static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象
       3.static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象
       4.static ServletContext getServletContext():取得Web应用的ServletContext对象
       如: HttpServletRequest request = ServletActionContext.getRequest();
            request.getSession().setAttribute("aaaa","aaaa");
         在jsp页面通过ognl表达式和标签获取到session中的值:<s:property value="#session.aaaa" />
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智玲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值