Struts之验证表单提交参数的三种方法

模型驱动获取表单数据

web.xml
 <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>/*</url-pattern>
  </filter-mapping>
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="struts" namespace="/" extends="struts-default" >
        <action name="UserAction" class="com.lanou3g.UserAction" method="register" >
            <result name="success">/hello.jsp</result>
        </action>
        <action name="UserAction" class="com.lanou3g.UserAction" method="query" >
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>
User.java
package com.lanou3g;

public class User {
    private String username;
    public User(String username) {
        super();
        this.username = username;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "User [username=" + username + "]";
    }   
}
UserAction.java
package com.lanou3g;

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

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

    public String register() {
        System.out.println("我在register方法中");
        System.out.println(user);
        return SUCCESS;
    }
    public String query() {
        System.out.println("我在query方法中");
        System.out.println(user);
        return SUCCESS;
    }   
    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }
}
query.jsp
<title>Insert title here</title>
</head>
<body> 
    <form action="${pageContext.request.contextPath }/UserAction" method="post">
        姓名<input type="text" name="username" />
        <input type="submit" value="提交" >
    </form>
</body>
</html>
register.jsp
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/UserAction" method="post">
        用户名:<input type="text" name="username" />
        <input type="submit" value="注册" />
    </form>
</body>
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
    你好啊! 世界
</body>
</html>

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

验证表单提交参数的方法一

判断数据的合法性StringUtils.isEmpty(user.getUsername())
相当于
user.getUsername() != null && user.getUsername().length() != 0
import org.apache.commons.lang3.StringUtils 包中封装好了的方法 可以直接拿来用

validate() 此方法中有if语句 此方法会验证Action类中的所有方法 
如果不满足if语句 则会顺利走过去 此方法没有返回值 
如果满足if语句 则代表输入的user信息不合格 将会返回input字符串
在action中可以定义result接收 此字符串 然后返回到自己指定的页面

this.addFieldError("username", "用户名不能为空")
存储不合法信息 可以在页面中提取到这句话 然后在页面输出
提取方式为:<s:property value="fieldErrors.username[0]"/>

配置一下 表单验证不合法的路径去向
注意:如果重定向 相当于重新访问该页面 也会重新创建一个actionContext处理
会导致之前保存的信息丢失 所以要使用请求转发

结果:只要输入不和规范 就会进入if语句 然后接收到input返回值(系统内部返回的 我们看不见 只能接收) 都会被拦截
UserAction.java
package com.lanou3g;

import org.apache.commons.lang3.StringUtils;

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

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

    public String register() {
        System.out.println("我在register方法中");
        System.out.println(user);
        return SUCCESS;
    }
    public String query() {
        System.out.println("我在query方法中");
        System.out.println(user);
        return SUCCESS;
    }   
    @Override
    public void validate() {
        System.out.println("此句打印出来 就代表validate方法没有返回数值");
        if(StringUtils.isEmpty(user.getUsername())) {
            System.out.println("打印这句代表用户名为空 拦截了 且系统返回字符串为input");
            this.addFieldError("username", "用户名不能为空");
        }
    }
    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }
}
struts.xml
<struts>
    <package name="struts" namespace="/" extends="struts-default" >
        <action name="UserAction" class="com.lanou3g.UserAction" method="register" >
            <result name="success">/hello.jsp</result>
            <result name="input">/register.jsp</result>
        </action>
        <action name="UserAction" class="com.lanou3g.UserAction" method="query" >
            <result name="success">/hello.jsp</result>
            <result name="input">/query.jsp</result>
        </action>
    </package>
</struts>
register.jsp
</head>
<body>
    <form action="${pageContext.request.contextPath }/UserAction" method="post">
        用户名:<input type="text" name="username" />
        <s:property value="fieldErrors.username[0]"/>
        <input type="submit" value="注册" />
    </form>
</body>
</html>
query.jsp
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
    <form action="${pageContext.request.contextPath }/UserAction" method="post">
        姓名<input type="text" name="username" />
        <s:property value="fieldErrors.username[0]"/>
        <input type="submit" value="提交" >
    </form>
</body>
</html>
web.xml
<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>/*</url-pattern>
</filter-mapping>
hello.jsp
<title>Insert title here</title>
</head>
<body>
    你好啊! 世界
</body>
</html>

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

验证表单提交参数的方法二-硬编码-用java代码进行验证配置

指定被验证的动作方法 没有被指定的将不验证
方法的命名规范 小驼峰 validate + 要验证方法名(首字母大写)
该方法 struts 在验证拦截时 会扫描你整个动作类的方法
查找是否有validate开头的方法 和 名字后面的动作方法
有就拦截   没有就不拦截(这里面只有这种方法  没有validate方法)
拦截后 直接返回input 也就是执行完return 那么此类运行也就结束了
也就是不会再在此类中执行其他方法
UserAction.java
package com.lanou3g;

import org.apache.commons.lang3.StringUtils;

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

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

    public String register() {
        System.out.println("我在register方法中");
        System.out.println(user);
        return SUCCESS;
    }
    public String query() {
        System.out.println("我在query方法中");
        System.out.println(user);
        return SUCCESS;
    }   

    public void validateQuery() {
        if(StringUtils.isEmpty(user.getUsername())) {
            System.out.println("拦截了 返回值为input");
            this.addFieldError("username", "你啥也没填");
        }
    }

    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }
}
User.java
package com.lanou3g;

public class User {
    private String username;
    public User(String username) {
        super();
        this.username = username;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String toString() {
        return "User [username=" + username + "]";
    }   
}
web.xml
<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>/*</url-pattern>
 </filter-mapping>
query.jsp
<body> 
     来啊  拦截我啊
    <form action="${pageContext.request.contextPath }/queryAction" method="post">
        姓名<input type="text" name="username" />
        <s:property value="fieldErrors.username[0]"/>
        <input type="submit" value="提交" >
    </form>
</body>
register.jsp
<body>
    <form action="${pageContext.request.contextPath }/UserAction" method="post">
        用户名:<input type="text" name="username" />
        <s:property value="fieldErrors.username[0]"/>
        <input type="submit" value="注册" />
    </form>
</body>
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="struts" namespace="/" extends="struts-default" >
        <action name="UserAction" class="com.lanou3g.UserAction" method="register" >
            <result name="success">/hello.jsp</result>
            <result name="input">/register.jsp</result>
        </action>
        <action name="queryAction" class="com.lanou3g.UserAction" method="query" >
            <result name="success">/hello.jsp</result>
            <result name="input">/query.jsp</result>
        </action>
    </package>
</struts>
说明
只有当query.jsp提交数据时 才不会走 validateQuery中的if方法 也就不会有返还值 接着 执行里面的query方法 控制台打印用户名
根据返还success 进行页面跳转
当query.jsp中提交内容为空时 便会走validateQuery中的if方法 这时 便会返还input之后avtion中的result便会接收input 返还
原页面 并且原页面会输出validateQuery中if语句中保存的错误信息
当register.jsp中提交为空时 UserAction里面没有与之匹配的拦截方法 因此便会走register方法 这时返还值为success 控制台打印
出user对象
当register.jsp中提交不为空时 UserAction里面任然没有与之匹配的拦截方法 因此便会走register方法 这时返还值为success 控制台打印
出user对象

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

验证表单提交参数的方法三-软编码-用配置文件进行验证配置

域硬编码的区别就是 删除硬编码UserAction.java中的
    public void validateQuery() {
        if(StringUtils.isEmpty(user.getUsername())) {
            System.out.println("拦截了 返回值为input");
            this.addFieldError("username", "你啥也没填");
        }
    }
这些代码
之后建立配置文件  从配置文件中进行拦截配置

使用配置文件配置验证
1.命名规范 动作类名 + "-" + validation
2.必须和动作类同包
软编码 会 拦截 动作类中的 所有方法
使用注解可以避免被拦截 @SkipValidation
形式为:
    @SkipValidation
    public String query() {
        return SUCCESS;
    }


验证用户名
    name:表示的是 表单提交的 name属性
    type属性在
    com.opensymphony.xwork2.validator.validators
    包下的default.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="username">
        <!--指定使用的验证器,非空验证-->
        <field-validator type="requiredstring">
            <!--验证失败的错误提示信息-->
            <message>用户名不能为空</message>
        </field-validator>
    </field>
</validators>
说明
前四张图 都是在填写信息为空时 直接提交 被拦截 然后返回主页面
后两张图 提交信息不为空 正常提交

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

将以上知识综合运用

Customer.java
package com.lanou3g;

public class Customer {
    private String username;// 用户名不能为空
    private String email;// 符合邮箱格式
    private int age;// 必须是整数 18到60
    private String password;// 密码 3-8位之间
    private String repassword;// 跟密码一样
    private String url;// 符合url的格式
    private String gender;// 性别 男女

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Customer [username=" + username + ", email=" + email + ", age=" + age + ", password=" + password
                + ", repassword=" + repassword + ", url=" + url + ", gender=" + gender + "]";
    }
}
ValidationAction.java
package com.lanou3g;

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

public class ValidationAction extends ActionSupport implements ModelDriven<Customer>{

    private Customer customer = new Customer();

    @Override
    public Customer getModel() {
        // TODO Auto-generated method stub
        return customer;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
}
ValidationAction-validation.xml
<?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">
<!-- 需求 创建jsp 写表单 显示下列所有拦截提示 -->
<validators>
    <!--验证用户名-->
    <field name="username">
        <field-validator type="requiredstring">
            <message>请输入用户名</message>
        </field-validator>
    </field>
    <!--年龄-->
    <field name="age">
        <field-validator type="int">
                <!-- 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>
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="struts" namespace="/" extends="struts-default" >
        <action name="ValidationAction" class="com.lanou3g.ValidationAction" method="execute">
            <result name="success">/success.jsp</result>
            <result name="input" >/validation.jsp</result>
        </action>
    </package>
</struts>
validation.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="${pageContext.request.contextPath }/ValidationAction"
        method="post" >
        用户名<input type="text" name="username" value="${param.username}">
        <s:property value="errors.username[0]" />
        <br /> 
        email<input type="email" name="email" value="${param.email}">
        <s:property value="errors.email[0]" />
        <br /> 
        年龄<input type="text" name="age" value="${param.age}">
        <s:property value="errors.age[0]" />
        <br /> 
        密码<input type="password" name="password" value="${param.password}">
        <s:property value="errors.password[0]" />
        <br /> 
        确认密码<input type="password" name="repassword" value="${param.repassword}">
        <s:property value="errorMessages[0]" />
        <br /> 
        网址<input type="url" name="url"  value="${param.url}">
        <s:property value="errors.url[0]" />
        <br /> 
        男<input type="radio" name="gender" value="男" ${param.gender=='男'?'checked':'' }/>  
        女<input type="radio" name="gender" value="女" ${param.gender=='女'?'checked':'' }/> 
        <s:property value="errors.gender[0]" /> 
        <br /> 
        <input type="submit" value="提交">
    </form>
</body>
<s:debug></s:debug>
</html>

这里写图片描述

上传文件

UploadAction.java
package com.lanou3g;

import java.io.File;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/*
 * struts上传
 */
public class UploadAction extends ActionSupport{
    // 声明一个File[] 属性
    // (用来接收上传的文件)
    // 并且:命名规范 这个数组的名字 为提交的name属性
    private File[] file;
    public File[] getFile() {
        return file;
    }
    public void setFile(File[] file) {
        this.file = file;
    }

    // 声一个String[] 数组 属性
    // 用来接收上传文件的名字
    // 注意:命名规范 name属性名 + FileName
    private String[] fileFileName;
    // 必须提供set/get方法
    public String[] getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String[] fileFileName) {
        this.fileFileName = fileFileName;
    }

    // 上传动作方法 
    // 上传到服务器 你这个应用下的文件夹
    public String upload() {
        /*
         * 1.获取文件上传的服务器路径(获取真实路径)
         * 2.拼接上传文件夹地址
         * 3.在服务器上创建上传的文件夹
         * 4.把struts接收到的文件 保存到该路径下
         */
        // 获取ServletContext
        ServletContext application = ServletActionContext.getServletContext();
        // 获取真实路径(服务器的硬盘路径) 传入拼接的文件夹地址
        String realPath = application.getRealPath("/upload");
        // 根据路径创建文件夹(判断文件夹不存在 再创建)
        // 用这个路径 创建一个file对象
        File f = new File(realPath);
        if(!f.exists()) {
            // 不存在 就创建 
            f.mkdir();
        }
        // 把struts接收过来的文件 放入该文件夹
        // 遍历文件数组 取出每一个文件放入
        for (int i = 0; i < file.length; i++) {
            File tempFile = file[i];
            // 取出每一个对应的文件名
            String tempFileName = fileFileName[i];
            // 直接将文件重新命名()renameTo(相当于把文件改个名剪切过去)
            tempFile.renameTo(new File(realPath, tempFileName));
        }
        /*
         * 例如 我想查看 之前上传的文件的列表(文件名字)
         * user表
         * id name age image
         *  1  dp  73  文件地址/文件名.后缀(字符串)
         */
        return SUCCESS;
    }

}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 
        设置最大上传大小
        struts.multipart.maxSize=2097152
     -->
    <constant name="struts.multipart.maxSize" value="52428800"></constant>
    <package name="struts" namespace="/" extends="struts-default" >
        <action name="UploadAction" class="com.lanou3g.UploadAction" method="upload">
            <result name="success" type="redirect" >/success.jsp</result>
        </action>
    </package>
</struts>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
    <h1>成功</h1>
</body>
</html>
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
    <!-- 上传文件 必须使用post方式提交表单 post将提交的内容转为二进制 -->
    <!-- 表单 默认提交的数据类型 enctype -->
    <!-- application/x-www-form-urlencoded -->
    <!-- 上传使用的enctype multipart/form-data 多部分上传 -->
    <form action="${pageContext.request.contextPath }/UploadAction" method="post" enctype="multipart/form-data">
        <input type="file" name="file" >
        <input type="file" name="file" >
        <input type="file" name="file" >
        <input type="submit" value="上传"> 
    </form>
</body>
</html>

下载文件

DownloadAction.java
package com.lanou3g;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
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;

    public String getFileName() {
        // 修改编码格式 这个get方法是给struts提供的
        // 当系统调用时 修改编码格式
        try {
            fileName = new String(fileName.getBytes(), "iso-8859-1");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            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;
    }

    // 声明一个读取文件的字节流属性
    // (把这个流创建出来)其它事交给struts去干
    // 这个名字 没有规范 但是你要告诉struts 你给他的是哪个流
    // 提供set
    private InputStream fileInputStream;

    // 下载方法
    public String download() throws FileNotFoundException {
        /*
         * 1.获取用户要下载的文件的真实路径(服务器路径)
         * 2.用这个路径初始化 字节流
         */
        ServletContext application = ServletActionContext.getServletContext();
        String path = application.getRealPath("/upload/" + fileName);
        System.out.println(fileName);
        System.out.println(path);
        fileInputStream = new FileInputStream(path);
        return SUCCESS;
    }
}
struts.xml
<!-- 配置下载的action类 -->
        <action name="DownloadAction" class="com.lanou3g.DownloadAction" method="download">
            <!-- 告诉浏览器 我的返回结果是个流类型 -->
            <result name="success" type="stream">
                <!-- 告诉浏览器 相当于添加响应头 -->
                <!--stream类型 是专门用来下载的-->
                <!--告诉浏览器 当前数据类型是下载-->
                <param name="contentType">application/octet-stream</param>
                <!--动态获取下载的文件名 ognl表达式 -->
                <param name="contentDisposition">attachment;filename=${fileName}</param>
                <!--告诉struts 我们下载的输入流 对象名-->
                <param name="inputName">fileInputStream</param>
            </result>
        </action>
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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 }/DownloadAction" method="post">
        下载文件名<input type="text" name="fileName">
        <input type="submit" value="下载">
    </form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值