3.2 Struts2基本应用及工作流程



struts2流程

*.action-->web.xml(过滤器)-->struts.xml-->Action.java-->JSP等

3.2.1 简单Struts 2实例开发

1.建立一个Web项目

命名为“Struts2

2.添加Struts 2框架支持

    用MyEclipse添加Struts2支持,项目右键->MyEclipse->Project Facets[Capabilities]->Install Apache Struts(2.x) Facet,然后在弹出窗口中点击Finish即可。(我这是mac版的Myeclipse 2014,如果是Win版的Myeclipse8.5,是右键项目->MyEclipse->Add Struts Capabilities...,然后在弹出窗口中选择Struts版本为2.1,点击Finish即可)。如果更早版本的MyEclipse 没有对Struts 2的支持,也可以去官网下载Struts2(http://archive.apache.org/dist/struts/)。我这里用的版本是2.2.1。

    将下载的Zip文件解压缩,是一个典型的Web结构。包含以下4个文件:

  • apps:包含基于Struts 2的示例应用,是学习Struts 2非常有用的资料。  

  • docs:包含Struts 2的相关文档,如Struts 2快速入门、Struts 2文档、API文档等内容。    

  • lib:包含Struts 2框架的核心类库,以及Struts 2的第三方插件类库。  

  • src:包含Struts 2框架的全部源代码。

3.加载Struts 2基本类库(如果是自己下载的Struts,那么需要这一步)

    右击项目名,选择【Build Path】→【Configure Build Path】菜单项,出现对话框。选择【Libraries】,单击【Add External JARs】按钮,进入下载的Struts 2目录的lib文件夹,选中如下所列出的8个Jar包,单击【OK】按钮完成类库的添加。当然最简单的是全部导入。

所需的jar包

  1. commons-fileupload-1.2.1.jar

  2. commons-io-1.3.2.jsr

  3. commons-logging-1.0.4.jar

  4. freemarker-2.3.16.jar

  5. javassist-3.7.ga.jar

  6. ognl-3.0.jar

  7. struts2-core-2.2.1.jar

  8. xwork-core-2.2.1.jar

 备注:如果是Myeclipse2014,又是这种方式引入jar,那么发布项目的时候需要手动添加jar到项目下。项目右键->properties->Myeclipse->Deployment Assembly->Add...。

4.修改web.xml文件

    打开项目中的WebRoot/WEB-INF/web.xml文件,修改其代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>Struts2</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
</web-app>

该代码主要配置一个过滤器让请求能够被Struts2框架来处理

备注:Struts 2.0.11版的时候,过滤器是FilterDispatcher,配置文件如下,

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/JavaEE/web-app_2_5.xsd">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


5.创建hello.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>struts 2应用</title>
  </head>
    <body>
        <form action="struts2.action" method="post">
            请输入姓名:
            <input type="text" name="name" />
            <br>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>

单击“提交”按钮就会交给struts2.action处理,struts2的拦截器就会起作用,将用户请求转发给对应的Action类。

6.Action实现类

    建立class,命名为“StrutsAction”,代码如下:

package org.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction extends ActionSupport{
    private String name;
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name=name;
    }
 
    public String execute() throws Exception {
        if(!name.equals("HelloWorld")){
            Map request=(Map)ActionContext.getContext().get("request");
            request.put("name",getName());
            return "success";
        }else{
            return "error";
        }
    }
}

7.创建并配置struts.xml文件

    任何一个Struts 2程序都不能缺少struts.xml文件,它是Struts 2运行的核心右击src文件夹,选择【new】→【file】菜单项,在File name框中输入“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>
    <package name="default" extends="struts-default">
        <action name="struts2" class="org.action.StrutsAction">
            <result name="success">/welcome.jsp</result>
            <result name="error">/hello.jsp</result>
        </action>
    </package>
</struts>

备注:action的name不要用struts,会报错

8.创建welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
    <title>struts 2应用</title>
</head>
<body>
       Hello,<s:property value="#request.name"/>!
</body>
</html>

9.部署和运行

    启动Tomcat后,在浏览器中输入“http://localhost:8080/Struts2/hello.jsp”,会看到如图3.3所示的界面。当在输入框中输入“张三”时,会出现如图3.4所示界面。如果输入“HelloWorld”,就会返回当前页面。

3.2 Struts2基本应用及工作流程_第1张图片

图3.3 运行界面

3.2 Struts2基本应用及工作流程_第2张图片

图3.4 运行成功界面


    在测试过程中,如果修改了.java文件或配置文件,必须重启Tomcat服务,而修改了JSP文件只需刷新页面。

 

3.2.2 Struts 2工作流程及各种文件详解

1.struts2的工作流程

    由上例可看出,当用户发送一个请求后,也就是一个*.action,web.xml中配置的StrutsPrepareAndExecuteFilterstruts2的框架的核心控制器)就会过滤该请求。如果请求是以.action结尾,该请求就会被转入struts2框架处理,根据*.action请求前面的“*”来决定调用哪个业务

    Struts 2框架中的配置文件struts.xml会起映射作用,它会根据“*”来决定调用用户定义的哪个Action类。例如在项目Struts2中,请求为struts.action,前面“*”的部分是“struts2”,所以在struts.xml中有个Action类的name为“struts2”,这表示该请求与这个Action来匹配,就会调用该Action中class属性指定的Action类。但是在Struts 2中,用户定义的Action类并不是业务控制器,而是Action代理,其并没有和Servlet API耦合。所以Struts 2框架提供了一系列的拦截器,它负责将HttpServletRequest请求中的请求参数解析出来,传入到用户定义的Action类中。然后再调用其execute()方法来处理用户请求,处理结束后,返回一个值,这时struts.xml文件又起映射作用,根据返回的值来确定跳转到哪个页面。

2.struts2中各种文件详解

1)web.xml文件

        Filter过滤器是Java项目开发中的一种常用技术。它是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的内容进行处理,通常用于权限控制、编码转换等场合

        Servlet过滤器是在Java Severlet规范中定义的,能够对过滤器关联的URL请求和响应进行检查和修改。

        所有过滤器必须实现java.Serlvet.Filter接口,这个接口中含有3个过滤器类必须实现的方法:

        a)init(FilterConfig):Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。     

        b)doFilter(ServletRequest,ServletResponse,FilterChain):完成实际的过滤操作,当用户请求与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法,返回响应之前也会调用此方法FilterChain参数用于访问过滤器链上的下一个过滤器

        c)destroy():Servlet容器在销毁过滤器实例前调用该方法,这个方法可以释放Servlet过滤器占用的资源,过滤器类编写完成后,必须要在web.xml中进行配置,格式如下:

<filter>
    <!--自定义的名称-->
    <filter-name>过滤器名</filter-name>
    <!--自定义的过滤器类,注意,这里要在包下,要加包名-->
    <filter-class>过滤器对应类</filter-class>
    <init-param>
        <!--类中参数名称-->
        <param-name>参数名称</param-name>
        <!--对应参数的值-->
        <param-value>参数值</param-value>
    </init-param>
</filter>


 过滤器的关联方式有3种:

(1)与一个URL资源关联:

<filter-mapping>
    <!- -这里与上面配置的名称要相同-->
    <filter-name>过滤器名</filter-name>
    <!- -与该URL资源关联-->
    <url-pattern>xxx.jsp</url-pattern>
</filter-mapping>

(2)与一个URL目录下的所有资源关联

<filter-mapping>
    <filter-name>过滤器名</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(3)与一个Servlet关联

<filter-mapping>
    <filter-name>过滤器名</filter-name>
    <url-pattern>Servlet名称</url-pattern>
</filter-mapping>


2)struts.xml文件

    是Struts2框架的核心配置文件,主要用于配置action

    struts.xml文件通常放在Web应用程序的WEB-INF/classes目录下,该目录下的struts.xml将被Struts 2框架自动加载

    struts.xml文件是一个XML文件,文件前面是XML的头文件,然后是<struts>标签,位于Struts 2配置的最外层,其他标签都是包含在它里面的。

 

3)package元素

    Struts2的包类似于Java中的包,将action、result、result类型、拦截器和拦截器栈组织为一个逻辑单元,从而简化了维护工作,提高了重用性。

    与Java中的包不同的是,Struts 2中的包可以扩展另外的包,从而“继承”原有包的所有定义,并可以添加自己包的特有配置,以及修改原有包的部分配置。从这一点上看,Struts 2中的包更像Java中的类。package有以下几个常用属性:

  • name:该属性是必选的,指定包的名字,这个名字将作为引用该包的键。必须是唯一的。  

  • extends:该属性是可选的,允许一个包继承一个或多个先前定义的包。  

  • abstract:该属性是可选的,将其设置为true,可以把一个包定义为抽象的抽象包不能有action定义、只能作为“父”包,被其他包所继承。因为Struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义。  

  • namespace:该属性是可选的,将保存的action配置为不同的名称空间。看下面这个例子:    

<package name="default">
    <action name="foo" class="mypackage.simpleAction">
        <result name="success">/foo.jsp</result>
    </action>
    
    <action name="bar" class="mypackage.simpleAction">
        <result name="success">/bar.jsp</result>
    </action>
</package>
 
<package name="mypackage1" namespace="/">
    <action name="moo" class="mypackage.simpleAction">
        <result name="success">/moo.jsp</result>
    </action>
</package>
 
<package name="mypackage2" namespace="/barspace">
    <action name="bar" class="mypackage.simpleAction">
        <result name="success">/bar.jsp</result>
    </action>
</package>

     如果请求/barspace/bar.action,框架将首先查找/barspace名称空间如果找到了,则执行bar.action如果没找到,到默认的空间中继续查找。本例中,/barspace名称空间中有名为bar的Action,因此它会被执行。

    如果请求/barspace/foo.action,框架将首先在/barspace名称空间中查找foo这个Action。本例中/barspace名称空间中没有foo.action因此默认的名称空间中的/foo.action将被找到执行

    如果请求/moo.action,框架会在名称空间“/”中查找moo.action,如果没有找到,则到默认名称空间中查找。

4)Action元素

    Struts2的核心功能是Action。开发好一个Action类后,就要配置Action映射。 当一个请求匹配到某个Action名字时,框架就使用这个映射来确定如何处理请求。

<action name="struts" class="org.action.StrutsAction">
    <result name="success">/welcome.jsp</result>
    <result name="error">/hello.jsp</result>
</action>

    一个Action类中不是只能有execute()方法,如果一个请求要调用Action类中的其他方法,就需要在Action配置中加以配置。例如,如果在org.action.StrutsAction中有另外一个方法为:

public String find() throws Exception{return SUCCESS;}

那么如果想要调用这个方法,就必须在Action中配置method属性,其配置方法为:

<! - - name值是用来和请求匹配的- - >
<action name="find" class="org.action.StrutsAction" method="find">
    <result name="success">/welcome.jsp</result>
    <result name="error">/hello.jsp</result>
</action>

5)result元素

    一个result代表一个可能的输出。当Action类中的方法执行完成时,返回一个字符串类型的结果代码,框架根据这个结果代码选择对应的result,向用户输出。

<result name ="逻辑视图名" type ="视图结果类型"/>
    <param name ="参数名">参数值</param>
</result>

param中的name属性有两个值:

  • location:指定逻辑视图。  

  • parse:是否允许在实际视图名中使用OGNL表达式,参数默认为true

实际上不用明确写这个param标签,直接在<result></result>中指定物理视图位置

result中的name属性有如下值:

  • success:表示请求处理成功,该值也是默认值  

  • error:表示请求处理失败。  

  • none:表示请求处理完成后不跳转到任何页面  

  • input:表示输入时如果验证失败应该跳转到什么地方(关于验证后面会介绍)。  

  • login:表示登录失败后跳转的目标

type(非默认类型)属性支持的结果类型有以下几种:

  • chain:用来处理Action链。  

  • chart:用来整合JFreeChart的结果类型。  

  • dispatcher:用来转向页面,通常处理JSP,该类型也为默认类型  

  • freemarker:处理FreeMarker模板。  

  • httpheader:控制特殊HTTP行为的结果类型。  

  • jasper:用于JasperReports整合的结果类型。  

  • jsf:JSF整合的结果类型。  

  • redirect:重定向到一个URL。  

  • redirect-action:重定向到一个Action。  

  • stream:向浏览器发送InputStream对象,通常用来处理文件下载,还可用于返回AJAX数据  

  • tiles:与Tiles整合的结果类型。  

  • velocity:处理Velocity模板。  

  • xslt:处理XML/XLST模板。  

  • plaintext:显示原始文件内容,如文件源代码。

dispatcher类型是默认类型,通常不写。redirect-action类型用于当一个Action处理结束后,直接将请求重定向到另一个Action。如下列配置:

…
<action name="struts" class="org.action.StrutsAction" >
    <result name="success">/welcome.jsp</result>
    <result name="error">/hello.jsp</result>
</action>
<action name="login" class="org.action.StrutsAction">
    <result name="success" type="redirect-action">struts</result>
</action>
…

第一个action中省略了type,就意味着是默认类型,即为dispatcher,所以后面跳转到一个jsp文件。

6)ActionSupport类

    在Struts2中,Action与容器已经做到完全解耦,不再继承某个类或某个接口,所以前面的例子中,StrutsAction可以不用继承ActionSupport类但特殊情况下,为了降低编程的工作难度,充分利用Struts2提供的功能,定义Action时,会继承ActionSupport类。 该类位于xwork2提供的包com.opensymphony.xwork2中。

    ActionSupport类为Action提供了一些默认实现,主要包括预定义常量、从资源文件中读取文本资源、接收验证错误信息和验证的默认实现

下面是ActionSupport类所实现的接口:

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider,Serializable {}


    Action接口同样位于
com.opensymphony.xwork2包,定义了一些常量和一个execute()方法。

public interface Action {
    public static final String SUCCESS="success";
    public static final String NONE="none";
    public static final String ERROR="error";
    public static final String INPUT="input";
    public static final String LOGIN="login";
    public String execute() throws Exception;
}


  由于3.2.1节的例子中继承了ActionSupport类,所以可以看出,在execute的返回值中,其代码可以改为:

…
public String execute() throws Exception {
    if(!name.equals("HelloWorld")){
        Map request=(Map)ActionContext.getContext().get("request");
        request.put("name",getName());
        return SUCCESS;
    }else{
        return ERROR;
    }
}
…

3.2.3 Struts 2数据验证及验证框架的应用

    在前面的例子中,即使输入空的name,服务器也会处理用户请求,当然对这个例子没有影响。但如果是注册时,用户注册了空的用户和密码,并且保存到数据库中,如果后面要根据用户输入的用户名或密码来查询数据,这些空数据就可能会引起异常。

1.数据校验

    因为继承了ActionSupport类,而该类实现了Validateable接口,该接口定义了一个validate()方法,所以只要在自定义的Action类中重写该方法就可以实现验证功能。 下面来看其实现,可以把3.2.1节的例子中的Action类改写成:

package org.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction extends ActionSupport{
    private String name;
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name=name;
    }
 
    public String execute() throws Exception {
        if(!name.equals("HelloWorld"){
            Map request=(Map)ActionContext.getContext().get("request");
            request.put("name",getName());
            return SUCCESS;
        }else{
            return ERROR;
        }
    }
 
    public void validate() {
        //如果姓名为空,则把错误信息添加到Action类的fieldErrors
        if(this.getName()==null||this.getName().trim().equals("")){
            addFieldError("name","姓名是必须的!"); //把错误信息保存起来
        }
    }
}

     定义了校验方法后,该方法会在执行系统的execute()方法之前执行。如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处,所以要在Action配置中加入以下代码:

…
<action name="struts" class="org.action.StrutsAction" >
    <result name="success">/welcome.jsp</result>
    <result name="error">/hello.jsp</result>
    <result name="input">/hello.jsp</result>
</action>
…

把信息打印到出现错误后而转发的页面,<s:form.../>提供了输出校验错误的能力。把JSP页面改写一下(标签的具体应用会在3.3节具体讲解):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/struts-tags" prefix="s"%><!-- 导入标签开发能力 -->
<html>
  <head>
    <title>struts 2应用</title>
  </head>
    <body>
        <s:form action="struts2.action" method="post">
            <s:textfield name="name" label="请输入姓名"></s:textfield>
            <s:submit value="提交"></s:submit>
        </s:form>
    </body>
</html>

修改之后,部署运行。不输入任何姓名直接提交,将会看到如图3.5所示的界面。

3.2 Struts2基本应用及工作流程_第3张图片

备注:

可能会报错

The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter

是因为,以前在web.xml中配置的过滤条件是“/*”,而现在是“*.action”,所以对于jsp文件就无法过滤。

方法一,修改过滤条件为“/*”。

方法二(个人推荐这种),增加过滤器配置配置,如下

 <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>



2.Struts2验证框架的应用

    Struts 2提供了校验框架,只需要增加一个校验配置文件,就可以完成对数据的校验。Struts 2提供了大量的数据校验器,包括表单域校验器非表单域校验器两种。

1)必填字符串校验器(requiredstring校验器)

    输入框必须是输入的,并且字符串长度大于0。其校验规则定义文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="name">
        <!--验证字符串不能为空,即必填-->
        <field-validator type="requiredstring">
            <!--去空格-->
            <param name="trim">true</param>
            <!--错误提示信息-->
            <message>姓名是必需的!</message>
        </field-validator>
    </field>
</validators>

问题:

引用的文件包含错误(http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd)。有关更多信息,右键单击消息并选择“显示详细信息...”

原因:

原来最初struts2的验证框架dtd使用的地址是“www.opensymphony.com/xwork”现在已经转移到“http://struts.apache.org/dtds”下了

解决方法:

所以修改xml的dtd地址即可:

<!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

另附:

validators.xml文件稍有不同,dtd是1.0:

<!DOCTYPE validators PUBLIC  
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"  
        "http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">

该文件的命名规则:

    ActionName-validation.xmlActionName就是需要校验的Action类的类名。因此这里名为StrutsAction-validation.xml,且该文件应该与Action类的文件位于同一路径下如果Action类中有2个甚至多个方法,对应的在struts.xml文件中就有多个Action的配置与之匹配,这是如果相对其中的一个方法进行验证,命名应该为:ActionName-name-validation.xml。这里的name是在struts.xml中Action属性里面的name。有了校验规则文件后,在Action类中的validate方法就不需要了

2)必填校验器

    该校验器的名字是required,也就是<field-validator>属性中的type="required",该校验器要求指定的字段必须有值,与必填字符串校验器最大的区别就是可以有空字符串。如果把上例改为必填校验器,其代码应为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="name">
        <!-- 验证字符串必填 -->
        <field-validator type="required">
            <!-- 错误提示信息 -->
            <message>姓名是必需的!</message>
        </field-validator>
    </field>
</validators>

 3)整数校验器

    该校验器的名字是int,该校验器要求字段的整数值必须在指定范围内,故其有min和max参数。如果有个age输入框,要求其必须是整数,且输入值必须在18与100之间,该校验器的配置应该为:

<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="age">
        <field-validator type="int">
        <!-- 年龄最小值 -->
        <param name="min">18</param>
        <!-- 年龄最大值 -->
        <param name="max">100</param>
        <!-- 错误提示信息 -->
        <message>年龄必须在18至100之间</message>
    </field-validator>
    </field>
</validators>

 4)日期校验器

    该校验器的名字是date,该校验器要求字段的日期值必须在指定范围内,故其有min和max参数。其配置格式如下:

<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="date">
        <field-validator type="date">
            <!-- 日期最小值 -->
            <param name="min">1980-01-01</param>
            <!-- 日期最大值 -->
            <param name="max">2009-12-31</param>
            <!-- 错误提示信息 -->
            <message>日期必须在1980-01-01至2009-12-31之间</message>
        </field-validator>
    </field>
</validators>

5)邮件地址校验器

    该校验器的名称是email,该校验器要求字段的字符如果非空,就必须是合法的邮件地址。如下面的代码:

<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="email">
        <field-validator type="email">
            <message>必须输入有效的电子邮件地址 </message>
        </field-validator>
    </field>
</validators>

 6)网址校验器

    该校验器的名称是url,该校验器要求字段的字符如果非空,就必须是合法的URL地址。如下面的代码:

<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="url">
        <field-validator type="url">
            <message>必须输入有效的网址 </message>
        </field-validator>
    </field>
</validators>

7)字符串长度校验器

    该校验器的名称是stringlength,该校验器要求字段的长度必须在指定的范围内一般用于密码输入框。如下面的代码

<validators>
    <!-- 需要校验的字段的字段名 -->
    <field name="password">
        <field-validator type="stringlength">
            <!-- 长度最小值 -->
            <param name="minLength">6</param>
            <!-- 长度最大值 -->
            <param name="maxLength">20</param>
            <!-- 错误提示信息 -->
            <message>密码长度必须在6到20之间</message>
        </field-validator>
    </field>
</validators>

8)正则表达式校验器

    该校验器的名称是regex,它检查被校验字段是否匹配一个正则表达式。如下面的代码:

<validators>
    <field name="xh">
        <field-validator type="regex">
            <param name="expression"><![CDATA[(\d{6})]]></param>
            <message>学号必须是6位的数字</message>
        </field-validator>
    </field>
</validators>



还有其他校验器:如表达式校验器、Vistor校验器、字段表达式校验器等。

你可能感兴趣的:(struts,javaweb)