Struts2框架(8)---Struts2的输入校验

Struts2的输入校验

在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验:

客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻服务器的负担,但是客户端校验并不是安全的,简单来讲就是防君子防不了小人。

服务器端校验:最大特点就是数据安全,但是如果只有服务器端校验,会大大增加服务器端的负担。

所以一般在我们开发中,是客户端和服务器端校验相结合作用的。

那这篇文章,我只讲服务器端校验,在Struts2支持两种校验方式:

代码校验 :在服务器通过编辑java代码完成数据校验

配置校验: xml配置校验 通过xml配置文件完成数据的校验

(1)代码校验:

代码校验分为三个步骤:

步骤一、封装数据

步骤二、实现要校验的Action  必须继承ActionSupport

步骤三、覆盖Validate方法  然后完成业务逻辑数据的校验

用户界面 register.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
 3 <%@ taglib uri="/struts-tags" prefix="s" %>
 4 <html>
 5   <head>
 6     <title>用户注册</title>
 7   </head>
 8   <body style="text-align: center;">
 9     <table align="center" width="50%">
10         <tr>
11             <td style="color: red">
12                 <!-- <s:fielderror></s:fielderror>  --> <!-- 这里是显示错误的地方 -->
13             </td>
14         </tr>
15     </table>
16
17         <form action="${pageContext.request.contextPath }/login" method="post"  >
18
19             用户名:<input type="text"  name="username"><br><br>
20             密     码:<input type="text"  name="password"><br><br>
21                     确认密码:<input type="text"  name="password2"><br><br>
22                         <input type="reset" value="清空">
23                         <input type="submit" value="注册">
24
25         </form>
26   </body>
27 </html>

struts.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6       <!-- 配置常量信息 -->
 7       <constant name="struts.devMode" value="true"></constant>
 8
 9      <package name="struts2" extends="struts-default" >
10          <action name="login" class="com.study.Login.RegisterAction">
11          <result name="success">/success.jsp</result>
12          <!-- 在input视图中可以通过<s:fielderror/>显示失败信息 -->
13          <result name="input">/register.jsp</result>
14          </action>
15      </package>
16 </struts>
RegisterAction.java
 1 import com.opensymphony.xwork2.ActionSupport;
 2 public class RegisterAction extends ActionSupport{
 3
 4     private String username;
 5     private String password;
 6     private String password2;
 7     //这里我通过set方法封装数据
 8   public void setUsername(String username) {
 9         this.username = username;
10     }
11     public void setPassword(String password) {
12         this.password = password;
13     }
14     public void setPassword2(String password2) {
15         this.password2 = password2;
16     }
17
18     @Override
19     public String execute() throws Exception {
20         return NONE;
21     }
22
23     //在服务器端需要完成对数据的校验
24     @Override
25     public void validate() {
26         //测试是否得到属性值,证实已经得到
27     System.out.println(username+"---"+password+"---"+password2);
28     if(username==null || username.length()<6 || username.length()>20){
29         //把错误信息保存到字段中
30         this.addFieldError("username", "有户名输入不合法");
31     }
32
33     if(password==null || password.length()<6 || password.length()>20){
34         //把错误信息保存到字段中
35         this.addFieldError("password", "密码输入不合法");
36     }else if( password2==null || password2.length()<6 || password2.length()>20){
37         this.addFieldError("password2", "密码输入不合法");
38     }else if(!password.equals(password2)){
39         this.addFieldError("password2", " 两次密码不一致");
40     }
41
42         super.validate();
43     }
44 }
运行结果:

 (2)框架校验

框架校验也就是通过XML配置方式进行数据校验 ,这也是我们在企业开发的主流校验。

XML校验原理: 将很多规则代码已经写好只需要在xml文件中定义需要使用的校验规则即可。,所以大大减少了我们的开发时间。

我先把步骤写一下:

步骤一:编写JSP

步骤二:编写Action 继承ActionSupport或者Validateable接口

 步骤三:封装请求参数

   步骤四:编写xml校验规则文件

Xml校验文件的命名规则:   Action类名-validation.xml 对Action中所有的方法都执行校验

举例命名规则RegisterAction-validation.xml

同时要满足:Xml校验文件和Action类要在同一包下

步骤一: register.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用户注册</title>
  </head>

  <body style="text-align: center;">
    <table align="center" width="50%">
        <tr>
            <td style="color: red">
                <s:fielderror></s:fielderror>
            </td>
        </tr>

    </table>

        <form action="${pageContext.request.contextPath }/login.action" method="post"  >
            <table width="60%" >
                <tr>
                    <td>用户名</td>
                    <td>
                        <input type="text" name="username" >
                    </td>
                </tr>

                <tr>
                    <td>密码</td>
                    <td>
                        <input type="password" name="password" >
                    </td>
                </tr>

                <tr>
                    <td>确认密码</td>
                    <td>
                        <input type="password" name="password2" >
                    </td>
                </tr>

               <tr>
                    <td>年龄</td>
                    <td>
                        <input type="text" name="age" >
                    </td>
                </tr>

                <tr>
                    <td>邮箱</td>
                    <td>
                        <input type="text" name="email" >
                    </td>
                </tr>

                <tr>
                    <td>生日</td>
                    <td>
                        <input type="text" name="birthday" >
                    </td>
                </tr>

                <tr>
                    <td>毕业日期</td>
                    <td>
                        <input type="text" name="graduation" >
                    </td>
                </tr>

                <tr>
                    <td>
                        <input type="reset" value="清空">
                    </td>
                    <td>
                        <input type="submit" value="注册">
                    </td>
                </tr>

            </table>
        </form>

  </body>
</html>

register.jsp

步骤二:RegisterAction.java

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class RegisterAction extends ActionSupport implements ModelDriven<User>{

 //手动创建一个对象
    private User user =new User();

    @Override
    public String execute() throws Exception {
        return NONE;
    }

    public User getModel() {
        return user;
    }
}

步骤三:封装请求参数

上面手动校验的案例我是用set方法封装数据,那这里我采用的是使用ModelDriven接口,对请求数据进行封装,

在之前我讲过封装数据的三种方法不清楚的可以看下这篇文章:Struts框架(6)---action接收请求参数

User.java

 1 import java.util.Date;
 2 public class User {
 3
 4     private String username;
 5     private String password;
 6     private String password2;
 7     private Integer age;
 8     private String email;
 9     private Date birthday;
10     private Date graduation;
11
12     /*
13      * 给属性提供get和set方法
14      */
15 }

步骤四:RegisterAction-validation.xml

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
 <validators>
  <!--dtd约束在xwork-core-**.jar包中 -->
      <field name="username">
              <field-validator type="requiredstring">
                  <param name="trim">true</param>
                  <message>用户民不能为空</message>
              </field-validator>

              <field-validator type="stringlength">
                <param name="minLength">6</param>
                <param name="maxLength">15</param>
                <message>有户名长度必须在 ${minLength} 和 ${maxLength}之间 </message>
              </field-validator>
      </field> 

        <field name="password">
              <field-validator type="requiredstring">
                  <param name="trim">true</param>
                  <message>密码不能为空</message>
              </field-validator>

              <field-validator type="stringlength">
                <param name="minLength">6</param>
                <param name="maxLength">15</param>
                <message>密码必须在 ${minLength}和${maxLength}之间 </message>
              </field-validator>
       </field> 

      <field name="password2">
          <field-validator type="fieldexpression">
             <param name="expression"><![CDATA[password==password2]]></param>
             <message>两次密码不一致</message>
          </field-validator>
      </field>

      <field name="age">
          <field-validator type="required">
              <param name="trim">true</param>
              <message>年龄不能为空</message>
          </field-validator>
          <field-validator type="int">
              <param name="min">1</param>
              <param name="max">150</param>
              <message>年龄必须在 ${min} 和 ${max}之间</message>
          </field-validator>

      </field>

      <field name="email">
           <field-validator type="email">
               <message>不是一个合法的邮箱地址</message>
           </field-validator>
      </field>

       <field name="birthday">
          <field-validator type="date">
              <param name="min">2001-01-01</param>
              <param name="max">2003-12-31</param>
              <message>生日必须在 ${min} 和${max}之间</message>
          </field-validator>
      </field> 

 </validators>

struts.xml不需要任何改变,和之前一样就可以了

运行结果:

如果你觉得提示错误的位置有点丑,那你可以运用Struts2的<s:form>标签,效果会更好

现在两种方式都讲了,现在对xml配置的要点一些知识要点进行归纳。

xml校验文件详解:

<validators>: 根元素

<field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字

<field-validator>:指定校验器, type 指定验证规则

上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求

的校验器,这些校验器的定义可以在xwork-2.x.jar中的

com.opensymphony.xwork2.validator.validators下的default.xml中找到。

<param>:子元素可以向验证程序传递参数

<message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message

指定key属性,key的值为属性文件中的key。

struts2校验规则:

系统提供的校验器如下:

required (必填校验器,要求被校验的属性值不能为null)

requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)

url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)

date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)

expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

最后讲一个细节:

编写校验文件时,不能出现帮助信息

在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:

windwos->preferences->myeclipse->files and editors->xml->xmlcatalog

点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,

回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd

本文章就讲到这里,有不足之处,欢迎大家留言指点,谢谢!

时间: 2024-10-17 22:07:20

Struts2框架(8)---Struts2的输入校验的相关文章

Struts2框架之-Struts2的标签

Struts2包含哪些标签? 解答: A: <s:a href=”"></s:a>—–超链接,类似于html里的<a></a> <s:action name=”"></s:action>—–执行一个view里面的一个action <s:actionerror/>—–如果action的errors有值那么显示出来 <s:actionmessage/>—–如果action的message有值那么

Struts2框架07 Struts2 + Spring + Mybatis 整合

1 导包 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <m

Struts2输入校验(XML方式)

本章主要介绍struts2的XML配置方式输入校验.以下将结合一个实例程序进行说明. 代码结构: 关键代码: RegistAction.javapackage com.alfred.regist.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class RegistAction extends ActionSupport { private static final long

Struts2框架概述

Struts2-day01 一. 框架概述 什么是框架,为什么使用框架,框架优点 框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.简单说就是使用别人搭好的舞台,你来做表演. 框架是在特定的领域内解决问题. 优点 重用代码大大增加,软件生产效率和质量也得到了提高 使用框架开发,它提供统一的标准,大大降低了我们的后期维护. 学习框架重点:了解框架做了什么,我们要在这个基础上在

Struts2框架学习(一)

Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2,Struts2框架的流程原理 1)请求先到达Filter中央控制器 2)然后为Action创建代理类 3)将各个服务存放在拦截器中,执行完拦截器后再去执行action类行action类,action类调用service,再调用dao 4)得到结果字符串,创建result对象 5)转向相应的视图.

如何用Struts2框架来完成登录操作

1. 问题:为什么使用struts2框架?Struts2框架它是一个在web中应用的mvc框架.我们使用strtus2框架来完成web开发有什么优势?2. 问题:怎样使用strtuts2框架首先要上网下载它的jar包.步骤:1.导入相关的jar文件2.需要在web.xml文件中配置一个Filter(只有配置了它才可以使用struts2框架)3.struts.xml配置4.创建Action来完成逻辑操作3. 快速入门我们使用的是struts2 2.3.24版本我们使用strtus2框架不是直接将它

Struts2笔记02——Struts2 概述(转)

Struts2是基于MVC设计模式的一种流行.成熟的Web应用框架. 它不仅仅是Struts1的下一个版本,更是对Structs架构的一个完整重写. 而WebWork则是以Struts框架为基础的一个框架,它的目标是提供一个基于Struts的增强.改进框架,使开发人员更轻松地进行Web开发. 在一段时间后,Webwork框架和Struts社区携手共同创建了著名的Struts2框架. Struts2 框架特性 POJO forms and POJO actions - Struts2已经完成了作为

使用validateXxx()方法进行输入校验 --Struts2框架

1.本例是在使用validate()方法进行输入校验 --Struts2框架的基础上接着做的,上一篇使用validate()方法进行输入校验时会对当前Action中的所有方法有效,由于Struts2框架可以在同一个Action中使用不同方法来处理不同请求,所以如果只是对Action中的某个方法进行输入校验,就可以使用validateXxxx()格式的方法来实现. 2.修改文件BookAction.java: public class BookAction extends ActionSuppor

struts2(七)输入校验

输入校验简述 由于Web应用的开放性,网络上所有浏览者都能够自由地使用该应用,这样该应用通过输入页面收集的数据可能很复杂,不仅会包含正常用户的误输入,还可能包含恶意用户的恶意输入.因此应用系统需要将这些非法输入阻止在应用之外. 异常输入,可能导致系统非正常中断,严重者会导致系统崩溃.应用程序需要正常处理表现层接受的各种数据,通常的做法是遇到异常输入时应用程序直接返回,提示浏览者必须重新输入,也就是将那些异常输入过滤掉.绝对异常输入的过滤,就是输入校验,也称为数据校验. 输入校验分为客户端校验和服