使用<include>标签重用配置文件
在Struts中提供了一个默认的strutsxml文件但如果packageactioninterceptors等配置比较多时都放到一个strutsxml文件不太容易维护因此就需要将strutsxml文件分成多个配置文件然后在strutsxml文件中使用<include>标签引用这些配置文件这样做的优点如下
结构更清晰更容易维护配置信息
配置文件可以复用如果在多个Web程序中都使用类似或相同的配置文件那么可以使用<include>标签来引用这些配置文件这样可以减少工作量
假设有一个配置文件文件名为newstrutsxml代码如下
<?xmlversion=encoding=UTF?>
<!DOCTYPEstrutsPUBLIC
//ApacheSoftwareFoundation//DTDStrutsConfiguration//EN
dtd>
<struts>
<packagename=demoextends=strutsdefault>
<actionname=submitclass=actionMoreSubmitAction>
<resultname=save>
/resultjsp
</result>
<resultname=print>
/resultjsp
</result>
</action>
</package>
</struts>
则strutsxml引用newstrutsxml文件的代码如下
<?xmlversion=encoding=UTF?>
<!DOCTYPEstrutsPUBLIC
//ApacheSoftwareFoundation//DTDStrutsConfiguration//EN
dtd>
<struts>
<includefile=newstrutsxml/>
<packagename=testextends=strutsdefault>
……
</package>
</struts>
大家要注意一下用<include>引用的xml文件也必须是完成的struts的配置实际上<include>在引用时是单独解析的xml文件而不是将被引用的文件插入到strutsxml文件中
action的别名
在默认情况下Struts会调用动作类的execute方法但有些时候我们需要在一个动作类中处理不同的动作也就是用户请求不同的动作时执行动作类中的不同的方法为了达到这个目的可以在<action>标签中通过method方法指定要指行的动作类的方法名并且需要为不同的动作起不同的名子(也称为别名)如下面代码所示
<?xmlversion=encoding=UTF?>
<!DOCTYPEstrutsPUBLIC
//ApacheSoftwareFoundation//DTDStrutsConfiguration//EN
dtd>
<struts>
<packagename=demoextends=strutsdefault>
<actionname=testclass=actionMyAction>
……
</action>
<actionname=myclass=actionMyActionmethod=my>
……
</action>
</package>
</struts>
上面代码的两个动作的class属性都指向同一个类name为这个类起了两个动作别名test和my在动作my中使用了method属性指定要要运行的方法名为my
在MyAction类中必须要有my方法代码如下
packageaction;
importcomopensymphonyxworkActionSupport;
publicclassMyActionextendsActionSupport
{
……
publicStringexecute()throwsException
{
//处理test动作的代码
}
publicStringmy()throwsException
{
//处理my动作的代码
}
……
}
除了在strutsxml中配置别名还可以通过请求参数来描述指定动作(并不需要在strutsxml中配置)请求参数的格式如下
//localhost/contextPath/actionName!methodaction
关于通过请求指定动作的详细内容请参阅笔者写的《Struts教程处理一个form多个submit》
为action指定参数
在struts中还可以为action指定一个或多个参数大家还记着strutsx是如何设置的action参数不? 在strutsx中可以使用<action>标签的parameter属性为其指定一个action参数如果要指定多个就只能通过逗号()或其他的分隔符将不同的参数隔开而在struts中可以通过<param>标签指定任意多个参数代码如下
<actionname=submitclass=actionMyAction>
<paramname=param>value</param>
<paramname=param>value</param>
<resultname=save>
/resultjsp
</result>
……
</action>
当然在action中读这些参数也非常简单只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法)如下面的代码将读取param和param参数的值
packageaction;
importcomopensymphonyxworkActionSupport;
publicclassMyActionextendsActionSupport
{
privateStringparam;
privateStringparam;
publicStringexecute()throwsException
{
Systemoutprintln(param+param);
}
publicvoidsetParam(Stringparam)
{
thisparam=param;
}
publicvoidsetParam(Stringparam)
{
thisparam=param;
}
……
}
当struts在调用execute之前param和param的值就已经是相应参数的值了因此在execute方法中可以直接使用param和param
选择result类型
在默认时标签的type属性值是dispatcher(实际上就是转发forward)开发人员可以根据自己的需要指定不同的类型如redirectstream等如下面代码所示
<result name=savetype=redirect>
/resultjsp
</result>
这此resulttype可以在strutscorejar包或struts源代码中的strutsdefaultxml文件中找到在这个文件中找到<resulttypes>标签所有的resulttype都在里面定义了代码如下
<resulttypes>
<resulttypename=chainclass=comopensymphonyxworkActionChainResult/>
<resulttypename=dispatcherclass=orgapachestrutsdispatcherServletDis
patcherResultdefault=true/>
<resulttypename=freemarkerclass=orgapachestrutsviewsfreemarkerFree
markerResult/>
<resulttypename=httpheaderclass=orgapachestrutsdispatcherHttpHeader
Result/>
<resulttypename=redirectclass=orgapachestrutsdispatcherServletRedir
ectResult/>
<resulttypename=redirectActionclass=orgapachestrutsdispatcherServle
tActionRedirectResult/>
<resulttypename=streamclass=orgapachestrutsdispatcherStreamResult/
>
<resulttypename=velocityclass=orgapachestrutsdispatcherVelocityResu
lt/>
<resulttypename=xsltclass=orgapachestrutsviewsxsltXSLTResult/>
<resulttypename=plainTextclass=orgapachestrutsdispatcherPlainTextRe
sult/>
<!DeprecatednameformscheduledforremovalinStrutsThecamelCaseversionsa
repreferredSeeww>
<resulttypename=redirectactionclass=orgapachestrutsdispatcherServl
etActionRedirectResult/>
<resulttypename=plaintextclass=orgapachestrutsdispatcherPlainTextRe
sult/>
</resulttypes>
全局result
有很多时候一个<result>初很多<action>使用这时可以使用<globalresults>标签来定义全局的<result>代码如下
<struts>
<packagename=demoextends=strutsdefault>
<globalresults>
<resultname=print>/resultjsp</result>
</globalresults>
<actionname=submitclass=actionMoreSubmitAction>
……
</action>
<actionname=myclass=actionMoreSubmitActionmethod=my>
……
</action>
</package>
</struts>
如果<action>中没有相应的<result>Struts就会使用全局的<result>