模型驱动获取表单数据
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>