一、Struts 2应用的开发步骤
1、定义核心Filter拦截用户请求
由于Web应用是基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要在web.xml中配置该框架的核心Servlet 或 Filter,这样才可以让该框架介入Web应用中。
2、如果需要以POST方式提交请求 ,则定义包含表单数据的JSP页面。如果仅仅只是以GET方式发送请求,则无须经过这一步
3、定义处理用户请求的Action类
这一步也是所有MVC框架中必不可少的,因为这个Action就是MVC中的C,也就是控制器,该控制器负责调用Model里的方法来处理请求。
这里需要重点备注一下:MVC框架的底层机制是:核心Servlet 或 Filter接收到用户请求后,通常会对用户请求进行简单预处理,例如解析、封装参数等,然后通过反射来创建Action实例,并调用Action的指定方法来处理用户请求。当Servlet 或 Filter拦截用户请求后,可以利用下面两种解决方案来知道创建哪个Action的实例:
1)利用配置文件:例如配置login.action对应使用LoginAction类。这就可以让MVC框架知道创建哪个Action的实例了。如下图,该配置片段指定如果用户请求URL为main,则使用com.crm.web.IndexAction来处理
2)利用约定:这种用法有可能受到Rails框架的启发,例如约定xxx.action总是对应XxxAction类。如果核心控制器收到regist.action请求后,将会调用RegistAction类来处理用户请求
4、配置Action
这个在3里面有讲到了,配置Action就是指定哪个请求对应用哪个Action进行处理,从而让核心控制器根据该配置来创建合适的Action实例,并调用该Action的业务控制方法。
5、配置处理结果和物理视图资源之间的对应关系
物理视图资源也就是视图页面。当Action处理用户请求结束后,通常会返回一个处理结果(通常使用简单的字符串就可以了,如:“success”),可以认为认为该名称就是逻辑视图名,这个逻辑视图名需要和指定物理视图资源关联才有价值。所以还需要配置处理结果之间的对应关系。
比如上图中,如果返回的结果是success,则我们重定义Action(redirectAction)到namespace为”/index”的action名为main的mainAction上
6、编写视图资源
这里实际就是编写视图页面
二、Struts 2 中Action 访问Servlet API
Struts 2的Action没有与任何Servlet API 耦合,这是Struts 2的一个改良之处,由于Action类不再与Servlet API耦合,从而能更轻松的测试该Action。
但对于Web应用的控制器而言,不访问Servlet API几乎是不可能的。struts 2 框架提供了一种更轻松的方式访问Servlet API。Web应用中通常需要访问的Servlet API就是HttpServletRequest、HttpSession和ServletContext,这三个接口分别代表JSP内置对象中的request、session和appliaction。
Struts 2 提供了一个ActionContext 类,Struts 2 的 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对象,该Map对象模拟了HttpSession实例。
6)void setApplication(Map application):直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名、属性值。
7)void SetSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名、属性值。