实现Action

Action类里的属性,不仅可以用于封装请求参数,还可以用于封装处理结果。系统不会严格区分Action里的哪个属性使用于封装请求参数的属性,哪个属性是封装处理结果的属性。对于系统而言,封装请求参数的属性和封装处理结果的属性是完全平等的。如果用户的HTTP请求参数中包含了名为tip的请求参数,则系统会调用Action类的void setTip(String tip)方法。通过这种方式,名为tip的参数就可以传给Action实例,如果Action类里面有包含对应的方法,则名为tip的请求参数无法传入该Action。

        同样,在JSP页面中输出Action属性时,他也不会区分该属性是用于封装请求参数的属性还是用于封装处理结果的属性。因此使用Struts2的标签既可以输出Action的处理结果,也可以输出HTTP请求参数值。

     在JSP中输出处理结果是一个简单的字符串,可以用<S:property.../>标签来控制输出。实际上,Action类中可以封装非常复杂的属性包括其他用户的自定义类、数组、集合对象和map对象等。对于这些复杂对象的输出也可以使用Struts2标签来完成。

<!--使用Struts2标签来输出tip属性值-->  
<s:property value="tip"/>  

1.Action接口和ActionSupport基类

 为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。例如,当Action类处理用户处理成功后,有人喜欢返回welcome字符串,有人喜欢返回success字符串,如此不利于项目的统一管理,Struts2的Action接口定义加上了如上的5个字符串常量:ERROR,NONE,INPUT,LOGIN,SUCCESS等,分别代表了特定的含义。当然,如果开发者依然希望使用特定的字符串作为逻辑视图名,开发者依然可以返回自己的视图名。

        另外,Struts2还为Action接口提供了一个实现类:ActionSupport,ActionSupport是一个默认的Action实现类,该类里已经提供了许多默认方法,这些方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等,实际上,ActionSupport是Struts2的默认的Action处理类,如果让开发者的Action类继承该ActionSupport类,则会大大简化Action的开发。

2.Action访问Servlet API

2.1通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API。

步骤:
1).创建一个ActionContext

  • ActionContext context=ActionContext.getContext();

2).通过context对象获取Servlet API

  • Map<String,Object> getApplication() 获取的是application中存储的所有信息 
  • Map<String,Object> getParameters() 相当于 request.getParameterMap();
  • Map<String,Object> getSession(); 获取的是session中存储的所有信息.
  • put(String key,Object value); 就相当于request.setAttribute();
  • Object get(String key) 就相当于request.getAttribute();

2.2通过注入方式(真正的Servlet API)

通过实现*Aware接口获得Servlet API,比如:

  • ServletContextAware : 注入ServletContext对象
  • ServletRequestAware :注入 request对象
  • ServletResponseAware : 注入response对象、
  • 比如获取HttpServletRequest对象:
  • public class TestAction extends ActionSupport implements ServletRequestAware {
        HttpServletRequest request;
        @Override
        public String execute() {
            request.setAttribute("name", "requestTest");
            return "success";
        }
        
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }
    
    }

2.3

通过ServletActionContext(真正的Servlet API)

通过ServletActionContext类中提供了静态方法可以直接获取Servlet API:

1 //获取request
2 HttpServletRequest request = ServletActionContext.getRequest();
3 //获取session
4 HttpSession session = request.getSession();
5 //获取context
6 ServletContext context = ServletActionContext.getServletContext();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值