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