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有很多,有一些常用的
相关文章推荐
- Struts2的工作原理及文件结构(一)
- Struts2工作原理及文件结构
- Struts2的工作原理及文件结构
- struts2学习第三天----struts.xml文件导入其他的.xml文件
- 结构和其他数据形式 结构保存到文件中
- Struts基础之工作原理和文件结构
- Excel文件的导入导出实战(1)--基于Struts2的web项目结构搭建
- 3.4.2: Struts2包含其他配置文件
- struts2中struts.xml和web.xml文件解析及工作原理
- struts2中struts.xml和web.xml文件解析及工作原理
- php总结1 ——php简介、工作原理、运行环境、文件构成、语法结构、注释
- 使用struts2在页面局部位置上传文件,不影响其他文本框数据
- Maven 文件中结构 / 其他
- Struts2(2):Struts2中配置常量的3种方式及包含其他配置文件
- struts2中struts.xml和web.xml文件解析及工作原理
- 【Struts2学习笔记-4】包含其他配置文件
- oracle物理结构(六)--其他文件
- struts2的工作原理和相关文件的介绍
- Struts2入门:框架结构、处理步骤、配置文件
- struts2中struts.xml和web.xml文件解析及工作原理