概述
1、 什么是Struts2
struts2是一个按MVC模式设计的Web层框架,其实它就是一个大大的filter,我们可以在web.xml文件中将符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理。
一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀; |
|
2、 Struts2体系结构图
|
对上图的理解:
当一个初始请求到达Servlet容器,它会经过一系统的标准filter链,这些Filter链包括ActionContextCleanUp filter:发挥作用当集成像SiteMesh Plugin一类的技术,接着FilterDispatcher被调用,通过轮询参考ActionMapper决定一个请求和一个Action相关连! 当 ActionMapper决定了一个Action的调用,FilterDispatcher委托ActionProxy控制, ActionProxy参考框架的配置文件管理,接着,ActionProxy生成一个ActionInvocation, 它负责命令执行,这样调用任何拦截器先于调用Action一Acion执行完毕.ActionInvocation负责查找适当的结果以和struts.xml中的action result code相比较,结果一般是调用一个在JSP或FreeMarker中绘制的模板!
对图中部分类的解释:
1、ActionMapper和ActionMapping Ø org.apache.struts2.dispatcher.mapper.ActionMapper接口 在HTTP请求和action调用请求之间提供了一个映射。当给定一个HTTP请求时,ActionMapper根据请求的URI来查找是否有对应的action调用: (1)如果有,则返回一个描述了action调用的ActionMapper; (2)如果没有匹配的action调用请求,则返回null. Struts2框架对该接口提供的默认实现是org.apache.struts2.dispatcher.mapper.DefaultActionMapper. Ø ActionMapping本质上是一个数据传输对象,它将Action类和要执行的方法的详细资料收集在一起。ActionMapping由org.apache.struts2.dispatcher.Dispatcher和用户各种接口组件使用。 ActionMapping的完整类名是org.apache.struts2.dispatcher.mapper.ActionMapping. 2、ActionProxy和ActionInvocation Ø ActionProxy在XWork中和真正的Action充当代理的角色,在通过框架框架执行Action的过程中,因为是使用代理而不是直接操纵对象,所以可以在代理中封装拦截器、result等额外代码。 Ø ActionProxy持有ActionInvocation对象。ActionInvocation代表了action执行的当前状态。它持有拦截器(按顺序 )、Action实例、结果映射(从结果码到Result实例的映射)和ActionContext. |
3、 开发Struts2最少需要的JAR包
struts2-core-2.x.x.jar :Struts 2框架的核心类库 xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建 ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性 freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写 commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。 commons-fileupload-1.2.1.jar :文件上传组件,2.1.6版本后必须加入此文件 |
在Struts的下载包中有一个struts2-blank-2.1.6.war的应用,只需要将其
WEB-INF/lib目录中的JAR拷贝到Project的WEB-INF/lib目录下便可,不可随便导入其它的JAR,应按需要导入,否则会出现异常。
4、 开发Struts2参数配置:
1、在struts2中,struts框架是通过Filter启动的。 在web.xml文件中配置FilterDispatcher。 <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> 在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件 2、默认的配置文件struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="net.cjava.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts> |
注意:StrutsPrepareAndExecuteFilter的功能:
l 是对struts2.0.x的FilterDispatcher的替代,结合了StrutsPrepareFilter与StrutsExecuteFilter的功能。
l 目前提供的文档对此类的描述甚少,可以参看FilterDispatcher的帮助文档来获得部分信息。
l 查询ActionMapper是否该拦截此请求,对于拦截的请求,此过滤器处理后,将终止过滤器链。如果其他Filter也要处理struts2拦截的请求,必须放在此Filter之前进行配置。
l 处理符合/struts/*路径格式的静态内容的访问请求
l 其他的Filter通常要位于StrutsPrepareAndExecuteFilter之前,如果其他的Filter要访问Struts的特性,这时候不要使用StrutsPrepareAndExecuteFilter ,而是使用StrutsPrepareFilter与StrutsExecuteFilter,并让其他的Filter应位于两者之间。
l 分析一个action路径的结果视图转发给另外一个action路径时为何不能直接使用dispatcher类型,而是要使用chain类型。
5、struts.xml详解
在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。
6、Action名称的搜索顺序
1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
2.首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action 时就会直接跑到默认namaspace的package里面去寻找action(默认的命名空间为空字符串“” ) ,如果在默认namaspace的package里面还寻找不到该action,页面提示找不到action
3.寻找namespace为/path1/path2的package,如果不存在这个package,则转至步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action
4.寻找namespace为/path1的package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action
5.寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在package中寻找不到action或者不存在这个package时,都会去默认namaspace的package里面寻找action,如果还是找不到,页面提示找不到action。 |
注意:注意区分默认名称空间与根(/)名称空间的区别,根(/)名称空间就是一个普通的名称空间,与”/user/admin”、”/user” 等一样,都是具体的包名,只是它是最顶层的名称空间,当struts在某个子名称空间对应的包中没有查找action时,不会再去根(/)名称空间中查找,但会在默认名称空间中继续查找该action。
7、Action配置中的各项默认值
1>如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute() 方法。
3>如果没有指定result的name属性,默认值为success。
注意:
虽然,理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下会采用以下二种方式对Action进得处理:
1>继承com.opensymphony.xwork2.ActionSupport
2>实现com.opensymphony.xwork2.Action
默认情况下:重载(Override)或覆写(Overload)其中的的
String execute() throws Exception
8、struts.xml中常量的配置详解
l 在根元素<struts>下可以使用constant子元素配置常量。
l 从strut2的核心jar包内的org.apache.struts2包下的default.properties文件中可以看到各个常量的注释说明
常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:
1、在struts.xml文件中配置常量
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
2、在struts.properties中配置常量
struts.action.extension=do
1、指定需要Struts 2处理的请求后缀 我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts 2只处理以.do为后缀的请求路径: <constant name="struts.action.extension" value="do"/> 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如: <constant name="struts.action.extension" value="do,go"/>
|
常量配置列表:
<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出 --> <constant name="struts.i18n.encoding" value="UTF-8"/> <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 --> <constant name="struts.action.extension" value="do"/> <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 --> <constant name="struts.serve.static.browserCache" value="false"/> <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.configuration.xml.reload" value="true"/> <!-- 开发模式下使用,这样可以打印出更详细的错误信息 --> <constant name="struts.devMode" value="true" /> <!-- 默认的视图主题 --> <constant name="struts.ui.theme" value="simple" /> <!– 与spring集成时,指定由spring负责action对象的创建 --> <constant name="struts.objectFactory" value="spring" /> <!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。 --> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!--上传文件的大小限制--> <constant name="struts.multipart.maxSize" value=“10701096"/>
|
最后
以上就是跳跃大地为你收集整理的struts2入门知识总结1的全部内容,希望文章能够帮你解决struts2入门知识总结1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复