当前位置: 代码迷 >> Web前端 >> struts2 web使用配置详解
  详细解决方案

struts2 web使用配置详解

热度:248   发布时间:2012-08-22 09:50:35.0
struts2 web应用配置详解

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的细节,我会陆续贴出
  相关解决方案