六、Struts2 的Action开发 -- 请求数据的自动封装(二)

一、请求数据的自动封装

1.1 请求数据自动封装的实现
		
		+++ 请求数据的自动封装:
					1. jsp表单数据填充到action中属性
							action中的属性必须有set方法即可。
							form表单的name名称为action中的属性名。
					
					2.jsp表单数据填充到action中对象的属性	
							action中的对象必须给setget方法
							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方法无法执行的情况!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值