Struts2的表单验证很方便,直接用标签就可以实现,无论是本地还是服务器文件,真感觉是方便到家了。
最近实验本地验证,但是出了很多问题,写在这里跟大家分享一下。
如何来用struts2的表单验证,大家可以去看专门的教程去。在这里我看的是李刚写的<Struts2权威指南>.按它上面写的步骤一步一步搭建起来之后,出了很多问题。首先有几点是要注意的:
比如类似下面的警告,就是action和namespace没有设置正确引起的。
- 需要在页面的Head里加入<s:head/>,这里默认的是用xhtml这种theme,注意不能是simple
- <s:form..>标签里需要指定action和namespace,而不能直接把包的路径写在Action属性里面,否则一定会出错的。
- Action里面指定的Action的名,不要加后缀
- 如果要使用ajax主题,则还需要引入dwr这个包,Struts2.1.8版本中集成的是1.1.1这个版本,但是我在网上找到的最新的是version 3,没有去研究它们是不是一个版本,但是我还是喜欢用更新的。、
下面是的我实验工程的相关代码:
/validation/src/cn/ijser/Actions/RegistAction.java
1: package cn.ijser.Actions;
2:
3: import java.util.Date;
4:
5: import com.opensymphony.xwork2.ActionSupport;
6:
7: public class RegistAction extends ActionSupport {
8:
9: private static final long serialVersionUID = 1L;
10: private String name;
11: private String pass;
12: private int age;
13: private Date birth;
14:
15: public String execute() {
16: System.out.println("in action");
17: return SUCCESS;
18: }
19: public String getName() {
20: return name;
21: }
22: public void setName(String name) {
23: this.name = name;
24: }
25: public String getPass() {
26: return pass;
27: }
28: public void setPass(String pass) {
29: this.pass = pass;
30: }
31: public int getAge() {
32: return age;
33: }
34: public void setAge(int age) {
35: this.age = age;
36: }
37: public Date getBirth() {
38: return birth;
39: }
40: public void setBirth(Date birth) {
41: this.birth = birth;
42: }
43:
44:
45: }
/validation/src/cn/ijser/Actions/RegistAction-validation.xml
1: <;?xml version="1.0" encoding="utf-8"?>
2: <;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
3: "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">;
4: <validators>
5: <;field name="name">
6: <;field-validator type="requiredstring">
7: <;param name="trim">true</param>
8: <;message>必须输入名字</message>
9: <;/field-validator>
10:
11: <;field-validator type="regex">
12: <;param name="expression"><![CDATA[(/w{4,25})]]></param>
13: <;message>用户名只能是字母和数字,且长度在4-25之间</message>
14: <;/field-validator>
15: <;/field>
16: <;field name="pass">
17: <;field-validator type="requiredstring">
18: <;param name="trim">true</param>
19: <;message>必须输入密码</message>
20: <;/field-validator>
21: <;field-validator type="regex">
22: <;param name="expression"><![CDATA[(/w{4,25})]]></param>
23: <;message>密码只能是字母和数字,且长度在4-25之间</message>
24: <;/field-validator>
25: <;/field>
26: <;field name="age">
27: <;field-validator type="int">
28: <;param name="min">0</param>
29: <;param name="max">150</param>
30: <;message>年纪在1-25之间 </message>
31: <;/field-validator>
32: <;/field>
33: <;field name="birth">
34: <;field-validator type="date">
35: <;param name="min">1900-01-01</param>
36: <;param name="max">2050-02-21</param>
37: <;message>年纪在</message>
38: <;/field-validator>
39: <;/field>
40: </validators>
/validation/src/struts.xml
1: <;?xml version="1.0" encoding="UTF-8" ?>
2: <;!DOCTYPE struts PUBLIC
3: "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4: "http://struts.apache.org/dtds/struts-2.0.dtd">;
5: <struts>
6: <;constant name="struts.devMode" value="true" />
7: <;constant name="struts.multipart.saveDir" value="/upload" />
8: <;constant name="struts.multipart.maxSize" value="259715200" />
9: <;constant name="struts.action.extension" value="do,action" />
10:
11: <;package name="default" namespace="/" extends="struts-default">
12: <;action name="index">
13: <;result name="success">/index.jsp</result>
14: <;/action>
15:
16: <;/package>
17: <;package name="admin" namespace="/admin" extends="struts-default">
18: <;action name="regist" class="cn.ijser.Actions.RegistAction">
19: <;result>/index.jsp</result>
20: <;result name="input">/index.jsp</result>
21: <;/action>
22: <;/package>
23: <;/struts>
/validation/WebRoot/index.jsp
1: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2: <%@ taglib uri="/struts-tags" prefix="s" %>
3: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4: <html>
5: <head>
6: <s:head/>
7: <title>My JSP 'index.jsp' starting page</title>
8: <meta http-equiv="pragma" content="no-cache">
9: <meta http-equiv="cache-control" content="no-cache">
10: <meta http-equiv="expires" content="0">
11: </head>
12:
13: <body>
14:
15: <s:form action="regist" namespace="/admin" validate="true">
16: <s:textfield name="name" label="用户名" value="yourname"></s:textfield>
17: <br/>
18: <s:textfield name="pass" label="密 码" value="abc"></s:textfield>
19: <br/>
20: <s:textfield name="age" label="年龄" value="20"></s:textfield>
21: <br/>
22: <s:textfield name="birth" label="生日" value="1987-10-10"></s:textfield>
23: <br/>
24: <s:submit></s:submit>
25: </s:form>
26:
27: </body>
28: </html>
上面这段代码没有什么问题,但是要注意访问的时候,如果是直接访问index.jsp,就会出现下面的错误:
通过查看本地的页面源代码可以看出,javascript本地验证代码并没有生成,而是生成了一堆错误,是空指针错误。
只有通过Action来访问jsp页面才可以正常生成js验证脚本代码,比如:http://localhost:8080/validation/index.do. 这一点官方的文档里并没有说明。
正常的本地验证,页面不会跳转,也就是说,浏览器地址栏的内容不会改变。