1、Action类中的getter和setter方法
系统根据action中的getter和setter方法来处理参数。而处理的参数当然要有声明,不管在jsp页面中还是在action中,这样在跟action同在一个请求中的文件将都能够这些参数的值。
2、一个action类可实现Action接口或继承ActionSupport基类
为了用户开发的Action类更规范,建议实现Action接口或继承ActionSupport基类。
3、Action没有与任何Servlet API耦合,但提供了几种访问ServletAPI的方式
对于web应用的控制器而言,不访问servletAPI几乎是不可能的,例如跟踪HTTP Session状态等。
(1)利用ActionContext类来访问
Struts2框架提供了一种更轻松的方式来访问ServletAPI。Web应用中经常要被访问的ServletAPI是HttpServletRequest、HttpSession和ServletContext,这三个类分别代表JSP内置对象中的request、session和application(见上篇文章“再学jsp与servlet”)。
在struts2中,Action类可通过ActionContext类来访问ServletAPI,ActionContext可与jsp中的PageContext等比较一下,都是提供上下文的,底层就是一个Map
Map<String Object> context;。
我们需要在Action中取得request请求参数“username”的值:
ActionContext context = ActionContext.getContext(); //上面这行是利用ActionContext类获得当前的actioncontext Map params = context.getParameters(); String username = (String) params.get(“username”);
以下是利用ActionContext分别访问request、session、application范围的属性。
ActionContext ctx=ActionContext.getContext();//获得ActionContext ctx.put("user","这是request范围的user");//request范围属性设置 ctx.getSession.put("user","这是session范围的user");//session范围属性设置 (String)ctx.getSeesion.get("user");//session范围属性设置 ctx.getApplication.put("user","这是application范围的user");//application范围属性设置 (String)ctx.getApplication.get("user");//application范围属性设置
(2)Action通过实现接口直接访问ServletAPI
虽然Struts2提供了ActionContext来访问ServletAPI,但这种访问不能直接获得ServletAPI实例。为了在Action中直接访问ServletAPI,Struts2提供了如下几个接口。
ServletContextAware:实现该接口的Action可以直接访问web应用的ServletContext实例。
ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。
ServletResponseAware:实现该接口的Action可以直接访问用户请求的HttpServletResponse实例。
(3)Action通过ServletActionContext工具类直接访问ServletAPI
为了能够直接访问servletAPI,Struts2还提供了一个工具类ServletActionContext。这个类包含了几个静态方法:
static PageContext getPageContext():取得web应用的PageContext对象
static HttpServletRequest getRequest():取得web应用的HttpServletRequest对象
static HttpServletResponse getResponse():取得web应用的HttpServletResponse对象
static ServletContext getServletContext():取得web应用的ServletContext对象
4、Action不能生成对服务器的响应,它只是业务控制器
虽然可以在Action类中获取HttpServletResponse,但如果希望通过HttpServletResponse来生成对服务器的响应是不可能的,因为Action只是业务控制器。
即
response.getWriter().println("hellon workd");
在servlet中会生成对客户端的响应,但在Action中无任何意义。
但response在Action中可以执行传递参数、写入cookie等操作。
5、Struts2的Action是多例的,即同一个Action类,不同的Session中都会产生独有一个Action的对象,防止竞争资源现象。
Servlet是单例的,即一个Servlet类在容器中只有一个实例;因为Jsp是Servlet的一种简易实现,所以Jsp也是单例的,其中声明的变量将在多个Session中通用,直至Servlet实例销毁。