当前位置: 首页 > 工具软件 > xmlweb > 使用案例 >

[Struts2] 配置文件struts.xml和web.xml详解

裴经义
2023-12-01

 配置文件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核心驱动(过滤器),没有其它配置。
然后添加一个struts.xml到源码的根目录下:

<?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"/>

 配置文件修改后是否自动重新部署到服务器,开发阶段需要设置为true,否则需要不时重启服务器。

<constantname="struts.custom.i18n.resources"value="globalMessages"/>

 加载国际化配置文件,多个配置文件则用“,”隔开。

<constantname="struts.action.extension"value="action,,"/>

 默认请求后缀,多个使用","隔开。

<constant name="struts.i18n.encoding" value="UTF-8" />

指定Web应用的默认编码集,相当于调用 HttpServletRequest的setCharacterEncoding方法。

<constant name="struts.serve.static.browserCache " value="true" /> 

设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭,方便调试。

<constant name="struts.configuration" value="org.apache.struts2.config.DefaultConfiguration"/> 

指定加载struts2配置文件管理器,默认为org.apache.struts2.config.DefaultConfiguration,开发者可以自定义配置文件管理器,该类要实现Configuration接口,可以自动加载struts2配置文件。

<constant name="struts.enable.SlashesInActionNames" value="false"/> 

该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true,尽可能不配置这个,很麻烦。

<constant name="struts.ui.theme" value="xhtml"/> 

该属性指定视图标签默认的视图主题,该属性的默认值是xhtml,可以为simple,xhtml或ajax。

<constant name="struts.ui.templateDir" value="template"/> 

该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。

<constant name="struts.ui.templateSuffix" value="ftl"/> 

该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、 Velocity和JSP模板,模板使用即可,一本就是ftl后缀,没有什么影响。

<constant name="struts.url.http.port" value="80"/> 

该属性指定Web应用所在的监听端口。该属性通常没有太大的用处,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口,此处的端口和web服务器的端口不一样,但是不冲突,不在同一级别,不用担心,后台服务太多可以这样配置,但是不是集群大概也用不到了。

<constant name="struts.url.includeParams" value="none|get|all"/> 

该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。

<constant name="struts.dispatcher.parametersWorkaround" value="false"/> 

对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。

<constant name="struts.locale" value="zh_CN"/> 

默认的国际化地区信息。

<constant name="struts.multipart.maxSize" value="2097152"/> 

multipart请求信息的最大尺寸(文件上传用,该属性指定Struts 2文件上传中整个请求内容允许的最大字节数)。

<constant name="struts.multipart.parser" value="cos"/> 

该属性指定处理 MIME-type multipart/form-data,文件上传(cos、pell、jakarta)专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上传用)。


<constantname="struts.convention.result.path"value="/"/> 

定义视图资源的根目录

<constantname="struts.configuration.xml.reload"value="true"/>

此配置之后,所有访问都需要全路径。


大概就是以上的简单配置,哇,太多了。还有一些可能到网站关闭那天也用不到的配置,就没有列出来了。


然后,

在Struts2框架中是通过包来管理action、result、interceptorinterceptor-stack等配置信息的。

<package name="" namespace="" extends="">
</package>

name: package的标示符,唯一标记一个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>

假如请求为,user_UserAction_login(不考虑namespace),其中 action中{1} 为UserAction,{2}为login,此请求会执行com.gopain.UserAction$userlogin().如果返回值为”type_login“,则会跳转到login_page.jsp页面。

此处只是举例,站点不宜这样配置请求。但是对于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>

该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息。事实上我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml中找到相关配置:
<default-interceptor-refname="defaultStack"/>

在实际开发过程中,如果我们有特殊的需求是可以改变默认拦截器配置的。当时一旦更改这个配置,“defaultStack”将不再被引用,需要手动追加。


具体配置项很多,用到再追加也可以。

 类似资料: