Struts框架——struts.xml文件解析

struts.xml文件的作用

同web.xml文件类似,struts.xml文件也是很重要的项目配置文件。它配置了网页jsp与Action.java的交互方式(映射关系),使我们可以根据我们的http请求得到动态的结果。当然,还可以在此定义一些常量来修改struts的默认设置。
给出一份模板如下

<?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>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="default" namespace="/" extends="struts-default">
    <action name="user" class="com.action.UserAction">
        <result name="hello">hello.jsp</result>
        <result name="update">update.jsp</result>
    </action>
</package>
</struts>

定义文件头

<?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">
<include file="user.xml"> </include>

第一行是版本号和字符编码,第二行是文档类型声明,说明使用了何种dtd
如果你在IDE中设置好了XML Catalog,那么新建struts.xml文件时,这两行都会由IDE自动填写。
如果配置信息太多,一份xml文件太大,我们可以模块化的拆分出许多struts2.xml、struts3.xml之类的文件,最终使用<include file=" "></include> 导入到struts.xml文件中


根元素struts

文档中配置的所有元素都要以正确的顺序写在<struts> </struts> 之间。
由于版本问题,较新版本的struts2 默认不支持Action的动态引用,所以一般我们手动将它打开需要添加一行代码

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

包 package

从模板中也可以看出,包中存储的是动作Action和结果results的映射关系。我们可以根据需要创建多个package,每一个包中存储一些相关动作。
package有4个属性

属性 描述
name 包的唯一标识符,也就是起一个别名
extends 这个包从谁派生出来,默认情况下我们使用 struts-default 作为基础包
namespace 动作的唯一命名空间
abstract 抽象包,也就是虚类,只能被继承

动作 Action

<package name="default" extends="struts-default">
    <action name="login" class="com.action.LoginAction">
        <result type="redirectAction">
            <param name="actionName">userLogin</param>
            <param name="namespace">/user</param>
        </result>
        <result name="error" type="redirectAction">error</result>
    </action>
    <action name="error">
        <result>/error.jsp</result>
    </action>
</package>

<action> 标签下我们配置的是使用何种动作

属性 描述
name 为动作起的别名
class 实现动作的完整类名
method 默认执行execute,可以在此手动选择一种方法
converter 指定类型转换的类

一般我们在jsp页面通过<s:a action="name"> 这种方式来将动作绑定,点击后执行名为name的动作,动作的具体逻辑代码在**Action.java中编写,动作函数执行完后得到相应的结果和一个返回值。接着根据struts.xml文件中result的配置决定执行何种结果。
result 有许多属性,可以实现许多不同的返回结果,而且这些属性往往可以叠加使用

<result>/success.jsp</result>
//不做处理,直接跳转到success.jsp页面


<result name="success">/success.jsp</result>
//若action的返回值是success则跳转到success页面


<package name="default" extends="struts-default">
    <action name="login" class="com.action.LoginAction">
        <result type="redirectAction">
            <param name="actionName">userLogin</param>
            <param name="namespace">/user</param>
        </result>
    </action>
</package>
<package name="user" extends="struts-default" namespace="/user">
    <action name="userLogin" class="com.action.UserAction">
        <result>/hello.jsp</result>
    </action>
</package>
//跳转到另一个动作,通过param来详细说明
//userLogin是要跳转的动作的名字,/user是其命名空间
//这个动作userLogin同样要在struts.xml文件中注册

跳转到jsp页面之后,还可以通过<s:property value="属性"> 来获取之前Action类中的属性
要说明的是用<s:property> 获取request/session/application/attr/parameters这五个范围内的属性时,需要明确指定范围,也就是加上#号

<s:property value="#request.属性名" />

如果取ValueStack中的值时,是不需要带#的,可以直接取。

比如Action实例的属性值是存储在ValueStack中的,所以取Action中的属性是不需要带#号的

注:<s:property> 要正确获取Action中的属性值,必须在在action中设置了该属性的setter/getter方法,否则它不会被拦截器处理。


修改常量

struts2定义常量可以在多个文件中配置,sturts会按以下顺序进行搜索:

struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml

若在多个文件中配置同一个常量,则后一个的配置会覆盖前一个,我们一般将常量定义在struts.xml文件中
在struts 2中,配置文件需要配置不少常量,其中常用的如下:

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

struts.i18n.encoding:这个常量会作用于setCharacterEncoding方法和freemarker,velocity(这两种为模板技术)的输出,POST方式提交的数据,可以交由这个常量去设置它的编码格式。

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

struts.configuration.xml.reload:当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好打开,开发完后再关闭。

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

truts.serve.static.browserCache:设置浏览器是否缓存,默认值为true,开发阶段最好关闭。

<constant name="struts.devMode" value="true" />

struts.devMode:打印出更详细的错误信息,用于排错,主要用于开发模式,做好了再关闭,在copy sturts-blank中的stuts.xml中,里面有这常量。

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

struts.ui.theme:标签所使用的额外的自定义样式,不太实用,最好设置成simple,且一般都不用到struts 2的标签库。

<constant name="struts.objectFactory" value="spring"/>

struts.objectFactory:与spring继承时,指定由spring负责action对象的创建,在继承spring时,会用到这个常量.

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

struts.enable.DynamicMethodInvocation:该属性设置struts2是否支持动态方法调用,该属性的默认值是true,如果需要关闭动态方法调用,则可设置该属性为false,

注意:DMI的调用方式Struts2的文档不建议使用,且下载的struts2-2-X.jar中,它的sturts-blank中sturts.xml有这常量,并设其值为false。

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

struts.multipart.maxSize:设置上传文件的总大小限制,老杨说过它上传无法传太大的,可能是这里没设置。

注意:用HTML方式来上传是无法上传太大的文件,很不稳定,可以说失败率超高。解决方法是用socket编个插件用于上传,而不能直接依赖。

<constant name="struts.action.extension" value="do,lz" />

struts.action.extension:修改后缀名,默认是action,可以修改。若值有多个,可用逗号隔开,这对于常量的值都通用。

<constant name="struts.custom.i18n.resources" value="baseName" />

struts.custom.i18n.resources:用于配置国际化全局XML资源文件,须在指明该全局资源文件的基础名。

<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

struts.ognl.allowStaticMethodAccess:如其名,用于设置OGNL是否允许静态方法访问,默认为false

猜你喜欢

转载自blog.csdn.net/waveviewer/article/details/81536209