Java 之 struts 表单验证及文件的上传下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huzongnan/article/details/79979944

表单提交数据的验证

硬编码

使用 java 代码进行验证配置
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;

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

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();

    // 声明一个注册的动作方法
    @SkipValidation
    public String register() throws Exception {
        return "success";
    }
    @Override
    public User getModel() {
        return user;
    }
    // 验证表单提交参数的方法
    // 该方法会验证本 Action 类中所有的方法!
    @Override
    public void validate() {
        // 判断数据的合法性
        if (StringUtils.isEmpty(user.getUsername())) {
            // 数据为空,不合法
            // 添加不合法信息
            /*
             * 参数一:表单中对应的字段名(name 属性的名字) 参数二:错误信息
             */
            // 当信息不合法的时候,会默认去找字符串 input 结果所对应的页面
            this.addFieldError("username", "账号不能为空!");
        }
    }
}
同动作类下,如果不想验证该方法
使用注解 @SkipValidation 跳过验证
@SkipValidation
public String query() {
    return SUCCESS;
}

软编码

使用配置文件 xml 或者 properties 进行验证配置
<?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>
    <!-- 
        使用配置文件配置验证 
        1.命名规范 动作类名-validation.xml 
        2.必须和动作类同包

        软编码方式也会拦截动作类中的所有方法
         -->
    <!-- 验证用户名
        name:表示表单提交的 name 属性
         -->
    <field name="username">
        <!-- 指定使用的验证器,非空验证 -->
        <!-- com.opensymphony.xwork2.validator.validators.default.xml -->
        <field-validator type="requiredstring">
            <!-- 验证失败的错误提示信息 -->
            <message>用户名不能为空</message>
        </field-validator>
    </field>
</validators>
跳过验证方式二(指定要被验证的动作方法) 命名规范:小驼峰 validate + 要验证的方法名(首字母大写) 
相当于 struts 在验证拦截时,会扫描整个动作类中的方法,查找是否有 validate 开头的方法和名字后面的动作方法
有则进行拦截
public void validateQuery() {
    if (StringUtils.isEmpty(user.getUsername())) {
        this.addFieldError("username", "空!");
    }
}
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class ValidationAction extends ActionSupport implements ModelDriven<Customer> {
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }
    public String registerCustomer() throws Exception {

        return "success";
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.dtd">
<validators>
    <!--验证用户名-->
    <field name="username">
        <field-validator type="requiredstring">
            <message>请输入用户名</message>
        </field-validator>
    </field>
    <!--年龄-->
    <field name="age">
        <!-- 必须是整数 -->
        <field-validator type="int">
            <!-- 指定范围 -->
            <param name="max">60</param>
            <param name="min">18</param>
            <message>你年龄不符合要求</message>
        </field-validator>
    </field>
    <!--验证邮箱-->
    <field name="email">
        <field-validator type="email">
            <message>邮箱不对呀</message>
        </field-validator>
    </field>

    <!--验证密码-->
    <field name="password">
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="maxLength">8</param>
            <param name="minLength">3</param>
            <message>密码长度不符合要求</message>
        </field-validator>
    </field>

    <!--验证url-->
    <field name="url">
        <field-validator type="url">
            <message>url不符合要求</message>
        </field-validator>
    </field>
    <!--性别-->
    <field name="gender">
        <field-validator type="required">
            <message>必须选择性别</message>
        </field-validator>
    </field>
    <!--确认密码
    与其他的字段判断方式不同,这是判断两个字段的值
    跟标签选择 校验器,校验器类型为表达式-->
    <validator type="expression">
        <param name="expression">
            password == repassword
        </param>
        <message>两次密码不一致</message>
    </validator>
</validators>
<%@ 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>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/ValidationAction_registerCustomer" method="post">
        <!-- 使用 el 表达式进行数据回显
            把表单中提交的数据存入 param 
            相当于一个 map 中
            .后面是 name 属性 -->
        用户名:<input type="text" name="username" value="${param.username }">
        <font color="red"><s:property value="fieldErrors.username[0]"/></font>
        <br>
        邮箱:<input type="e-mail" name="email" value="${param.email }">
        <font color="red"><s:property value="fieldErrors.email[0]"/></font>
        <br>
        年龄:<input type="text" name="age" value="${param.age }">
        <font color="red"><s:property value="errors.age[0]"/></font>
        <br>
        密码:<input type="password" name="password" value="${param.password }">
        <font color="red"><s:property value="fieldErrors.password[0]"/></font>
        <br>
        确认密码:<input type="password" name="repassword" value="${param.repassword }">
        <font color="red"><s:property value="errorMessages[0]" /></font>
        <br>
        url:<input type="url" name="url" value="${param.url }">
        <font color="red"><s:property value="fieldErrors.url[0]"/></font>
        <br>
        性别:男<input type="radio" name="gender" value="男" ${param.gender=='男'?'checked':''}><input type="radio" name="gender" value="女"${param.gender=='女'?'checked':''}>
        <font color="red"><s:property value="fieldErrors.gender[0]"/></font>
        <br>
        <input type="submit" value=" 提交 "> 
    </form>
    <s:debug></s:debug>
</body>
</html>
<action name="UserAction_*" class="com.xxx.UserAction"
            method="{1}">
    <result name="success">/success.jsp</result>
    <!-- 配置一下表单验证不合法路径去向 -->
    <!-- 注意:如果重定向,相当于重新访问该页面,也会重新创建一个 ActionContext 出来,这样会导致之前保存的信息丢失 所有要使用请求转发 -->
    <result name="input">/register.jsp</result>
</action>
<!-- 测试同类的方法是否拦截 -->
<action name="queryAction" class="com.xxx.UserAction"
    method="query">
    <result name="success">/success.jsp</result>
    <result name="input">/query.jsp</result>
</action>
<action name="ValidationAction_*"
            class="com.xxx.ValidationAction" method="{1}">
    <result name="success">/success.jsp</result>
    <result name="input">/registerCustomer.jsp</result>
</action>

这里写图片描述

上传文件

import java.io.File;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
    // 声明一个 File[] 属性(用来接收上传的文件)
    // 注意:命名规范!文件数组的名字为表单提交的 name 属性
    private File[] files;

    // 声明一个 String[] 数组,用来接收上传文件的名字
    // 注意:命名规范! name 属性名 + FileName
    private String[] filesFileName;

    // 必须提供 set/get 方法
    public File[] getFiles() {
        return files;
    }

    public void setFiles(File[] files) {
        this.files = files;
    }

    public String[] getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(String[] filesFileName) {
        this.filesFileName = filesFileName;
    }

    // 上传动作方法
    /*
     * 上传文件会上传到服务器中你的工程文件夹下
     */
    public String upload() throws Exception {
        /*
         * 1.获取文件上传的服务器路径(获取真实路径)
         * 2.拼接上传文件夹路径 
         * 3.在服务器上创建上传的文件夹 
         * 4.把 struts 接收到的文件保存到该路径下
         */
        // 获取 ServletContext
        ServletContext application = ServletActionContext.getServletContext();
        // 获取真实路径(服务器的硬盘路径)
        // 参数:拼接的文件夹地址
        String realPath = application.getRealPath("/upload");
        System.out.println(realPath);
        // 根据路径,创建文件夹(判断文件夹不存在,再创建)
        // 用这个路径创建一个 File 对象
        File file = new File(realPath);
        if (!file.exists()) {
            // 不存在,创建
             file.mkdir();
        }
        // 把 struts 接收过来的文件放入该文件夹中
        // 遍历文件数组
        for (int i = 0; i < files.length; i++) {
            // 取出每个文件放入
            File tempFile = files[i];
            // 取出每个对应的文件名
            String tempFileName = filesFileName[i];
            // 直接将文件重新命名 renameTo(把该文件改个名剪切过去) 方法
            tempFile.renameTo(new File(realPath, tempFileName));
        }
        /*
         * 查看上传的文件列表
         */
        return "success";
    }

}


<body>
    <!-- 上传文件必须使用 post 方式提交表单 -->
    <!-- 表单默认提交的数据类型: enctype -->
    <!-- enctype="application/x-www-form-urlencoded" -->
    <!-- 上传使用 enctype="multipart/form-data" 多部分上传 -->
    <form action="${pageContext.request.contextPath }/UploadAction_upload" method="post" enctype="multipart/form-data">
        <input type="file" name="files">
        <input type="file" name="files">
        <input type="file" name="files">
        <input type="submit" value=" 上传文件 ">
    </form>
</body>

<action name="UploadAction_*" class="com.xxx.UploadAction"
            method="{1}">
    <result name="success" type="redirect">/success.jsp</result>
</action>
<!-- 设置最大上传大小 -->
<constant name="struts.multipart.maxSize" value="5368709120"></constant>

下载

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class DownloadAction extends ActionSupport {
    // 获取表单传过来的文件名
    // 这里会出现文件名的中文乱码问题
    // 需要修改 filename 的编码格式
    private String filename;
    // 声明一个读取文件的字节流属性(创建这个流,其他事 struts 来做)
    private InputStream fileInputStream;// 这个名字无规范,但是需要通知 struts, 创建的是什么流

    public String getFilename() {
        // 修改编码格式
        // 方法是给 struts 提供的
        // 当系统调用时,修改编码格式
        try {
            filename = new String(filename.getBytes(), "iso-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public InputStream getFileInputStream() {
        return fileInputStream;
    }

    public void setFileInputStream(InputStream fileInputStream) {
        this.fileInputStream = fileInputStream;
    }

    // 下载方法
    public String download() throws Exception {
        /*
         * 1.获取用户要下载的文件的真实路径(服务器路径) 2.用这个路径初始化字节流
         */
        ServletContext application = ServletActionContext.getServletContext();
        String realPath = application.getRealPath("/upload/" + filename);
        fileInputStream = new FileInputStream(realPath);
        return "success";
    }

}
<body>
    <form action="${pageContext.request.contextPath }/DownloadAction_download" method="post">
        下载文件名:<input type="text" name="filename">
        <input type="submit" value=" 下载 ">
    </form>
</body>

<!-- 配置下载 Action 类 -->
<action name="DownloadAction_*" class="com.xxx.DownloadAction" method="{1}">
    <!--stream类型 是专门用来下载的 -->
    <result name="success" type="stream">
        <!--告诉浏览器 当前数据类型是下载 -->
        <param name="contentType">application/octet-stream</param>
        <!--动态获取下载的文件名 ognl 表达式,可以动态获取文件名,相当于获取该对象的值 -->
        <param name="contentDisposition">attachment;filename=${filename}</param>
        <!--告诉struts 我们下载的输入流 对象名 -->
        <param name="inputName">fileInputStream</param>
    </result>
</action>
阅读更多

没有更多推荐了,返回首页