Struts2 freemarker.template.TemplateModelException

本文记录了在使用Struts2进行客户端验证时遇到的一个freemarker模板异常,并提供了三种解决方案,包括去除验证属性、添加后缀及配置初始化Action。

今天抽出点时间复习了一下,李刚<<struts2权威指南>>,其中有一章,关于客户端验证的,按照书上步骤,最后报了一个freemarker.template.TemplateModelException: Method public java.util.List错误,
问题:在使用struts做客户端校验时,form中增加validate="true"属性,login.jsp代码如下:
<s:form action="userAddAction" method="post" validate="true">
<s:textfield name="username" key="username"></s:textfield>
<s:textfield name="firstname" key="firstname"></s:textfield>
<s:submit key="login"></s:submit>

</s:form>

截取部分错误代码

------------------------------------------------------

异常代码:

2011-8-9 17:14:33 freemarker.log.JDK14LoggerFactory$JDK14Logger error
严重:
Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@dd89f9
The problematic instruction:
----------
==> list tag.getValidators("${tagName}") as validator [on line 46, column 9 in template/xhtml/form-close-validate.ftl]
in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 25, column 1 in template/xhtml/form-close.ftl]
----------
Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@dd89f9
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)

………


------------------------------------------------------

本着内事不决问度娘,外事不决问谷歌的态度,发现有人说了
解决办法1:
去掉表单中的validate="true"属性,即取消了Struts2框架的客户端验证,改用它的服务端验证。这不是解决问题的办法,呵呵!
解决办法2:给action补充后缀.action即可解决这个问题,修改后的login.jsp代码如下:

<s:form action="userAddAction.action" method="post" validate="true">

<s:textfield name="username" key="username"></s:textfield> 

  <s:textfield name="firstname" key="firstname"></s:textfield> 

  <s:submit key="login"></s:submit> 

</s:form>

但是方法2会报另一个错误

2015-3-10 11:48:29 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: No configuration found for the specified action: 'userAddAction.action' in namespace: '/login'. Form action defaulting to 'action' attribute's literal value.
2015-3-10 11:48:29 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: No configuration found for the specified action: 'userAddAction.action' in namespace: '/login'. Form action defaulting to 'action' attribute's literal value.

解决办法3:在struts.xml中填加一个

<action name="loginInit" class="com.tungkong.action.RegistAction">
<result name="input">/login.jsp</result>
<result name="success">/success.jsp</result>
</action>

login.jsp代码如下:

<s:form action="userAddAction" method="post" validate="true">

<s:textfield name="username" key="username"></s:textfield> 

  <s:textfield name="firstname" key="firstname"></s:textfield> 

  <s:submit key="login"></s:submit> 

</s:form>


访问的时候写:http://localhost:8080/test/loginInit,这样就不会报错了,如果有更好的解决方式,欢迎大家讨论!



freemarker.template.Configuration是FreeMarker模板引擎的核心类之一,它负责配置和管理模板引擎的运行环境。下面是对freemarker.template.Configuration的介绍: 1. Configuration对象的创建:可以通过new关键字创建一个Configuration对象,也可以通过Configuration的静态方法getDefaultConfiguration()获取默认的Configuration对象。 2. 模板加载:Configuration对象可以用于加载模板文件。它提供了多种方法来加载模板,包括从文件系统、类路径、URL等位置加载模板。 3. 数据模型:Configuration对象还负责管理数据模型。数据模型是一个Java对象,用于在模板中填充数据。可以通过Configuration对象的setSharedVariable()方法设置全局共享的数据模型,也可以通过Template对象的createProcessingEnvironment()方法设置局部的数据模型。 4. 模板设置:Configuration对象可以设置一些模板相关的属性,例如编码方式、日期格式、数字格式等。可以通过Configuration对象的setXXX()方法来设置这些属性。 5. 模板缓存:Configuration对象还负责管理模板的缓存。它可以设置是否开启模板缓存、缓存的大小等属性。 6. 模板处理:最重要的功能是使用Configuration对象来处理模板。可以通过Configuration对象的getTemplate()方法获取一个Template对象,然后使用Template对象的process()方法将数据模型填充到模板中,生成最终的输出。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值