前言
有时我们需要用户进入首页时经过struts2filter
处理,但用户一般情况下只会输入主机名+web应用名,此时选择<default-action-ref>
来实现跳转(以CategoryAction
为例)
<default-action-ref name="Category_list"></default-action-ref>
<action name="Category_list" class="cn.xxxxx.action.CategoryAction" method="list">
<result>/index.jsp</result>
</action>
但并不能起作用,问题如下:
如果不输入Category_list
,理论上会默认跳转到Category_list
,执行相应的action并跳到指定jsp页面,但不幸的是:
如果在jsp页面加上<s:property value="[0]"/>
,结果如下:
[com.opensymphony.xwork2.DefaultTextProvider@1faa21d]
理论上,应该执行的action没有被创建出来,理想结果如下:
[cn.xxxxx.action.CategoryAction@13fa415, com.opensymphony.xwork2.DefaultTextProvider@1faa21d]
解决方法:
在web.xml
中,struts2filter
前面,加上(注:xxxxx可为任意不与其他action mapping的值,不能为空)
<welcome-file-list>
<welcome-file>XXXXX</welcome-file>
</welcome-file-list>
在struts.xml
中,加上
<default-action-ref name="Category_list"></default-action-ref>
<action name="Category_list" class="cn.xxxxx.action.CategoryAction" method="list">
<result>/index.jsp</result>
</action>
原理:
当用户输入例如主机名/web应用名时,web.xml
中配的welcome-file
会将uri替换为主机名/web应用名/XXXXX,struts2filter发现XXXXX无法mapping到任何action,便转交给<default-action-ref>
,如上name="Category_list"
,Category_list
将会被执行。
结论:
如果用户只输入主机名/web应用名,页面会跳转到web.xml
设置的默认首页,此时并不会经过struts2filter
处理,所以不会执行action。此时,需要自己配置welcome-file
(在struts2之前配置),在web应用下添加子路径,struts2filter
将会对该请求进行处理,如果没有mapping到任何action,则交给<default-action-ref>
处理,执行相应action。有老师讲的时候说<default-action-ref>
只是执行了jsp的跳转而没有执行action,经过实验分析这是不对的。
说这么多的目的只有两个:
1.提出问题解决方案;
2.希望大家学习的时候多动手做实验,老师也有失误的时候。