使用Struts2验证框架实现输入校验
来源:互联网 发布:高性能并发网络框架 编辑:程序博客网 时间:2024/06/12 01:50
学习了《Struts2权威指南》中关于Struts2的输入校验,自己动手测试了一把,也遇到一些问题,在这里记录一下。直接看代码:
login.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <%@taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title></title>
- </head>
- <body>
- <!-- 使用Struts标签 通过配置form表单validate="true"开启客户端校验-->
- <s:form action="login" validate="true">
- <s:textfield name="username" label="用户名"></s:textfield>
- <s:password name="password" label="密 码"></s:password>
- <s:submit value="提交"></s:submit>
- </s:form>
- </body>
- </html>
LoginAction.java
- package com.petrochina.action.system;
- import com.opensymphony.xwork2.ActionSupport;
- public class LoginAction extends ActionSupport {
- private static final long serialVersionUID = 1L;
- private String username;//用户名
- private String password;//密码
- @Override
- public String execute() throws Exception {
- if (getUsername().equals("admin") && getPassword().equals("admin")) {
- return SUCCESS;
- } else {
- return INPUT;
- }
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
校验文件LoginAction-validation.xml,其生成路径要和LoginAction.class在一起.
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- xwork校验器的DTD信息 -->
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <!-- 字段校验器,校验username属性 -->
- <field name="username">
- <!-- 配置必填字符串校验器 -->
- <field-validator type="requiredstring">
- <!-- 通过key指定国际化资源文件 -->
- <message key="user.required"/>
- </field-validator>
- </field>
- <!-- 字段校验器,校验password属性 -->
- <field name="password">
- <!-- 配置必填字符串校验器 -->
- <field-validator type="requiredstring">
- <message key="pass.required"></message>
- </field-validator>
- <!-- 密码长度必须是3到6位 -->
- <field-validator type="stringlength">
- <param name="minLength">3</param>
- <param name="maxLength">6</param>
- <message key="pass.length"></message>
- </field-validator>
- </field>
- </validators>
struts.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
- "http://struts.apache.org/dtds/struts-2.1.dtd">
- <struts>
- <!-- struts常量定义 -->
- <!-- 指定struts国际化资源文件的baseName -->
- <constant name="struts.custom.i18n.resources" value="messageResource"/>
- <!-- 指定每次HTTP请求时是否重新加载国际化资源文件,默认为false,开发阶段设为true -->
- <constant name="struts.i18n.reload" value="true"/>
- <!-- 配置应用的编码方式 -->
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <!-- action 定义 -->
- <package name="mystruts" extends="struts-default">
- <action name="login" class="com.petrochina.action.system.LoginAction">
- <result name="success">/welcome.jsp</result>
- <!-- 校验错误直接返回"input"字符串,所以要定义"input"对应的视图资源 -->
- <result name="input">/login.jsp</result>
- </action>
- </package>
- </struts>
国际化资源文件messageResource_zh_CN.properties
- #struts校验
- user.required=用户名不能为空
- pass.required=密码不能为空
- pass.length=密码必须是3到6位
文件结构:
登录页面:
不输入任何内容,点击"提交",效果如下:
可见对LoginAction中的password属性定义的两个校验器都起作用了,但如果这两个校验信息同时显示有点冗余,此时可以通过设置short-circuit="true"来配置校验器短路.修改后的LoginAction-validation.xml中password字段的定义如下:
- <!-- 字段校验器,校验password属性 -->
- <field name="password">
- <!-- 配置必填字符串校验器 -->
- <field-validator type="requiredstring" short-circuit="true">
- <message key="pass.required"></message>
- </field-validator>
- <!-- 密码长度必须是3到6位 -->
- <field-validator type="stringlength">
- <param name="minLength">3</param>
- <param name="maxLength">6</param>
- <message key="pass.length"></message>
- </field-validator>
- </field>
这样如果密码为空就提交的话只会提示"密码不能为空",效果如下:
PS:直接访问jsp页面(http://localhost:8080/struts/login.jsp)会报错:
但是通过action(http://localhost:8080/struts/login.action)就可以正常访问,去掉struts的客户端验证(在jsp页面的form表单中去掉validate="true"属性)也可以正常访问.在网上查了一下资料,大家的解决方法都是走action.个人觉得原因是:通过Action访问Struts2会加载LoginAction-validation.xml,从而读取配置的校验器信息,根据配置的校验器信息生成客户端校验脚本(Javascript),如果直接访问jsp页面那么就获取不到校验器信息(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@18db6e1 - Class: freemarker.ext.beans.SimpleMethodModel),从而无法生成客户端脚本.
- 使用Struts2验证框架实现输入校验
- 使用Struts2验证框架实现输入校验
- Struts2输入校验(二)----验证框架
- struts2基于验证框架的输入校验
- 7 Struts2输入校验(二)----验证框架
- struts2使用XML框架进行输入校验
- 关于Struts2基于验证框架的输入校验的经验
- 使用struts2的输入校验
- Struts2输入校验之用校验框架校验
- Struts2框架的输入校验(一)
- 在struts2框架中实现手动处理输入验证
- 使用struts2的校验框架
- Struts2的输入校验,手工实现输入校验
- Struts2中的数据校验(二[验证框架校验]) .
- 基于Struts2验证框架的输入验证
- Struts2验证框架使用
- Struts使用验证框架验证数据校验
- struts2 实现输入校验之validate方法
- MKMapView实时绘画渐变线条运动轨迹
- iOS---In-App Purchase 常见问题解答
- 蓝牙学习之旅——专业术语简述
- Socket编程
- C# 程序员最常犯的 10 个错误
- 使用Struts2验证框架实现输入校验
- 如何用消息系统避免分布式事务?
- Java虚拟机参数设置问题
- jquery.cookie.js用法实例详解
- tomcat中catalina是什么
- 19Java语法回顾之反射
- Redis 横向扩展案例
- Hadoop YARN学习监控JVM和实时监控Ganglia、Ambari(5)
- 《剑指offer》——两个链表的第一个公共结点