再读Struts2之二:环境搭建以及介绍
配置:
pom.xml中追加如下依赖。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.14</version> </dependency>
web.xml中追加过滤器。
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> --> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这里有点儿说明,大部分人已经知道:
Since Struts 2.1.3, use {@link org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter} instead
or {@link org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter}
and {@link org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter}
struts.properties和struts.xml文件的处理
1 struts.properties文件
这个文件的修改是选择性的。因为在struts2-core.jar中有一个default.properties文件,已经对全局的struts2项目有一个控制。如果我们想要修改这种默认配置的话,就需要在源目录下创建一个struts.properties文件了。常被修改的也就下面几个。
struts.i18n.reload = true——激活重新载入国际化文件的功能
struts.devMode = true ——激活开发模式,以提供更全面的调试功能。
struts.configuration.xml.reload = true——激活重新载入XML配置文件的功能(这是为Action准备的),当文件被修改以后,就不需要重新载入Servlet容器中的整个Web应用了。
struts.url.http.port = 8080——配置服务器运行的端口号(所有生成的URL都会被正确创建)
2 struts.xml
这个文件中配置的基本上就是
必须要在“struts.xml”中进行配置的信息只有全局结果、异常处理和自定义的拦截器堆栈。
尽管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.3.dtd"> // dtd指定
<struts>是struts.xml中的根标签,其它的标签都被它包含。
- <constant name="struts.devMode" value="true" /> // 以后专门介绍
- <bean /> // 以后专门介绍
- <package></package>
- <include />
<include file="some-config.xml"/>
它的file文件需要有根struts.xml一样的目录结果。也就是说也是一个struts配置文件。一般情况下,是按照系统的模块来划分的。
其实有些文件是struts框架会给我们自动include(导入)的,这就是struts-default.xml和struts-plugin.xml两个文件。
struts-default.xml提供的是Struts2的核心配置信息。它是struts-core.jar中存在的一个文件。
struts-plugin.xml则描述了特定插件的配置信息。每个插件的JAR中都要有一个struts-plugin.xml文件,该文件会在系统启动时被装载。例如:struts2-dojo-plugin.jar中就有一个。
<package … />
标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。
这个标签的属性包括有:name, extends, namespace, abstract等。
name,开发人员为这个Package指定的唯一的名字。
extends,当前这个Package所继承的Package的名字,被继承的Package中所有的配置信息(包括Action的配置)都可以在新的命名空间下,新的Package里面被使用。
namespace,如果两个不同的Package,其命名空间分别为“package1”和“package2”,那么URL差不多就是
“/myWebApp/package1/my.action” 和“/myWebApp/package2/my.action”这样的形式。基本上就是用于区分具有相同action名称,但是功能不一样的情况。
abstract,如果这个属性的值为“true”,那么这个Package就只是一个配置信息的组合,也就无法通过Package的名字来访问其中配置的Action。
在大多数情况下,我们都应该继承“struts-default.xml”配置文件中的“strust-default”Package,但是如果你想要使用插件的话,那就另当别论了。你必须要参考插件的说明文档来确认所应当继承的父 Package。
package里面会设置interceptors(拦截器链),result-types(结果类型)和action(最重要的)。
interceptors里面会有:
1
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
2 <interceptor-stack name="basicStack"> // 有时间补充
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging"/></interceptor-stack>
result-types //以后补充
action 有几个属性,name, class, method, convertor
- name,example: test 对应着URL中的test.action。 其中.action是在struts.properties文件中配置的。可以修改:struts.action.extension。
- class,example: home.study.action.SomeAction。 那么就会去SomeAction类中调用其execute方法。 这个方法名称也可以设置。
- method, example: methodInstead。 那么就回去SomeAction类中调用其methodInstead方法。
- convertor, // 不了解,以后补充。
对应着上面的说明,应该有如下的action代码了。
<action name="test" class="home.study.action.SomeAction" method="execute"> <result>view.jsp</result> <result name="error">error.jsp</result> </action>
可以看到有多个result,但是有一个没有name,这个对应着返回值"success",指定的话就对应着name的值了。而中间的view.jsp或者error.jsp就是所谓的回显画面了。
其实result还有另外一个属性,就是type这个就是所谓的结果类型。type的默认属性为“dispatcher”,大多数情况下都可以满足了。看struts-default.xml会有:
<result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> </result-types>
所以说,我们的result的type可以有以上那么多选择。但是怎么用呢?// 以后专门讲。
都代表什么呢?可以去这里看看。
实际上我们还有另外四种方式:稍后验证。。。
1. Action方法返回一个字符串——这个返回的字符串与“struts.xml”的一个action配置相匹配。例子中已经演示这一种方式。
2. 使用Code behind插件 ——当使用这个插件的时候,它会将Action的名字和Action返回的结果字符串进行连接来得到视图模板。比如说,如果URL是“/adduser.action”,而Action返回了“success”,那么要渲染的页面就是“/adduser-success.jsp” 。更多信息请参见http://struts.apache.org/2.x/docs/codebehind-plugin.html。
3. 使用 @Result注解—— action类可以用@Results 和@Result注解来标注多个不同的结果。Action所返回的字符串需要与所注解的结果之一相匹配。
4. 方法返回一个Result类的实例——Action不必一定要返回一个字符串,它可以返回一个Result类的实例,该实例应当是已经配置好可使用的。
Action要完成一些操作之后,才能返回结果。因此它们需要访问多种类型的对象——业务对象,数据访问对象或者其他资源。
Struts2使用了名为依赖注入的方式来注入这些对象。Struts2使用setter注入来实现。
Struts2推荐的依赖注入框架是Spring框架,并通过插件对它进行配置。