`
mmt
  • 浏览: 1311 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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赟钦网友的帮助。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics