Struts2:入门

Struts2的处理流程

Struts2:入门_第1张图片

StrutsPrepareAndExecuteFilterStruts2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts 2框架处理,否则Struts 2框架将略过该请求的处理,是不是就交给服务器处理,这样就可以让servletstruts一起工作了。当请求转入Struts 2框架处理时会先经过一系列的拦截器,然后再到ActionStruts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。在加入spring之后,就可以配置了

大概的处理流程

1、客户端初始化一个指向Servlet容器的请求;

  2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

  3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;

  4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

  5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

  6、ActionProxy创建一个ActionInvocation的实例。

  7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。


org.apache.struts2. components

该包封装视图组件,Struts2在视图组件上有了很大加强,不仅增加了组件的属性个数,更新增了几个非常有用的组件,如updownselect、doubleselect、datetimepicker、token、tree等。

 另外,Struts2可视化视图组件开始支持主题(theme),缺省情况下,使用自带的缺省主题,如果要自定义页面效果,需要将组件的theme属性设置为simple。

org.apache.struts2. config

该包定义与配置相关的接口和类。实际上,工程中的xml和properties文件的读取和解析都是由WebWork完成的,Struts只做了少量的工作。

org.apache.struts2.dispatcher

Struts2的核心包,最重要的类都放在该包中。

org.apache.struts2.impl

该包只定义了3个类,他们是StrutsActionProxy、StrutsActionProxyFactory、StrutsObjectFactory,这三个类都是对xwork的扩展。

org.apache.struts2.interceptor

定义内置的截拦器。

org.apache.struts2.servlet

用HttpServletRequest相关方法实现principalproxy接口。

org.apache.struts2.util

实用包。

org.apache.struts2.views

提供freemarker、jsp、velocity等不同类型的页面呈现。

 

 根目录下的5个文件说明:

StrutsStatics

Struts常数。常数可以用来获取或设置对象从行动中或其他集合。

RequestUtils

请求处理程序类。此类只有一个方法getServletPath,作用检索当前请求的servlet路径

ServletActionContext

网站的特定的上下文信息

StrutsConstants

该类提供了框架配置键的中心位置用于存储和检索配置设置。

StrutsException

通用运行时异常类


Struts2与Struts1比较,主要struts2表现出以下优点

1> 在软件设计上Struts2没有像struts1那样跟Servlet APIstruts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet APIstruts APIStruts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。这种无侵入式设计就使得测试非常容易。

public class OrderListActionextends Action {

  public ActionForward execute(ActionMapping mapping, ActionForm form,

  HttpServletRequest request, HttpServletResponse response)

  throws Exception {

  }

}

2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。拦截器机制类似于servlet中的过滤器,但是更好的地方在于struts2的拦截器是可配置的,可以针对某一个action具体配置。

3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。struts2提供了action范围、包范围的类型转换器,还提供了针对属性的转换器和类型的转换器。

4> Struts2提供支持多种表现层技术,如:JSPfreeMarkerVelocity/、XSLT、JSON、PDF

5>Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。Struts2不仅提供了针对指定方法校验的机制,还提供了总体的校验方法invalidate,甚至更好的基于配置文件的校验机制。

6> 提供了全局范围、包范围和Action范围的国际化资源文件管理实现


开发Struts2程序最少需要的JAR

struts2-core-2.x.x.jar :Struts 2框架的核心类库

xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建

ognl-2.6.x.jar :对象图导航语言(ObjectGraph Navigation Language),struts2框架通过其读写对象的属性

freemarker-2.3.x.jar :Struts 2UI标签的模板使用FreeMarker编写

commons-logging-1.x.x.jar :ASF出品的日志包,Struts2框架使用这个日志包来支持Log4JJDK1.4+的日志记录。

commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后必须加入此文件

好像还有一个叫javasist.jar的文件,这个文件是OGNL依赖的文件

Struts2由中央控制器来提供分发功能,这个控制器是由filter实现的

<filter>

   <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

 <!-- 自从Struts 2.1.3以后,下面的FilterDispatcher已经标注为过时

   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>-->

</filter>

<filter-mapping>

   <filter-name>struts2</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

StrutsPrepareAndExecuteFilterinit()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。

注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件


Struts.xml配置中的包介绍

 <package name="test" namespace="/test"extends="struts-default">

  <actionname="helloworld" class="cn.xsy.action.HelloWorldAction" method="execute">

  <resultname="success">/WEB-INF/page/hello.jsp</result>

  </action>

 </package>

struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

配置包时必须指定name属性做继承使用,该name属性值可以任意取名,但必须唯一,他不对应java的类包,如果其他包要继承该包,必须通过该属性进行引用包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action的路径的一部分减少重复代码,如访问上面例子的Action,访问路径为:/test/helloworld.action namespace属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“”(空字符串

通常每个包都应该继承struts-default包,因为Struts2很多核心的功能都是拦截器来实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了struts-default才能使用struts2提供的核心功能。struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载 struts-default.xml文件。

包还可以通过 abstract=“true” 定义为抽象包,抽象包中不能包含 action


Action名称的搜索顺序层级搜索】{若不匹配命名空间就往下一层级去找;若匹配命名空间就去找,找不到就在默认的命名空间找}


1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action

2.首先寻找namespace/path1/path2/path3package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package中寻找名字为testaction,当在该package下寻找不到action时就会直接跑到默认namaspacepackage里面去寻找action(默认的命名空间为空字符串“”或者不指定,如果在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

3.寻找namespace/path1/path2package,如果不存在这个package,则转至步骤4;如果存在这个package,则在这个package中寻找名字为testaction,当在该package中寻找不到action时就会直接跑到默认namaspacepackage里面去找名字为testaction,在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

4.寻找namespace/path1package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找名字为testaction,当在该package中寻找不到action时就会直接跑到默认namaspacepackage里面去找名字为testaction,在默认namaspacepackage里面还寻找不到该action,页面提示找不到action

5.寻找namespace/package,如果存在这个package,在这个package中寻找名字为testaction,当在package中寻找不到action或者不存在这个package时,都会去默认namaspacepackage里面寻找action,如果还是找不到,页面提示找不到action


Action配置中的各项默认值仅需要通过action转发的时候有用,因为有时候为了安全需要把jsp等放入WEB-INFO目录就不能直接访问了

<package name="itcast" namespace="/test"extends="struts-default">

        <action name="helloworld" class="cn.xsy.action.HelloWorldAction" method="execute">

  <resultname="success">/WEB-INF/page/hello.jsp</result>

        </action>

 </package>

1>如果没有为action指定class,默认是ActionSupport

2>如果没有为action指定method,默认执行action中的execute()方法。

3>如果没有指定resultname属性,默认值为success


Action的属性注入值


Struts2Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供setter方法。

public class HelloWorldAction{

  privateString savePath;

  publicString getSavePath() {

  returnsavePath;

  }

  publicvoid setSavePath(StringsavePath) {

  this.savePath =savePath;

  }

      ......

}

<package name="test" namespace="/test"extends="struts-default">

  <actionname="helloworld" class="cn.xsy.action.HelloWorldAction" >

  <param name="savePath">/images</param>

  <resultname="success">/WEB-INF/page/hello.jsp</result>

  </action>

</package>

上面通过 < param > 节点为 action savePath 属性注入 “/images”

你可能感兴趣的:(Struts2:入门)