博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[struts]Expression * is undefined on line *, column * in template/simple/fielderror.ftl
阅读量:6689 次
发布时间:2019-06-25

本文共 3246 字,大约阅读时间需要 10 分钟。

错误现象:

用户注册处理

stuts.xml:

<action name="userInfo_*" class="com.indexofme.action.UserInfoAction" method="{1}">

<result name="success">/WEB-INF/view/success.jsp</result>
<result name="input">/WEB-INF/view/register.jsp</result>
<result name="error">/WEB-INF/view/register.jsp</result>
</action>

因为使用struts framework xml进行校验,如果直接请求userInfo_register.action将会返回input视图,并显示输入错误的提示信息(因为userInfo_registe.actionr与这个action匹配,com.indexofme.action.UserInfoAction将对这个请求进行处理,在此之前会根据同路径下的UserInfoAction-userInfo_register-validation.xml进行校验,校验失败返回input视图)。因此希望用户能通过请求userInfo_register.action 直接进入注册页面即input视图(相当于使用action做超链接进入注册页),并通过标签 <s:fielderror/>返回类型转换失败及校验失败提示信息。

(后记:直接进入注册页面,可以请求userInfo_input.action 。也可以单独配置action

<action name="userInfo_register">

<result>/WEB-INF/view/user/login.jsp</result>
</action>

不要再让com.indexofme.action.UserInfoAction对其进行处理,否则struts会提前调用与其对应的校验文件进行校验,然后不仅返回input视图还会在你并未曾输入情况下,返回输入错误的提示信息。)

但是请求userInfo_register.action 时出现错误。

1.使用<s:fielderror/>时出现异常:

FreeMarker template error!

Expression eKey is undefined on line 71, column 63 in template/simple/fielderror.ftl.The problematic instruction:----------==> assignment: eValue=fieldErrors[eKey] [on line 71, column 33 in template/simple/fielderror.ftl]----------Java backtrace for programmers:----------freemarker.core.InvalidReferenceException: Expression eKey is undefined on line 71, column 63 in template/simple/fielderror.ftl.

2.使用<s:fielderror>

         <s:param value="%{'email'}" />
         <s:param value="%{'pwd'}" />
</s:fielderror>

时异常:

FreeMarker template error!

Expression eKey is undefined on line 32, column 23 in template/simple/fielderror.ftl.The problematic instruction:----------==> if (eKey = fieldErrorFieldName) [on line 32, column 17 in template/simple/fielderror.ftl]----------Java backtrace for programmers:----------freemarker.core.InvalidReferenceException: Expression eKey is undefined on line 32, column 23 in template/simple/fielderror.ftl.
 

原因分析:

显然,把userInfo_register.action做超链接使用并用
显示相应提示的方案不可行。原因就是:第一次请求时因为并未填写过注册页,struts framework或者说freeMarker
获取不到表单域的标识,这个也许是struts framework或者说freeMarker在设计方面没有考虑全面。(这个结论是错误的,详情看下篇文章)
这个问题一定是和fieldError的key相关,可以从一般添加fieldError的方法addFieldError("register","pwd error")知道,一般情况下,应该是struts校验框架的freemarker
模版获取不到key值导致。查看一下validate.xml文件:

<validators>

  <validator type="requiredstring">

     <param name="fieldname">pwd</param>
     <message>password is required.</message>
</validator>

</validators>

这个是参照官网写的。有相应资源文件: pwd   注册密码。

改成:

<field name="pwd">

        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>${getText("regist_validate.pwd.require")}</message>
        </field-validator>
</field>

好使了,参看官方文档:

email validator的两种添加方法

myEmail
Must provide a valid email

<!-- Field Validator Syntax -->

Must provide a valid email

我自己估计是因为pwd与资源文件中的pwd重名,struts在找“pwd”时直接转换成“注册密码”,导致输出fieldError时找不到 key值,即“pwd”。

但是去掉pwd资源文件,仍然出现同样的错:Expression eKey is undefined on line 71, column 63 in template/simple/fielderror.ftl.。

不知原因,我用的是freemarker-2.3.16.jar

解决办法:

换成一种validator.xml的配置方法。
注意:也有可能是你的fieldname属性写错了,我经常把email写成mail。
 
 

转载于:https://www.cnblogs.com/wanping/archive/2012/10/04/2711575.html

你可能感兴趣的文章
iOS 获取IP
查看>>
设计模式(十一)代理模式Proxy(结构型)
查看>>
iOS开发之UITabBarController和UICollectionView的使用
查看>>
Saltstack windows可视化操作(十四)
查看>>
Spring Boot(五):Spring Boot的启动器Starter大全及自定义Starter
查看>>
C++ 知识回顾总结 -- 指针
查看>>
淘宝下单高并发解决方案
查看>>
ihttpmodule 接口以及使用
查看>>
将浮点数保持几位小数,尾数舍入的Format函数
查看>>
RBAC权限管理
查看>>
mac工具-解析json visualJSON和JSON Accelerator这两款工具
查看>>
关于C语言中二维数组传參————————【Badboy】
查看>>
HttpServletRequest对象小结
查看>>
Mybatis的@Options注解
查看>>
CC++定位崩溃代码行的方法
查看>>
[PAL规范]SAP HANA PAL K分值硬聚类算法K-Means编程规范KMEANS
查看>>
quartz CronExpression表达式
查看>>
变速变调原理与方法总结
查看>>
西风 West Wind Html帮助构建器
查看>>
杭电2053
查看>>