SSH2 开启客户端校验出错
本帖最后由 papaxiong7658 于 2012-11-18 16:15:39 编辑 SSH2框架,弄了一个客户注册的例子,注册时输入的信息进行校验,不使用客户端校验时没有问题,一开启客户端校验,进入regist.jsp页面时就报FreeMarker template error!错误。这是怎么回事啊?
详细的错误信息:
FreeMarker template 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@af7ec0
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@af7ec0
at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)
at freemarker.core.Environment.visit(Environment.java:417)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.Environment.include(Environment.java:1483)
at freemarker.core.Include.accept(Include.java:169)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:210)
at freemarker.core.Environment.process(Environment.java:190)
at freemarker.template.Template.process(Template.java:237)
at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:157)
at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
at org.apache.struts2.components.UIBean.end(UIBean.java:513)
at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
at org.apache.jsp.regist_jsp._jspx_meth_s_005fform_005f0(regist_jsp.java:247)
at org.apache.jsp.regist_jsp._jspService(regist_jsp.java:151)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves
以下是代码:
regist.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>用户注册-交换网</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/css.css"/>
</head>
<body>
<%@ include file="header.jsp" %>
<div class = "bodymain">
<s:fielderror/>
<div>
<s:form name="registForm" method="post" action="registPro" validate="true">
<ul>
<s:textfield name="customer.username" cssClass="textfieldcss" label="用户名"></s:textfield>
<br>
<s:password name="customer.password" cssClass="textfieldcss" label="密码"></s:password>
<br>
<s:password name="rPassword" cssClass="textfieldcss" label="重复密码"></s:password>
<br>
<s:textfield name="customer.email" cssClass="textfieldcss" label="E-mail(电子邮箱)"></s:textfield>
</ul>
<br>
<s:submit value="注册" cssClass="buttoncssleft"></s:submit>
</s:form>
</div>
</div>
</body>
</html>
RegistAction.java:
package org.crazyit.app.action;
import com.opensymphony.xwork2.Action;
import org.crazyit.app.domain.*;
import org.crazyit.app.service.*;
/**
* Description:
* <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
* <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class RegistAction
implements Action
{
//下面是用于封装用户请求参数的属性
private Person person;
//用于封装处理结果的属性
private String tip;
//系统所用的业务逻辑组件
private LeeService leeService;
//设置注入业务逻辑组件所必需的setter方法
public void setLeeService(LeeService leeService)
{
this.leeService = leeService;
}
//person属性的setter和getter方法
public void setPerson(Person person)
{
this.person = person;
}
public Person getPerson()
{
return this.person;
}
//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}
//处理用户请求的execute方法
public String execute()
throws Exception
{
//调用业务逻辑组件的regist方法来处理请求
if (leeService.regist(person))
{
setTip("哈哈,注册成功!");
return SUCCESS;
}
else
{
return ERROR;
}
}
}
RegistAction-Validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<!-- 校验文件的根元素 -->
<validators>
<field name="customer.username">
<!-- 指定name属性必须满足必填规则 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入用户名</message>
</field-validator>
<!-- 指定name属性必须匹配正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{2,16})]]></param>
<message>您输入的用户名只能是字母和数字
,且长度必须在2到16之间</message>
</field-validator>
</field>
<field name="customer.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{2,16})]]></param>
<message>您输入的密码只能是字母和数字
,且长度必须在2到16之间</message>
</field-validator>
</field>
<field name="rPassword">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(rPassword==customer.password)]]></param>
<message>两次输入密码必须相同</message>
</field-validator>
</field>
<field name="customer.email">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入E-mail</message>
</field-validator>
<field-validator type="email">
<message>E-mail必须是一个有效的E-mail地址</message>
</field-validator>
</field>
</validators>
struts.xml里的代码片段:
<action name="registPro" class="com.kevin.action.RegistAction">
<!-- 为两个逻辑视图配置视图页面 -->
<result name="success">/WEB-INF/content/usercenter.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="input">/regist.jsp</result>
</action>
[解决办法]
已经解决。要把jsp页面通过action访问才能使用struts2的客户端校验