一、请求数据的自动封装
1.1 请求数据自动封装的实现
+++ 请求数据的自动封装:
1. jsp表单数据填充到action中属性
action中的属性必须有set方法即可。
form表单的name名称为action中的属性名。
2.jsp表单数据填充到action中对象的属性
action中的对象必须给set和get方法
form表单的name名称为action中的对象.属性
+++ 请求数据自动封装的原理
在struts-default.xml中配置的拦截器:
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
该拦截器实现了请求数据的自动封装
1.1.1 Struts2 对象数据封装
Struts2首先通过反射技术调用address的默认构造器创建address对象,
然后再通过反射技术调用address中与请求参数同名的属性的setter方法来
获取请求参数值。
===>>> register.jsp
===>>> UserAction.java
1.1.2 Struts2 集合数据封装
===>>> register.jsp
===>>> UserAction.java
1.2 请求数据的自动封装的原理
请求数据的自动封装的原理:
Parameters拦截器会自动获取值栈对象中的栈顶对象,
然后将请求数据封装到栈顶对象中。类似于BeanUtils组件。
1.3 案例
1.3.1 jsp表单数据填充到action中的属性
OrderController.java
public class OrderController extends ActionSupport {
private String name;
private int num;
private String content;
private Date date;
public void setDate(Date date) {
this.date = date;
}
public void setName(String name) {
this.name = name;
}
public void setNum(int num) {
this.num = num;
}
public void setContent(String content) {
this.content = content;
}
public String addOrder() {
System.out.println(name);
System.out.println(num);
System.out.println(content);
System.out.println(date);
return SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="addOrder" class="org.jsoft.mrp.OrderController" method="addOrder">
<result name="success" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./addOrder" method="get">
商品名:<input type="text" name="name"><br/>
数量:<input type="text" name="num"><br/>
备注:<input type="text" name="content"><br/>
日期:<input type="text" name="date"><br/>
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
测试:
1.3.2 jsp表单数据填充到action中的对象
OrderEntity .java
public class OrderEntity {
private String name;
private int num;
private String content;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
OrderController.java
public class OrderController extends ActionSupport {
private OrderEntity order;
public OrderEntity getOrder() {
return order;
}
public void setOrder(OrderEntity order) {
this.order = order;
}
public String addOrder() throws UnsupportedEncodingException {
System.out.println(new String(order.getName().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getNum());
System.out.println(new String(order.getContent().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getDate());
return SUCCESS;
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./addOrder" method="get">
商品名:<input type="text" name="order.name"><br/>
数量:<input type="text" name="order.num"><br/>
备注:<input type="text" name="order.content"><br/>
日期:<input type="text" name="order.date"><br/>
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="addOrder" class="org.jsoft.mrp.OrderController" method="addOrder">
<result name="success" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
测试:
1.3.3 jsp表单数据填充到action中的集合对象
二、请求数据自动封装时的类型转换
2.1 请求数据类型转换的原因
+++ Struts2中为什么要类型转换?
HTML表单采集数据 ---> 提交表单 ---> Action
1.
底层依赖HTTP传递数据,而HTTP协议中 没有 “类型” 的概念. 每一项
表单输入只可能是一个字符串或一个字符串数组。
2.
在服务器端Action中必须把 String 转换为业务需要的特定的数据类型
+++ Struts2中如何传递请求参数给Action?
1.
Struts2框架会将表单的参数以同名的方式设置给对应Action的属性中。
2.
该工作主要是由Parameters拦截器做的。
而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作。类似于: Beanutils工具。
2.2 Struts2 类型转换失败会自动返回一个input的结果标记
Struts2 类型转换失败会自动返回一个input的结果标记。
【前提: 继ActionSupport】
因此开发者需要在配置action时,要配置一个名为input的result。
用于专门来处理类型转换错误。
案例
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="hello" class="org.jsoft.mrp.HelloAction" >
<result name="success">/index.jsp</result>
<result name="input">/demo.jsp</result>
</action>
</package>
</struts>
HelloAction.java
public class HelloAction extends ActionSupport {
public String login() {
return "success";
}
public String register() {
return "success";
}
}
2.3 请求数据的自动类型转换
+++ jsp提交的表单数据,struts会自动转换action中属性的类型。
1.String到基本数据类型的转换是自动的.
2.String到Date日期类型的转换是有条件的。
默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。
3.对于复杂类型的数据必须要注册类型转换器(如其他格式的日期类型的数据)
三、请求数据的手动类型转换
+++ jsp提交的表单数据,struts会自动转换action中属性的类型。
1.String到基本数据类型的转换是自动的.
2.String到Date日期类型的转换是有条件的。
默认输入框输入的格式必须是yyyy-MM-dd,其他格式无法转换。
3.对于复杂类型的数据必须要注册类型转换器(如其他格式的日期类型的数据)
+++ stuts自定义类型转换器:
1.局部类型转换器
2.全局类型转换器
3.1 Struts2 类型转换器的API
|---TypeCOnvert 转换器接口
|-----DefaltTypeConvert 默认类型转换器
|--StrutsTypeConvert 用户自定义的转换器,继承此类即可。
3.2 局部类型转换器(配置某个action的类型转换)
局部类型转换器
1.自定义转换器
---》 继承StrutsTypeConvert类(重写convertFromString和convertToString方法。)
2.建立配置文件
---》在Action所在的当前包中建立properties配置文件
ActionClassName-conversion.properties
eg:
UserAction-conversion.properties
3.内容:
需要转换的字段名=自定义的类型转换器全路径
eg:
user.bitrh=org.jsoft.convert.MyDateConvert
案例:
OrderAction.java
该包放在src/org/jsoft/demo/OrderAction.java
public class OrderAction extends ActionSupport {
private OrderEntity order;
public OrderEntity getOrder() {
return order;
}
public void setOrder(OrderEntity order) {
this.order = order;
}
public String addOrder() throws UnsupportedEncodingException {
System.out.println(new String(order.getName().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getNum());
System.out.println(new String(order.getContent().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getDate());
return SUCCESS;
}
}
MyDateConvert .java 自定义类型转换器
public class MyDateConvert extends StrutsTypeConverter{
/**
* String转换为指定的类型
* context: 当前环境上下文
* values:jsp表单提交的数据
* toClass:要转换的数据类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断内容不能为空
if(values==null||values.length==0) {return null ;}
//判断日期类型,只能转换日期类型的数据
if(!toClass.equals(Date.class)){return null;}
//转换日期
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
return sdf.parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
@Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
OrderAction-conversion.properties
该配置文件放在OrderAction的同一包下。
order.date=org.jsoft.convert.MyDateConvert
OrderEntity.java
public class OrderEntity {
private String name;
private int num;
private String content;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="addOrder" class="org.jsoft.mrp.OrderAction" method="addOrder">
<result name="success" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./addOrder" method="post">
商品名:<input type="text" name="order.name"><br/>
数量:<input type="text" name="order.num"><br/>
备注:<input type="text" name="order.content"><br/>
日期:<input type="text" name="order.date"><br/>
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
测试:
3.3 全局类型转换器(配置全局的类型转换)
全局类型转换器
1.自定义转换器.
---》继承StrutsTypeConvert类(重写convertFromString和convertToString方法。)
2.建立配置文件(src/xwork-conversion.properties)
---》在项目的src目录下建立以下固定文件
xwork-conversion.properties
3.内容:
需要转换的类的类名=自定义的类型转换器全路径
eg:
java.util.Date=org.jsoft.convert.MyDateConvert
案例:
OrderAction.java
该包放在src/org/jsoft/demo/OrderAction.java
public class OrderAction extends ActionSupport {
private OrderEntity order;
public OrderEntity getOrder() {
return order;
}
public void setOrder(OrderEntity order) {
this.order = order;
}
public String addOrder() throws UnsupportedEncodingException {
System.out.println(new String(order.getName().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getNum());
System.out.println(new String(order.getContent().getBytes("ISO-8859-1"),"UTF-8"));
System.out.println(order.getDate());
return SUCCESS;
}
}
MyDateConvert .java 自定义类型转换器
public class MyDateConvert extends StrutsTypeConverter{
/**
* String转换为指定的类型
* context: 当前环境上下文
* values:jsp表单提交的数据
* toClass:要转换的数据类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断内容不能为空
if(values==null||values.length==0) {return null ;}
//判断日期类型,只能转换日期类型的数据
if(!toClass.equals(Date.class)){return null;}
//转换日期
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
return sdf.parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
@Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
xwork-conversion.properties
该配置文件放在src/xwork-conversion.properties
java.uti.Date=org.jsoft.convert.MyDateConvert
OrderEntity.java
public class OrderEntity {
private String name;
private int num;
private String content;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx1" extends="struts-default" namespace="/" >
<action name="addOrder" class="org.jsoft.mrp.OrderAction" method="addOrder">
<result name="success" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./addOrder" method="post">
商品名:<input type="text" name="order.name"><br/>
数量:<input type="text" name="order.num"><br/>
备注:<input type="text" name="order.content"><br/>
日期:<input type="text" name="order.date"><br/>
<input type="submit" value="提交"><br/>
</form>
</body>
</html>
测试:
3.5 注意事项
自定义类型转换器时,有两个方法,
一个是 前端->后台 的序列化。 (convertFromString)
另一个是 后台->前端 的反序列化。(convertToString)
切记,反序列化只对struts标签有用。对于其他无效。【垃圾东西】
public class DateConvert extends StrutsTypeConverter {
@Override
public Object convertFromString(Map map, String[] values, Class toClass) {
//判断内容不能为空
if(values==null||values.length==0||values[0].length()==0) {return null ;}
//判断日期类型,只能转换日期类型的数据
if(!toClass.equals(Date.class)){return null;}
System.out.println(">>>> 日期转换");
//转换日期
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(values[0]);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 仅仅针对前段用struts标签使用,垃圾
*
*/
@Override
public String convertToString(Map arg0, Object value) {
if(value==null) {
return null;
}
if(value instanceof Date) {
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
return sd.format((Date)value);
}
return null;
}
}
3.4 类型转换总结【struts2继承StrutsTypeConverter实现自定义类型转换器】
1、编写converter类继承StrutsTypeConverter,重写convertFromString和convertToString方法。
2、配置类型转换器:
局部配置:在action所在包下编写 ActionClassName-conversion.properties文件
配置内容:属性名=转换器全路径
全局配置:在src目录下编写 xwork-conversion.properties文件
配置内容:被转换类=转换器全路径
【注意】页面显示要用struts2标签,否则会出现convertToString方法无法执行的情况!