java EE Web开发应用框架之_Struts2
1、 MVC和Struts2
MVC是一种设计模式,它将一个完整的Web应用程序分为模型层(Model)、视图层(View)和控制层(Controller)三层架构。这样,同一个应用程序就可以使用不同的表现形式。抽象的说法就是将应用程序的业务模型独立于界面构成。
MVC的三层架构中各层实现的功能:
模型层:软件所处理问题逻辑在独立于外在显示内容和形式的情况下的内在抽象。
视图层:把表示模型数据及逻辑关系和状态信息,以特定的形式展示给用户。
控制层:协调模型和视图的部件,视图层通过控制器调用模型层的业务逻辑。
Struts2框架是一个基于MVC架构的框架,在Struts2中使用动作(action)、结果(result)和过滤分配器(FilterDispatch)实现了MVC中的三个关注点模型、视图和控制器。
Struts2工作流程:
Struts2通过在web.xml中配置的过滤器过滤客户请求并传递给Struts2的拦截器栈,拦截器最终会将请求传递给动作(Action),动作处理完成请求后会返回一个逻辑视图(result),由此逻辑视图寻找相应的物理视图。Struts2提供了很多的内建拦截器,他让我们在动作接收到请求之前和之后都能够有机会处理客户请求,追加相应的工作流。
2、 部署Struts2框架
Struts2框架下载
将下载的文件解压后使用eclipse将解压的文件中的struts2-blank.war导入
在src目录下编写Action类
打开项目中src目录下的struts.xml文件,这是Struts2框架的主配置文件:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="http://www.cnblogs.com/leejie/archive/2012/07/28/false" />
<constant name="struts.devMode" value="http://www.cnblogs.com/leejie/archive/2012/07/28/false" />
<include file="example.xml"/>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
<!-- Add packages here -->
</struts>
打开项目中WebContent\WEB-INF目录下的web.xml,看到比以前的没有导入框架的项目中的文件中多了几行配置,这是用来配置Struts2的核心拦截器:
<filter>
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、 Action的生命周期
Action的生命周期指的是Struts2是如何管理Action的初始化和消亡的,测试过程发现,Struts2没接受到一个请求就会初始化一个Action对象来服务该请求,Action的消亡是有Struts2自动管理的。(注意:如果使用Spring管理Action时,Action的生命周期与Spring中配置的Bean的作用范围有关)
4、 Action中访问Web对象
Struts2是使用过滤器处理请求的,框架的使用让我们只关注业务和动作时,我们还需要考虑下动作(Action)是如何使用Web中的对象
Struts2提供了两种方法访问web对象:
a) 通过ActionContext
获取Session对象ActionContext.getContext().getSession()
获取Application对象ActionContext.getContext().getApplication()
获取Request对象ServletActionContext.getRequest()
获取Response对象ServletActionContext.getResponse()
获取所有页面请求参数ActionContext.getContext().getParameters()
b) 通过实现*Aware接口
例如如果要获取Session对象,就让Action类实现SessionAware接口,实现void setSession(Map session)方法
5、 ValueStack和OGNL
Struts2中的值栈(valueStack)是一个存放对象的堆栈,对象以Map的方式存储在该堆栈中,几乎所有的Struts2的操作都会与值栈打交道。
值栈中的对象的四种类型:
临时对象:
程序执行过程中有容器自动创建并存储在值栈中。临时对象并不固定,会随应用程序的执行而改变,应用程序执行结束,临时对象被清空。
模型对象:
该对象仅在Action使用模型驱动方式传值的时候被用到。拦截器会自动将应用了模型驱动的Action中的模型对象放在值栈中。
Action对象:
每一个Action请求到来的时候,容器都会创建一个Action的对象并存入值栈。
命名对象:
主要包括Servlet作用范围内相关的对象信息,如Request、Session、Application等。
6、 Struts2拦截器、数据转换器和国际化
Struts2拦截器
在请求到达动作之前,如果要想获取当请求的数据进行处理怎么办?在Struts2框架中为我们提供了非常好用的拦截器。
Struts2拦截器让开发人员能够在请求到达动作之前和之后对请求数据进行预处理和后加工。
Struts2提供了丰富的内建拦截器,下面介绍如何使用内建拦截器追加工作流,对于如何实现自定义拦截器这里就不叙述了。
首先部署拦截器:在struts.xml文件的package元素下添加如下配置
<interceptors>
<interceptorname=”interceptorName” class=”InterceptorClass”/>
</interceptors>
在struts.xml文件的action元素下配置
<interceptor-ref name=”interceptorName” />
当然这只是配置了单个的拦截器,如果要配置多个拦截器的话可以使用拦截器栈