配置文件struts.xml和web.xml。
其实要使Struts2可以工作,配置很简单,套模板就好了。而且基本与版本无关。
如,只要struts2需要的基本jar包已经引入,那么直接配置一下web.xml和struts.xml文件。
web.xml中包含:
<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.xml的简单加载struts2核心驱动(过滤器),没有其它配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--//基础配置
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.reload" value="true" />
<constant name="struts.configuration.xml.reload" value="true" ></constant>
-->
<package name="main" namespace="/" extends="struts-default">
<!--//异常配置
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings> -->
</package>
</struts>
只要满足以上格式即可。
好了,现在具体来说一说xml文件的配置项具体含义。
首先,web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
定义filter,此处加载struts2过滤器。
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
定义web服务器通知项,即,符合“/*”的URL请求都交给命名为“struts2”的过滤器(即,org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)处理。
web.xml配置以上两个属性节点就可以加载struts2框架了。
然后,struts.xml,这个配置项比较多。
形如:<constant name="" value=""/>
<constantname="struts.i18n.reload"value="true"/>
配置是否在每次HTTP请求到达时都重新加载资源文件,看到“i18n”我以为是编码或者国际化配置呢,默认为false,生产阶段也就需要false。设置为true之后,web服务器(tomcat)会缓存,启动是会抛出“couldn't clear tomcat cache”。
<constantname="struts.devMode"value="true"/>
开发阶段配置,在web服务器出错时会尽量打印出来,一样也是生产阶段设置为false,避免后台结构被人发现。
<constant name="struts.configuration.xml.reload"value="true"/>
<constantname="struts.custom.i18n.resources"value="globalMessages"/>
<constantname="struts.action.extension"value="action,,"/>
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.serve.static.browserCache " value="true" />
<constant name="struts.configuration" value="org.apache.struts2.config.DefaultConfiguration"/>
<constant name="struts.enable.SlashesInActionNames" value="false"/>
<constant name="struts.ui.theme" value="xhtml"/>
<constant name="struts.ui.templateDir" value="template"/>
<constant name="struts.ui.templateSuffix" value="ftl"/>
<constant name="struts.url.http.port" value="80"/>
<constant name="struts.url.includeParams" value="none|get|all"/>
<constant name="struts.dispatcher.parametersWorkaround" value="false"/>
<constant name="struts.locale" value="zh_CN"/>
<constant name="struts.multipart.maxSize" value="2097152"/>
<constant name="struts.multipart.parser" value="cos"/>
<constantname="struts.convention.result.path"value="/"/>
<constantname="struts.configuration.xml.reload"value="true"/>
此配置之后,所有访问都需要全路径。
大概就是以上的简单配置,哇,太多了。还有一些可能到网站关闭那天也用不到的配置,就没有列出来了。
然后,
在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。
<package name="" namespace="" extends="">
</package>
namespace:命名空间,影响访问的action请求路径,如namespace="/user",package下有login,register等action,那么访问login时需要/user/login来访问。
Struts2中如果没有为某个包指定命名空间,该包使用默认的命名空间,默认的命名空间总是""。
extends:继承,需要继承struts的struts-default。当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括action、result、interceptor等。
由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。
还有一个abstract属性,用于声明package属性为抽象包,然后其它package继承此package即可。
<action name="" method="" class="">
<result name="" type=""></result>
</action>
action:
name: 请求名称,加上namespace就是请求路径。
method: 接到请求后执行的方法,默认执行execute(此处表示没有method属性)。
class: 处理方法所在的类,默认为Action(如果没有配置此属性)。
还有一个不常用的属性,converter,Action的类型转换器。
result:
name: Action返回结果,默认为SUCCESS("success").
type: 返回的类型,默认为dispatcher。
action中可以使用通配符。
请求通配符和返回结果均可使用,如,
<action name="user_*_*" method="user{2}" class="com.gopain.{1}">
<result name="type_{2}">/{2}_page.jsp</result>
</action>
此处只是举例,站点不宜这样配置请求。但是对于action的name配置很实用,不要奢望一个action配置完整个站点(虽然也可以实现,而且对于访问没有太多影响),十分不利于管理。
再列几个常用配置:
<default-action-ref name="index"/>
当我们在配置Action的时候,如果没有为某个Action指定具体的class值时,系统将自动引用<default-class-ref>标签中所指定的类。在Struts2框架中,系统默认的class为ActionSupport,该配置我们可以在xwork的核心包下的xwork-default.xml文件中找到。
<default-action-ref>
如果在请求一个没有定义过的Action资源时,系统就会抛出404错误。这种错误不可避免,但这样的页面并不友好。我们可以使用<default-action-ref>来指定一个默认的Action,如果系统没有找到指定的Action,就会指定来调用这个默认的Action。
<default-interceptor-ref>
<default-interceptor-refname="defaultStack"/>
具体配置项很多,用到再追加也可以。