1

1.Struts2简介

框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某个领域的问题。本质上来讲,框架只是一个jar包,其本质上是对jdk的扩展。

最佳实践:

  • 始终保证程序的可读性、可维护性和可扩展性

  • Simple is Beauty

  • 尽可能使用面向对象的观点进行编程

  • 减少依赖,消除耦合

图片描述

struts2是一个mvc框架,提供了Controller和View模块,可以结合其他技术提供Model。Struts2非常容易扩展,框架提供的每个类是依赖于接口。如果有需要,非常容易添加适合自己的类和应用。

1.1.Struts2简单运行图

将上面的框架图进行简单的抽象,可得到下面简单的运行示意流图。
图片描述

  1. 外部发送request请求

  2. Filter Dispatcher检查这个request,然后确定相应的Action

  3. Interceptor(拦截器)相应的进行运用功能,例如workflow,数据验证,文件上传等。

  4. 执行Action中的方法,默认执行execute方法

  5. 返回结果同样会通过一系列拦截器,然后由指定的表现形式返回,比如HTML,jsp或字面值

2.配置文件

struts利用xml配置文件初始化一系列的相关资源,这个底层实现技术属于依赖注入。会通过xml配置文件初始化的资源包括:拦截器Interceptor,Action类及Results。

2.1 管理元素

2.1.1 Bean配置

bean元素有一个必须的属性class,定义了某个Java class被创建或调用。
bean的功能:
1.对象注入:可以通过框架的container创建,然后注入到内部框架对象里,一般伴随着type属性,告诉container这个对象实现implement了某个接口。
2.值注入:拥有value被注入到自身的静态方法中,好让不创建对象的容器接受框架参数。对象使用值注入必须要定义静态方法。

属性 必需 描述
class yes bean class的名称
type no class实现的主要的java接口
name no bean的唯一名字, 与其他bean独立
scope no bean的范围,必许是【default、singleton、request、Session、thread】中一个
static no 是否注入static方法,当type指定后一定为false
optional no bean是否是强制可选的

示例

<struts>
 

      <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" />
       
      ... 

 
</struts>

2.1.2 Constant常量配置

constant通过定义关键的设置,提供一个简单的方式去修改框架或定义行为,来达到定制struts。
constant有两个主要功能点:
1.用来重载设置,例如上传文件的最大值,struts是否在“devMode”等。
2.指定哪一个bean去实现。
constant可以在多个文件中定义,默认的搜索顺序如下:
1.struts-default.xml
2.struts-plugin.xml
3.struts.xml
4.struts.properties
5.web.xml
如果后面某个值已被定义,则前面的值会被覆盖。

属性 必需 描述
value yes contant的值
name yes contatn的名字
    Constant Example (struts.xml)
<struts>
 
  <constant name="struts.devMode" value="true" />
 
  ... 
 
</struts>

在 struts.properties文件中,每一条实例都会被初始化成constant。

  Constant Example (struts.properties)
struts.devMode = true

在web.xml中,FilterDispatcher的初始化参数会被当做constant载入。

  <web-app id="WebApp_9" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
 
    ...
 
</web-app>

2.1.3 packages配置

packages是一种把action,result,result types,Interceptor和Interceptor stack分成一个逻辑配置单元,非常类似于对象,可以被extend,并被重写。
Packages有一个必须的属性name,对之后引用这个package是非常关键的。
图片描述

<struts>  
    <package name="employee" extends="struts-default, json-default" namespace="/employee">   
    <action name="list" method="list" class="org.apache.struts2.showcase.action.EmployeeAction" >        
        <result>/empmanager/listEmployees.jsp</result>    
        <result type="json">           
            <param name="root">employees</param>        
        </result>  
    </action>   
</package>
</struts>

2.1.4 namespace配置

namespace避免action的名字冲突,将action的配置在细分成逻辑模块,每个都有特点的前缀。默认的namespace为“”,而root namespace为“/”。namespace的工作方式:

/a/b/c.action
先在b下搜索c.action,若b中没有,则回退到a下搜索,若a还没有,继续向上回退。但回退只是单向性,不能向a、或b的兄弟目录进行搜索。

2.1.5 include配置

为了防止struts.xml配置文件过大,可以进行拆分成多个子文件,每个都必须和struts.xml报错相同的格式,包括DOCTYPE,然后利用include引用起来。

2.2 请求处理元素

2.2.1 Interceptor Configuration

interceptor 允许开发者自定义代码,然后可以在action方法执行前或执行后运行。拦截器是非常强大的工具,可以用来验证数据,属性封装,安全处理,log及在运行时剖析代码使用。
interceptor是由java class实现的,所以每个interceptor都有相应的class name,为了使用方便,每个interceptor拥有一个简单的唯一的名字,如果多个interceptor放在一起,可以使用stack。

<interceptors>
  <interceptor name="security" class="com.company.security.SecurityInterceptor"/>
  <interceptor-stack name="secureStack">
    <interceptor-ref name="security"/>
    <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
</interceptors>

多数应用可以定义默认的interceptor stack,如下:

<default-interceptor-ref name="secureStack"/>

对于每个action也可以定义自己的stack,但是默认的interceptor就无法启用,所以一般讲struts-default.xml中默认的interceptor stack添加到自定义的interceptor中。

<action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter">
    <result name="success">...</result>
    <interceptor-ref name="defaultComponentStack"/>
</action>

2.2.2 action配置

action映像是struts框架的最基本的工作单位,本质上讲,action关联了一个标识符和一个handle class。当request匹配action name的时候,框架会使利用mapping来决定如何处理这个请求。在action mapping中,可以包含一系列exception处理,一个拦截器栈,一系列result types等,但是只有name是必须的,其他都可以在package的范围内提供。
如果需要访问时指定action name的后缀名,则需要在struts.xml文件中配置

    <constant name="struts.enable.SlashesInActionNames" value="true"\>

默认的处理方法在Action接口中被定义

    //Action interface
    public interface Action {
        public String execute() throws Exception;
    }

但是实现Action接口是可选的,如果Action中没有实现execute,框架会通过反射也寻找一个execute方法。除此之外,可以通过配置文件的method,指定Action中的方法。

 <action name="delete" class="example.CrudAction" method="delete">

如果既没有execute 也没有其他指定的方法,框架会抛出异常。

拦截器与过滤器:
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。


流云
323 声望15 粉丝