Struts2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2 相关的知识,希望对你有一定的参考价值。

1 自定义结果视图

1.1 自定义一个类实现com.opensymphony.xwork2.Result接口。

package com.xuweiwei.action;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import org.apache.struts2.ServletActionContext;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class CaptchaResult implements Result {

    private int width = 120;
    private int height = 25;


    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    ////输出一副随机验证码图像
    @Override
    public void execute(ActionInvocation actionInvocation) throws Exception {
//创建一副内存图像
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //得到画笔
        Graphics g = image.getGraphics();
        //开始画
        //边线
        g.setColor(Color.BLUE);
        g.drawRect(0, 0, width, height);
        //填充背景色
        g.setColor(Color.YELLOW);
        g.fillRect(1, 1, width-2, height-2);
        //话干扰线
        g.setColor(Color.GRAY);

        Random r = new Random();
        for(int i=0;i<9;i++)
            g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
        //验证码
        g.setColor(Color.RED);
        g.setFont(new Font("宋体", Font.ITALIC|Font.BOLD, 19));
//            String base = "\\u7684\\u4e00\\u4e86\\u662f\\u6211\\u4e0d\\u5728\\u4eba\\u4eec\\u6709\\u6765\\u4ed6\\u8fd9\\u4e0a\\u7740\\u4e2a\\u5730\\u5230\\u5927\\u91cc\\u8bf4\\u5c31\\u53bb\\u5b50\\u5f97\\u4e5f\\u548c\\u90a3\\u8981\\u4e0b\\u770b\\u5929\\u65f6\\u8fc7\\u51fa\\u5c0f\\u4e48\\u8d77\\u4f60\\u90fd\\u628a\\u597d\\u8fd8\\u591a\\u6ca1\\u4e3a\\u53c8\\u53ef\\u5bb6\\u5b66\\u53ea\\u4ee5\\u4e3b\\u4f1a\\u6837\\u5e74\\u60f3\\u751f\\u540c\\u8001\\u4e2d\\u5341\\u4ece\\u81ea\\u9762\\u524d\\u5934\\u9053\\u5b83\\u540e\\u7136\\u8d70\\u5f88\\u50cf\\u89c1\\u4e24\\u7528\\u5979\\u56fd\\u52a8\\u8fdb\\u6210\\u56de\\u4ec0\\u8fb9\\u4f5c\\u5bf9\\u5f00\\u800c\\u5df1\\u4e9b\\u73b0\\u5c71\\u6c11\\u5019\\u7ecf\\u53d1\\u5de5\\u5411\\u4e8b\\u547d\\u7ed9\\u957f\\u6c34\\u51e0\\u4e49\\u4e09\\u58f0\\u4e8e\\u9ad8\\u624b\\u77e5\\u7406\\u773c\\u5fd7\\u70b9\\u5fc3\\u6218\\u4e8c\\u95ee\\u4f46\\u8eab\\u65b9\\u5b9e\\u5403\\u505a\\u53eb\\u5f53\\u4f4f\\u542c\\u9769\\u6253\\u5462\\u771f\\u5168\\u624d\\u56db\\u5df2\\u6240\\u654c\\u4e4b\\u6700\\u5149\\u4ea7\\u60c5\\u8def\\u5206\\u603b\\u6761\\u767d\\u8bdd\\u4e1c\\u5e2d\\u6b21\\u4eb2\\u5982\\u88ab\\u82b1\\u53e3\\u653e\\u513f\\u5e38\\u6c14\\u4e94\\u7b2c\\u4f7f\\u5199\\u519b\\u5427\\u6587\\u8fd0\\u518d\\u679c\\u600e\\u5b9a\\u8bb8\\u5feb\\u660e\\u884c\\u56e0\\u522b\\u98de\\u5916\\u6811\\u7269\\u6d3b\\u90e8\\u95e8\\u65e0\\u5f80\\u8239\\u671b\\u65b0\\u5e26\\u961f\\u5148\\u529b\\u5b8c\\u5374\\u7ad9\\u4ee3\\u5458\\u673a\\u66f4\\u4e5d\\u60a8\\u6bcf\\u98ce\\u7ea7\\u8ddf\\u7b11\\u554a\\u5b69\\u4e07\\u5c11\\u76f4\\u610f\\u591c\\u6bd4\\u9636\\u8fde\\u8f66\\u91cd\\u4fbf\\u6597\\u9a6c\\u54ea\\u5316\\u592a\\u6307\\u53d8\\u793e\\u4f3c\\u58eb\\u8005\\u5e72\\u77f3\\u6ee1\\u65e5\\u51b3\\u767e\\u539f\\u62ff\\u7fa4\\u7a76\\u5404\\u516d\\u672c\\u601d\\u89e3\\u7acb\\u6cb3\\u6751\\u516b\\u96be\\u65e9\\u8bba\\u5417\\u6839\\u5171\\u8ba9\\u76f8\\u7814\\u4eca\\u5176\\u4e66\\u5750\\u63a5\\u5e94\\u5173\\u4fe1\\u89c9\\u6b65\\u53cd\\u5904\\u8bb0\\u5c06\\u5343\\u627e\\u4e89\\u9886\\u6216\\u5e08\\u7ed3\\u5757\\u8dd1\\u8c01\\u8349\\u8d8a\\u5b57\\u52a0\\u811a\\u7d27\\u7231\\u7b49\\u4e60\\u9635\\u6015\\u6708\\u9752\\u534a\\u706b\\u6cd5\\u9898\\u5efa\\u8d76\\u4f4d\\u5531\\u6d77\\u4e03\\u5973\\u4efb\\u4ef6\\u611f\\u51c6\\u5f20\\u56e2\\u5c4b\\u79bb\\u8272\\u8138\\u7247\\u79d1\\u5012\\u775b\\u5229\\u4e16\\u521a\\u4e14\\u7531\\u9001\\u5207\\u661f\\u5bfc\\u665a\\u8868\\u591f\\u6574\\u8ba4\\u54cd\\u96ea\\u6d41\\u672a\\u573a\\u8be5\\u5e76\\u5e95\\u6df1\\u523b\\u5e73\\u4f1f\\u5fd9\\u63d0\\u786e\\u8fd1\\u4eae\\u8f7b\\u8bb2\\u519c\\u53e4\\u9ed1\\u544a\\u754c\\u62c9\\u540d\\u5440\\u571f\\u6e05\\u9633\\u7167\\u529e\\u53f2\\u6539\\u5386\\u8f6c\\u753b\\u9020\\u5634\\u6b64\\u6cbb\\u5317\\u5fc5\\u670d\\u96e8\\u7a7f\\u5185\\u8bc6\\u9a8c\\u4f20\\u4e1a\\u83dc\\u722c\\u7761\\u5174\\u5f62\\u91cf\\u54b1\\u89c2\\u82e6\\u4f53\\u4f17\\u901a\\u51b2\\u5408\\u7834\\u53cb\\u5ea6\\u672f\\u996d\\u516c\\u65c1\\u623f\\u6781\\u5357\\u67aa\\u8bfb\\u6c99\\u5c81\\u7ebf\\u91ce\\u575a\\u7a7a\\u6536\\u7b97\\u81f3\\u653f\\u57ce\\u52b3\\u843d\\u94b1\\u7279\\u56f4\\u5f1f\\u80dc\\u6559\\u70ed\\u5c55\\u5305\\u6b4c\\u7c7b\\u6e10\\u5f3a\\u6570\\u4e61\\u547c\\u6027\\u97f3\\u7b54\\u54e5\\u9645\\u65e7\\u795e\\u5ea7\\u7ae0\\u5e2e\\u5566\\u53d7\\u7cfb\\u4ee4\\u8df3\\u975e\\u4f55\\u725b\\u53d6\\u5165\\u5cb8\\u6562\\u6389\\u5ffd\\u79cd\\u88c5\\u9876\\u6025\\u6797\\u505c\\u606f\\u53e5\\u533a\\u8863\\u822c\\u62a5\\u53f6\\u538b\\u6162\\u53d4\\u80cc\\u7ec6";
        int x = 20;
        for(int i=0;i<4;i++){
            g.drawString(r.nextInt(10)+"", x,20 );
//                g.drawString(base.charAt(r.nextInt(base.length()))+"", x, 20);
            x+=18;
        }
        HttpServletResponse response = ServletActionContext.getResponse();

        //输出
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        ImageIO.write(image, "jpg", response.getOutputStream());
    }
}

 

1.2 在struts.xml中配置结果类型

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <!-- 定义结果类型 -->
        <result-types>
            <result-type name="captcha" class="com.xuweiwei.action.CaptchaResult">
                <!-- 设置自定义参数 -->
                <param name="width">120</param>
                <param name="height">25</param>
            </result-type>
        </result-types>
        <!-- 使用结果类型 -->
        <action name="captcha">
            <result name="success" type="captcha"/>
        </action>

    </package>

</struts>

 

1.3 在index.jsp中使用验证码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  验证码:<input type="text" name=""/><img src="${pageContext.request.contextPath}/captcha">

  </body>
</html>

 

2 封装请求参数

  • 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到model对象中。
  • Struts2提供了非常强大的类型转换机制用于请求数据到model对象的封装。 

 

2.1 Action本身作为model对象,通过成员的setter封装

2.1.1 设置静态数据的注入,通过配置文件设置

  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class ParamAction extends ActionSupport {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name:"+name);
        System.out.println("age:"+age);
        return Action.NONE;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">
            <param name="name">你好</param>
            <param name="age">10</param>
        </action>

    </package>

</struts>
  • 访问地址:http://localhost:8080/项目名/param就可以看到效果。

 

  • 【注】:这个功能是由<interceptor-ref name="staticParams"/>提供的。

 

2.1.2 设置动态数据的注入

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/param" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class ParamAction extends ActionSupport {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name:"+name);
        System.out.println("age:"+age);
        return Action.NONE;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">
        </action>

    </package>

</struts>
  • 访问地址:http://localhost:8080/项目名/param就可以看到效果

 

  • 【注】:这个功能是由<interceptor-ref name="params"/>实现的。

 

2.2 创建独立的model对象,页面通过OGNL表达式封装

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/param" method="post">
    姓名:<input type="text"  name="student.name"/><br/>
    年龄:<input type="text" name="student.age" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
  • Student.java
package com.xuweiwei.action;

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class ParamAction extends ActionSupport {
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name:"+student.getName());
        System.out.println("age:"+student.getAge());
        return Action.NONE;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">
        </action>

    </package>

</struts>
  • 访问地址:http://localhost:8080/项目名/param就可以看到效果。

 

2.3 使用ModelDrivern接口,对请求数据进行封装 

  • index.jsp 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/param" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
  • Student.java
package com.xuweiwei.action;

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class ParamAction extends ActionSupport implements ModelDriven<Student> {
    private Student student  =  new Student();

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name:"+student.getName());
        System.out.println("age:"+student.getAge());
        return Action.NONE;
    }

    @Override
    public Student getModel() {
        return student;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">
        </action>

    </package>

</struts>
  • 访问地址:http://localhost:8080/项目名/index.jsp可以看到效果。

 

  • 【注】:此功能的实现是由<interceptor-ref name="modelDriven"/>拦截器实现的。

 

3 类型转换

3.1 类型转换的概念

  • 用户所有输入的都是字符串。
  • 显示出来的都是字符串。 

 

  • 在开发中,类型转换:String-->其他类型(存数据的时候),其他类型-->String(取数据的时候)。

 

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>

  <form action="${pageContext.request.contextPath}/param" method="post">
    姓名:<input type="text"  name="name"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

public class ParamAction extends ActionSupport  {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name="+name+",birthday="+birthday);
        return Action.NONE;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">

        </action>

    </package>

</struts>
  • 访问地址:http://localhost:8080/项目名/index.jsp就能看到效果。

 

3.2 自定义类型转换

  • Struts2提供常规的类型装换,可以对常用的数据类型进行转换,但是如果目标类型是一个特殊类型的时候,则需要自定义类型转换器。
  • Struts2的类型转换器实际上都是基于OGNL实现的。

 

  • 只需要继承StrutsTypeConverter类即可,。

 

  • 示例:自定义类型转换器
    • MyConverter.java  
package com.xuweiwei.converter;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.util.StrutsTypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 自定义类型转换器
 */
public class MyConverter extends StrutsTypeConverter {
    //将字符串转换为Date类型
    @Override
    public Object convertFromString(Map map, String[] strings, Class aClass) {
        if(aClass.equals(Date.class)){
           if(strings != null && strings.length != 0){
               String str = strings[0];
               try {
                   return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str);
               } catch (ParseException e) {
                   throw new RuntimeException("转换失败"+e);
               }
           }
          
        }
        return null;

    }

    /**
     * 将Date类型转换为String类型
     * @param map
     * @param o
     * @return
     */
    @Override
    public String convertToString(Map map, Object o) {
        if(o instanceof Date){
            Date date = (Date) o;
            try {
                return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
            } catch (Exception e) {
                throw new RuntimeException("转换失败"+e);
            }
        }

        return null;
    }
}
    • 注册类型转换器:
      • ①局部类型转换器:编写一个名为类名-conversion.properties的文件,必须和Action在同一个包中。    
birthday=com.xuweiwei.converter.MyConverter
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

public class ParamAction extends ActionSupport  {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name="+name+",birthday="+birthday);
        return Action.NONE;
    }
}
      • ②全局类型转换器:在类路径(WEB-INF/classes)下新建一个名为xwork-conversion.properties    
java.util.Date=com.xuweiwei.converter.MyConverter

 

3.3 类型中的转换错误

  • Struts2通过conversionError来进行类型转换的错误处理。
  • 如果Struts2的类型转换器质性类型转换的时候出现错误,该拦截器将错误的信息封装成表单域错误,并将这些错误信息放入到ActionContext中。
  • 使用类型转换中的错误处理Action必须继承ActionSupport。
  • 在自定义的类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入一个名为input的逻辑视图。
  • 在Action所在的包中,创建一个名为类名.proerptes的文件,在其中配置信息:invalid.fieldvalue.属性名=错误信息。
  • 在input逻辑视图对应的jsp页面中,通过<s:fieldError/>输出类型错误信息。

 

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/param" method="post">
    姓名:<input type="text"  name="name"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
  • ParamAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

public class ParamAction extends ActionSupport  {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name="+name+",birthday="+birthday);
        return Action.NONE;
    }
}
  • ParamAction.properties
invalid.fieldvalue.birthday=出生日期错误
  • MyConverter.java
package com.xuweiwei.converter;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.util.StrutsTypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 自定义类型转换器
 */
public class MyConverter extends StrutsTypeConverter {
    //将字符串转换为Date类型
    @Override
    public Object convertFromString(Map map, String[] strings, Class aClass) {
        if(aClass.equals(Date.class)){
           if(strings != null && strings.length != 0){
               String str = strings[0];
               try {
                   return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str);
               } catch (ParseException e) {
                   throw new RuntimeException("转换失败"+e);
               }
           }

        }
        return null;

    }

    /**
     * 将Date类型转换为String类型
     * @param map
     * @param o
     * @return
     */
    @Override
    public String convertToString(Map map, Object o) {
        if(o instanceof Date){
            Date date = (Date) o;
            try {
                return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
            } catch (Exception e) {
                throw new RuntimeException("转换失败"+e);
            }
        }

        return null;
    }
}
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">

        <action name="param" class="com.xuweiwei.action.ParamAction" method="execute">
            <result name="input">/index.jsp</result>
        </action>

    </package>

</struts>

 

4 数据校验

4.1 数据校验的方式

  • 客户端数据校验:javascript
  • 服务器端数据校验:代码
  • 实际开发:客户端数据校验+服务器端数据校验

 

4.2 Struts2的服务器校验(前提是Action需要继承ActionSupport类)

  • 编程式校验:Action中写代码。 
  • 声明式校验:写配置文件。  

 

4.3 编程式数据校验

4.3.1 针对Action类的所有方法进行校验

  • 在Action类中重写validate()方法。

 

  • 示例:
    • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>
    • save.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
    • PersonAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 校验
     */
    @Override
    public void validate() {
        if(StringUtils.isEmpty(name)){
            addFieldError("name","姓名不能为空");
        }
    }

    public String save(){
        System.out.println(name+","+age+","+birthday);
        return Action.NONE;
    }

}
    • struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/index.jsp</result>
        </action>
    </package>

</struts>

 

  • 示例:证明是全局校验
  • 场景:对增加、删除需要校验,但是对查询却不需要校验。
    • save.jsp  
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
    • update.jsp  
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
    • PersonAction.java  
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 校验
     */
    @Override
    public void validate() {
        if(StringUtils.isEmpty(name)){
            addFieldError("name","姓名不能为空");
        }
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
    • struts.xml  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
    • 当我们访问:http://localhost:8080/项目名/queryAll的时候,会出现如下的错误。  

技术分享图片

 

4.3.2 针对Action类的指定方法进行校验

  • 方式一:通过注解方式 
    • 在指定的方法上加@SkipValidation  
    • 示例:
      • web.xml      
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>
      • save.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • update.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • PersonAction.java    
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 校验
     */
    @Override
    public void validate() {
        if(StringUtils.isEmpty(name)){
            addFieldError("name","姓名不能为空");
        }
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }
    @SkipValidation
    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
      • struts.xml    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
      • f访问:http://localhost:8080/项目名/queryAll,不会出现错误。    

 

  • 方式二:
    • 如果要校验的方法的名称是save,那么要写的校验方法的名称是validateSave()。  
    • 示例:
      • web.xml      
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>
      • save.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • update.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • PersonAction.java    
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 校验
     */
    public void validateSave() {
        if(StringUtils.isEmpty(name)){
            addFieldError("name","姓名不能为空");
        }
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }
    @SkipValidation
    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
      • struts.xml    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
      • 访问:http://localhost:8080/项目名/queryAll,不会出现错误。    

 

4.4 声明式校验

4.4.1 针对Action类中的所有方法进行校验

  • 是基于xwork框架的。 
  • 只需要在编写Action的名称-validation.xml即可。

 

  • 示例:
    • save.jsp  
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
    • update.jsp  
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
    • PersonAction.java  
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
    • struts.xml  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
    • PersonAction-validation.xml  
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>名字不能为空</message>
        </field-validator>
    </field>
</validators>
    • 我们通过访问http://localhostL8080/项目名/save.jsp和http://localhost:8080/项目名/update.jsp,会发现只要姓名为空,那么Struts2框架就会校验。  

 

4.4.2 针对Action类中的指定方法进行校验

  •  方式一:在4.4.1方式的基础上使用@SkipValidation注解即可。
    • 示例:
      • web.xml    
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>
      • save.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • update.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • PersonAction.java    
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.validation.SkipValidation;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    @SkipValidation
    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
      • PersonAction-validation.xml    
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>名字不能为空</message>
        </field-validator>
    </field>
</validators>
      • struts.xml    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
      • 当我们访问的是http://localhost:8080/项目名/queryAll的时候,发现Struts2的校验并没有起作用。    

 

  • 方式二:如果需要校验的动作类的动作方法是save,那么校验的配置文件就是PersonAction-save-validation.xml
    • 示例:
      • web.xml    
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


</web-app>
      • save.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/save" method="post">
    姓名:<input type="text"  name="name"/><br/>
    年龄:<input type="text" name="age"/><br/>
    出生日期:<input type="text" name="birthday" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • update.jsp    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <s:fielderror/>
  <form action="${pageContext.request.contextPath}/update" method="post">
    姓名:<input type="text"  name="name" value="23"/><br/>
    年龄:<input type="text" name="age" value="20"/><br/>
    出生日期:<input type="text" name="birthday" value="1992-02-02" /><br/>
    <input type="submit" value="提交"/><br/>
  </form>

  </body>
</html>
      • PersonAction.java    
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.validation.SkipValidation;

import java.util.Date;

public class PersonAction extends ActionSupport {
    private String name;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String save(){
        System.out.println("保存:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String update(){
        System.out.println("更新:"+name+","+age+","+birthday);
        return Action.NONE;
    }

    public String queryAll(){
        System.out.println("查询:"+name+","+age+","+birthday);
        return Action.NONE;
    }


}
      • PersonAction-save-validation.xml    
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>名字不能为空</message>
        </field-validator>
    </field>
</validators>
      • struts.xml    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>


    <package name="default" namespace="/" extends="struts-default">
        <action name="save" class="com.xuweiwei.action.PersonAction" method="save">
            <result name="input" >/save.jsp</result>
        </action>
        <action name="update" class="com.xuweiwei.action.PersonAction" method="update">
            <result name="input" >/update.jsp</result>
        </action>
        <action name="queryAll" class="com.xuweiwei.action.PersonAction" method="queryAll">
        </action>
    </package>

</struts>
      • 当我们访问http://localhost:8080/项目名/update.jsp将name的值设置为空和访问http://localhost:8080/项目名/queryAll的时候会发现Struts2的校验框架并没有起作用。    

以上是关于Struts2 的主要内容,如果未能解决你的问题,请参考以下文章

struts2怎么防止sql注入

struts2请求过程源代码分析

[struts2学习笔记] 第五节 编写struts2的action代码

Struts2 s2-032远程代码执行分析

S2-053:Apache Struts2远程代码执行漏洞(中危)

struts2 s2-062 ONGL远程代码执行