1.首先来认识一下几个文件:
①web.xml :位于WEB-INF下。需自行创建。每一个web应用程序都应该有一个web.xml,它就像web应用程序的一本使用说明书,告诉服务器程序(如:tomcat) 该如何使用web 应用程序。
②struts-default.xml:位于struts2-core-2.XXX.jar的根目录下。定义了struts2默认配置。一般不要修改。包括result-type、拦截器和名为struts-default的package。通常每个包都应当继承struts-defauult包。struts2的众多核心功能都是由Interceptor(拦截器)实现的,Interceptor是struts2的基石,而在struts-default.xml中定义了这些Interceptor。可以这么说:只有继承了strut-default我们才能使用struts2的核心功能。
③struts-plugin.xml:位于struts2-XXX-pluin-2.X.XX.jar的根目录下。一般不要修改。用于配置插件使用的文件。可以用它来方便的加入一些特定的功能。它定义了一个package继承自struts-default,可以说struts-pluin.xml是struts-default.xml的补充。
④struts.xml:位于WEB-INF\classes目录下。主要用于配置页面的访问的路径。通常需要定义一个package,继承自struts-default,这样就拥有了struts-default的所有配置,从而很大程度的减轻了struts.xml的配置量。
⑤default.properties:位于struts2-core-2.XXX.jar中的org.
apache.struts2包中。这是一个属性文件,以key=value的形式存储配置信息,然后由struts2读取。它定义了struts2框架的默认配置。由struts2事先定义好了,一般不要修改。
⑥struts.properties:可有可无。用时需自行创建。可以用于配置struts,例如:struts.action.extension 属性用于指定访问action的后缀名,多个后缀名之间用英文逗号(,)隔开
struts.action.extension=do,,
这句话指定了action的后缀名为do或者为空,则我们想访问TestAction的url为http://localhost:8080/webapp/TestAction.do
或者http://localhost:8080/webapp/TestAction
所有配置信息都可以struts.xml编写,使用
<constant name=”key” value=”value”/>
加载顺序
default.properties -->struts.xml -->struts.properties
若三个文件中存在重复的属性,则后加载的会覆盖之前加载的。
详细参数配置请查阅:
http://candy-code.iteye.com/blog/1442335
2.一般的配置步骤
①web.xml
关键在于Filter(过滤器)的配置,/*表示匹配web app根目录下的所有内容,即过滤所有的内容然后交给StrutsPrepareAndExecuteFilter去处理,只有这样我们才能真正使用struts2
这里需注意两点:
1’ struts2 2.0.x 至2.1.2版本使用的过滤器是FilterDispatcher,自2.1.3版本StrutsPrepareAndExecuteFilter替代了FilterDispatcher
2’ 如果在url中只写web app名,则访问的<welcome-file>,此时不会被过滤器过滤
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
② 将所需类库考入WEB-INF\lib下
struts完整版类库都在lib目录下,一般情况下我们并不需要所有的类库。我们只需要选择其中的一部分,然而我们在开发之前并不能确定到底需要哪些类库。最简单的方法是将struts\apps下的struts2-blank.war解压开,然后将其WEB-INF\lib目录下的所有jar file都拷入你的应用程序的lib目录下,这些类是最基本最常用的类库。
所需基本库文件有:(不同版本略有差别,以2.3.1.2版本为例)
struts2-core-2.3.1.2.jar -->struts2核心类库
xwork-core-2.3.1.2.jar -->xwork核心类库
ognl-3.0.4.jar -->OGNL表达式类库
commons-io-2.0.1.jar -->输入输出
freemarker-2.3.18.jar-->
freemaker支持类库
asm-3.3.jar 、asm-commons-3.3.jar、asm-tree-3.3.jar、
commons-fileupload-1.2.2.jar
commons-lang-2.5.jar、javassist-3.11.0.GA.jar
③struts.xml
关键点在于定义一个package并继承struts-default.
【package 属性】
name:必选属性。package的名字,用于区别不同的package
namespace:访问路径,允许形式有 /、/XX、/XX/、/XX/xx
extends:父package的名字
【action属性】
name:必选属性。action的访问名。访问形式为:
actionName. extension
extension(后缀名)在default.properties中定义为action或空
class:可选属性。指定action对应的类,若不指定,默认
com.opensymphony.xwork2.ActionSupport
method:可选。指定访问的action的方法。默认为execute()
【result属性】
name:用于区别多个result。它与Action的返回值对应。struts会根据result返回的字符串找到同名的result的标签,从而确定要访问的页面。默认为success
type:页面跳转的类型。有chain、redirect、dispatcher、redirectAction等
示例:
<?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="default" namespace="/" extends="struts-default"> <default-action-ref name="index"></default-action-ref> <action name="index" class="com.jnmc.unique.MyAction"> <result>/index.jsp</result> </action> </package> </struts>
3.struts.xml配置补充
①默认action的配置:当找不到指定的页面的时,默认访问指定页
<default-action-ref name="index"></default-action-ref>
name:action的名字
②全局结果集:被同一个包内所有的action所共享的结果集
<global-results> <result name="error">/error.jsp</result> </global-results>
③异常映射:当action抛出异常时,会被struts的拦截器捕捉到。然后根据异常映射跳转到指定的action,来处理异常。
result:目的action的name
exception:指定异常的类型
<exception-mapping result="error" exception="java.lang.Exception"/>
④全局异常映射:
被同一个package下的所有action共享。一般与全局结果集配合使用。当然也可以在每一个action分别指定处理exception的action。
<global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception"/> </global-exception-mappings>
⑤wildcard(通配符):
通配符的使用可以大大降低配置量
* : 匹配任意长度的字符串(字符串之间不能有空格)
{n}: 代指之前上文中出现的第n个*
<action name="user_*" class="com.jnmc.unique.User{1}Action"> <result>/user_{1}.jsp</result> </action>
则在浏览器中敲
http://hostname:port/webapp/user_Add,会访问UserAaddAction,若返回success,则显示user_add.jsp页面
⑥Interceptor(拦截器):
在struts-default.xml配置了一大堆Interceptor,建议阅读
一下struts-default.xml。
先介绍一个概念:Interceptor Stack(拦截器堆)
它是一个Interceptor链表,其中有顺序的存储了多个Interceptor。它们都存储在堆内存中。
在action标签对中可以添加拦截器的配置。因为在struts-default.xml有如下配置:
<default-interceptor-ref name="defaultStack"/>
所以我们在不指定Interceptor的情况下会使用defaultStack中定义的多个Interceptor.若指定,则会覆盖struts-default.xml中的配置。建议这么做:
<action name="index" class="com.jnmc.unique.MyAction1"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="chain"/> </action>
这样就将多个拦截器加入了拦截器链表中,执行顺序与添加顺序相同。
注意:chain是struts-default.xml中配置的单个Interceptor。
⑦自定义拦截器
只需创建一个类(不妨叫:MyInterceptor)继承自AbstractInterceptor或者实现Interceptor接口,然后在struts.xml的package标签对中配置:
示例:
<interceptors> <interceptor name="timeInterceptor" class="com.jnmc.struts2.interceptor.TimeInterceptor"/> </interceptors>
然后在action中指定它。(方法前面已经讲过了)
---------------------------更多关于struts的细节,我会陆续贴出