同样,在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
步骤:
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();