您的位置:首页 > 编程语言 > Java开发

Struts2工作原理及文件结构及其他

2017-10-08 16:18 417 查看

Myeclipse中创建Struts2的例子

先新建一个Web Project,取名为HelloWorld。如何添加Struts的东西呢?

HelloWorld->MyEclipse->Project Facets[Capabilities]->Install Apache Struts (2.x) Facet

web.xml文件中已经添加了一些东西,src中也添加了struts.xml

Struts2的工作原理及文件结构

工作原理

Struts2是在xml中配置一个过滤器,然后在外部项目启动的时候,过滤器就会生效。比如过滤器的name是struts2,然后路径是/*,代表所有路径,也就是说当所有的用户请求,都会经过这个过滤器。但是struts2会过滤一下自己相关的请求,比如说.action后缀的一个请求,它会进行过滤和处理,但是如果是.jsp或者是.xml结尾,就不会进行处理,直接放行。

配置的filter-class标签中的过滤器名称StrutsPrepareAndExecuteFilter,先把这个名称记住。

看一下这张图



首先用户通过HttpServletRequest将用户请求发送过来,经过一系列核心过滤器向下执行。ActionContextCleanUp是一个可选的过滤器,过滤器主要用于和其他的框架进行集成。

到达了FilterDiapatcher,这是Struts的一个核心过滤器,不过在web.xml中配置的并不是这个过滤器,而是StrutsPrepareAndExecuteFilter。这个FilterDiapatcher是Struts2的2.0到2.1.2版本的核心过滤器,最新的过滤器是StrutsPrepareAndExecuteFilter,从2.1.3就替代了前者。为什么FilterDiapatcher过滤器被替代了?

假如我们要写一个过滤器,我们往往会放在Struts2的顶端。假如我们需要在Struts拦截之后再去写过滤器,也就是说在执行Action之前写过滤器(在ActionProxy右边箭头的位置),FilterDiapatcher是做不到的。StrutsPrepareAndExecuteFilter可以做到在执行Action之前添加我们自己的过滤器。StrutsPrepareAndExecuteFilter分为两种,PrepareFilter和ExecuteFilter,可以在准备和执行之间,我们把自己的Filter添加完毕,这就是替换掉的用意。

用户请求经过一系列的过滤器会到达ActionMapper,只有.action后缀的才会到达这里去查找当前这个请求有没有一个指定的action,如果有,就会顺着箭头回到过滤器,走到ActionProxy。ActionProxy可以通过Configuration Manager去读struts.xml,来找到具体的action类。然后通过ActionProxy来创建一个action的反向实例。然后要经过一系列的拦截器(Interceptor),然后执行到Action,返回Result(一个字符串对象),其对应的就是我们的一个视图,包括JSP、FreeMarker、Velocity等,然后再经过一系列拦截器,然后通过HttpServletResponse返回到用户的实例,进行显示。

核心文件

1.web.xml

任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件。在JSP+JavaBean+Servlei这种普通的Model2中,就要把Servlet在xml文件中进行配置。只有配置在web.xml文件中Servlet才会被应用加载。

通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts2框架而言,需要加载StrutsPrepareAndExecuteFilter,只要Web应用负责加载StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter将会加载Struts2框架。

2.struts.xml

struts2的核心配置文件,在开发过程中利用率最高。

该文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。

struts.xml中包含的内容:

全局属性

用户请求和响应Action之间的对应关系

Action可能用到的参数和返回结果

各种拦截器的配置

3.struts.p
4000
roperties

struts2框架的全局属性文件,自动加载。位置和struts.xml放在一个路径下。

该文件包含很多key-value对

该文件可以不要,可以将常量在struts.xml文件中进行配置,使用constant元素进行标识

然后看一下struts.xml文件的整体架构。

<!DOCTYPE struts PUBLIC "http://struts.apache.org/dads/struts-2.0.dtd" >
这是所有xml文件的一个文档描述,这个dtd文件是来约束xml文件里可以有哪些标签,不可以有哪些标签
<struts>//这是开始标签

可以通过include来包含其他的文件,include节点是struts2组件化的方式,可以将每个功能模块独立到一个xml配置文件中,然后来引用。
<include file="struts-default.xml"></include>

package是一个核心的标签,提供了将多个Action组织为一个模块的方式
配置文件中可以有多个包,但是包名是唯一的
package可以扩展,当一个package扩展自另一个package是,该package会在本身配置的基础上加入扩展的package的配置,父package必须在子package之前配置
然后是包中的一些属性:
name:package名称
extends:继承的父package名称
abstract:设值package的属性为抽象的,抽象的package不能定义action,值true、false
namespace:定义package的命名空间,该命名空间影响到url的地址,例如此命名空间为/test那么访问的地址为http://localhost:8080/struts2/test/XX.action
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
<interceptors>
定义拦截器
name:拦截器名称
class:拦截器类路径
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
定义拦截器栈
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>
</interceptors>

定义默认的拦截器,每个Action都会自动引用,如果Action中引用了其他的拦截器,默认的拦截器无效
<default-interceptor-ref name="mystack"></default-interceptor-ref>

全局results配置,这里是全局的结果集,这里边定义好的内容,包里的action都可以引用
<global-results>
<result name="input">/error.jsp</result>
</global-results>

Action配置,每一个包里可以定义多个action
一个action可以被多次映射(只有action配置中的name不同)
name:action名称,想要访问它可以通过http://localhost:8080/ProjectName/test/hello.action
test是命名空间,如果没有(namespace的值为/)则不写
class:对应的类的路径
method:调用Action中的方法名
<action name="hello" class="com.kay.struts.Action.LoginAction">
引用拦截器
name:拦截器名称或拦截器栈的名称
<interceptor-ref name="timer"></interceptor-ref>

节点配置
name:result名称,和Action中返回的值相同
type:result类型,不写则选用superpackage的type,struts-default.xml中的默认为dispatcher
<result name="success" type="dispatcher">/talk.jsp</result>

参数设置
name:对应Action中的get/set方法
<param name="url">http://www.sina.com</param>
</action>
</package>

前边讲到struts.properties文件,如果想把里边属性放到struts.xml文件中,可以这么写,在包外定义常量
name和value对应key-value
<constant name="struts.i18n.reload" value="true"></constant>

</struts>


struts.properties文件中的key是定义好的,我们不能随意取名。key有很多,有一些常用的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts struts2.0