struts2 + freemarker 当类型转换失败后的转向问题

我在使用strut2进行学习,使用freemarker作为view层的技术。我在编写一个简单的人员增加例子时,需要从数据库中获得目前科室的列表和准备其他数据后,action返回success,然后在配置文件中将result转向为ftl文件,都没有问题。但是当我输入信息不合法后,会自动进行类型转换,然后失败,会返回input执行结果,然后按照我的设定回执行我希望的action,但是我发现struts并不会执行我的action,而是直接调用我设置action中的结果input中的ftl,这样根本就不会调用准备数据的那一段代码,导致ftl的显示失败。
struts.xml

<action name="addPersonEntry" class="personAct" method="addPersonEntry">
<result name="input" type="freemarker">/person/addPersonEntry.ftl</result>
</action>

<action name="addPerson" class="personAct" method="addPerson">
<result name="success" type="chain">listPerson</result>
<result name="input" type="chain">addPersonEntry</result>
</action>

aciont

public String addPersonEntry() {
//获得科室列表,给ftl文件准备数据
depts = service.getAllDept(new HqlConfig("zorder" , true));
return INPUT;
}

public String addPerson() {
service.savePerson(person);
ActionContext.getContext().put("runMsg", "人员增加成功!" + person.toString());
return SUCCESS;
}

不知道我表达清楚没有,我看的例子都是出现类型转换错误后,转向到jsp,这样在jsp中利用DAO或service来获得数据,但是我使用ftl作为view层,只有在action准备数据后才能正确显示,我奇怪的是为什么strtus框架不执行action而直接就到<action>...下的result进行匹配。不知道是不是的我的使用方法有问题,希望得到大家的帮助,在google上搜索很久,未果。

第一次调用addPersonEntry.action能正常显示输入页面,输入不合法的内容后,按照我的设定
<result name="input" type="chain">addPersonEntry</result> 
应该跳转到addPersonEntry.action,然后执行我的public String addPersonEntry() 方法。根据此方法的返回值"input"将数据装载到ftl模板中,但实际情况是public String addPersonEntry() 方法没有执行,直接去按照

<result name="input" type="freemarker">/person/addPersonEntry.ftl</result>
去显示ftl的内容,由于没有数据出错。
如果我正确的输入信息,并且返回input,struts就会按照设定的去执行action中的方法。
如果type="chain" 修改为 "redirectAction" 是会执行action中的方法,但是前一个request中的内容都没有了。
我的环境是struts2.0.14 , freemarker 2.3.8 。

自己再顶,发现了一些链接和我说的问题一样,但还不知道如何解决。
http://www.iteye.com/problems/9889和
http://topic.csdn.net/u/20090305/12/14d84d77-6219-4967-a89e-2b782da49755.html?seed=133833307

自问自答吧。问题解决。还是自己对struts的理解不够。
代码都没有问题,只是使用的缺省的拦截器导致的结果。由于出现错误后,使用chain转向到默认的拦截器去处理。
经过测试发现是默认的拦截器加载的太多,我将workflow拦截器去除后就工作正常了。一想也对,当输入端有action Error后,经过拦截器后发现就自动跳转,并不去执行自己的action。这应该也是拦截器的原理吧。
修改后的struts.xml如下。
<action name="index" class="indexAction">
<interceptor-ref name="chain" />
<interceptor-ref name="basicStack" />
<result name="success" type="freemarker">...</result>
<result name="input" type="freemarker">...</result>
</action>
完整的解决过程,希望能对其他人有所帮助,自立才能自强。

感谢Winking赟钦网友的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值