Struts2_day02---结果页面配置、获取表单数据、封装数据到集合

版权声明:转载请联系作者本人!!! https://blog.csdn.net/qq_41307491/article/details/83588589

一、 结果页面配置


(1)局部结果页面
1)对每个action进行单独配置。
2)在<action>内部配置
(2)全局结果页面 :统一配置多个action

作用:使多个具有相同返回值的action返回到相同页面

优点:统一配置,减少代码量

使用方法:使用<global-results>对返回值设置页面,在<package>内部配置

生效范围:只在<global-results>标签所在package内生效。

示例:对下面两个action配置相同返回值,并跳转到相同页面

	<!-- 全局结果页面配置: 将所有返回值相同的action,配置跳转到相同页面 -->
	<global-results>
		<result name="ok">/index.jsp</result>
	</global-results>
	
	<!-- action标签:配置action访问路径 -->
	<action name="add" class="action.ActionTest" method="add">
	</action>
	<action name="delete" class="action.ActionTest" method="delete">
	</action>

注:若全局配置中存在局部配置,则以局部配置为准!!

二、action中获取表单提交数据的三种方式


(1)使用ActionContext类获取
原因:为了使用类中getParameters()方法,该方法可获取表单数据。

方法:
	1)Map<String,Object> getParameters();
		--返回Map对象,其中包含所有HttpServletRequest参数信息
	2)getContext();
		ActionContext中静态方法,用来得到ActionContext对象。
使用步骤:
	在action中:
	1)使用静态方法getContext()获取ActionContext对象
	2)调用方法获取表单数据
	
代码示例:	
	/*
	 * 使用ActionContext获取数据
	 * 	步骤:
	 * 		1)获取ActionContext对象,使用Action.getContext.getContext()方法
	 * 		2)调用getParameters()方法获取表单数据 
	 * 				方法返回值为Map
	 * 		3)使用key遍历Map
	 */

	public class Form1 extends ActionSupport {
		
		public String execute() throws Exception {
			//1)获取ActionContext对象
			ActionContext context = ActionContext.getContext();
			
			//2)调用方法得到表单数据
			Map<String, Object> map = context.getParameters();
			
			//使用key遍历Map--根据key得到value值
			//3)得到key的集合,使用.keySet()方法。 返回值为Set<String>集合
			Set<String> keys = map.keySet();
			
			//4)遍历,输出
			for (String key : keys) {
				
				//因为输入项中可能存在复选框情况,所以使用数组形式接收value
				Object[] obj = (Object[]) map.get(key);
				System.out.println(Arrays.toString(obj));
			}
			return NONE;
		}
	}
(2)使用ServletActionContext类获取
优点:可用来操作action域对象

背景:页面查询显示操作中,需要将查询到的数据放入域对象中,然后遍历输出	

代码示例:	
	/*
	 * 使用ServletActionContext类获取表单书数据
	 * 	步骤:
	 * 		1)获取request对象。 
	 * 			使用ServletActionContext类中getRequest()方法
	 * 		2)调用request中getParameters得到参数值
	 * 		
	 */
	public class Form2 extends ActionSupport {
		@Override
		public String execute() throws Exception {
			//1)获取request对象。 
			HttpServletRequest request = ServletActionContext.getRequest();
			
			//2)调用request中getParameters得到参数值
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			String address = request.getParameter("address");
			
			System.out.println(username +"--"+ password +"--"+ address);
			
			return NONE;
		}
	}

ServletActionContext类中常用方法:
在这里插入图片描述

(3)使用接口注入方式获取(了解)
原理:让action实现接口,从而得到request对象

/** 使用ServletActionContext类操作域对象演示
 *
 * 操作三种域对象演示
 * 	1)Request
 * 	2)Session
 * 	3)ServletContext
 * 
 * 步骤:
 * 	1)得到域对象  getXxx()
 * 	2)设置域对象属性名、属性值  setAttribute()
 * @author 一万年行不行
 *
 */
public class Form3 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//操作域对象演示
		//1)Request域   得到域对象、设置属性名,属性值
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("req", "reqValue");
		
		//2)Session域  得到域对象、设置属性名,属性值
		HttpSession Session = request.getSession();
		Session.setAttribute("sess", "sessValue");
		
		//3)ServletContext域  
		//得到域对象、设置属性名,属性值
		ServletContext Context= ServletActionContext.getServletContext();
		Context.setAttribute("contextname", "contextValue");
		
		return NONE;
	}
}

三、 struts2中提供的获取表单数据方式


三种方式:
	1)模型驱动封装
	2)属性封装
	3)表达式封装
1)模型驱动封装(重点)
作用:直接把表单数据封装到实体类对象里面

前提条件:表单输入项中name属性值和实体类属性名相同

步骤: 
	1)对action实现接口  -- implements ModelDriven<User>   User为模型类
	2)创建模型类对象
	3)实现接口中方法

代码示例:
	/**
	 * 使用模型驱动获取表单数据
	 * 
	 * @author 一万年行不行
	 *
	 */

	//1)实现接口  -- implements ModelDriven<User>
	public class Data2 extends ActionSupport implements ModelDriven<User> {
		
		//2)创建模型类对象
		private User user = new User();
		
		//3)实现接口中方法 --getModel(), 返回创建对象
		@Override
		public User getModel() {
			return user;  //返回创建对象
		}
		
		@Override
		public String execute() throws Exception {
			//测试输出
			System.out.println(user);
			return NONE;
		}
	}

注:
1)在一个action中,获取表单数据可以属性封装,也可使用模型驱动封装,
2)不能同时使用两种封装获取同一个表单数据,若同时使用,只执行模型驱动
2)属性封装(会用即可)
底层技术:内省。根据表单值匹配action中属性,匹配到后直接对属性赋值

效果:直接把表单提交属性封装到action的属性里面

缺点:不能把数据封装到实体类对象里面。

实现步骤:
	1)在action成员变量位置定义变量
		变量名称和表单输入项的name属性值一样
	2)生成变量的set方法(把set和get方法都写出来)
 
代码演示:
	/**
	 * 使用属性封装获取表单数据
	 * 
	 * @author 一万年行不行
	 *
	 */
	public class Form4 extends ActionSupport {
		
		//1)定义变量
		//变量名称需要和表单输入项中name属性值相同
		private String username;
		private String password;
		private String address;
		
		//2)生成set方法
		public void setUsername(String username) {
			this.username = username;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public void setAddress(String address) {
			this.address = address;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(username +"--"+ password +"--"+ address);
			return NONE;
		}
	}
3)表达式封装(会用)
效果:可以把表单数据封装到实体类对象里面

实现步骤:
	1)在action类里面声明实体类
	2)生成实体类变量的set和get方法
	3)在jsp页面中表单输入项的name属性值里面写表达式形式

代码示例:
	/**
	 * 表达式封装表单数据
	 * 
	 * @author 一万年行不行
	 *
	 */
	public class Data3 extends ActionSupport{
		
		//1)在action类里面声明实体类
		private User user;
		
		//2)生成实体类变量的set和get方法
		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}
		
		@Override
		public String execute() throws Exception {
			System.out.println(user);
			return NONE;
		}
	}
	
	<!-- 3)在jsp页面中表单输入项的name属性值里面写表达式形式    -->
	username:<input type="text" name="user.username"/> <br/>
	password:<input type="password" name="user.password"/> <br/>
	address:<input type="text" name="user.address"/> <br/>
 
注:把表达式封装也可归类到属性封内

	
表达式封装和模型驱动封装比较
	相同点:可以把数据封装到实体类对象里面
	不同点:表达式封装可以封装到不同的实体类里面

四、struts2获取数据封装到集合中(会用)


(1)封装数据到list集合
步骤:
	1)在action声明List
	2)生成list变量的set和get方法
	3)在表单输入项里面写表达式

代码示例:	
	/**
	 * 封装数据到list集合
	 * @author 一万年行不行
	 *
	 */
	public class ListAction extends ActionSupport {

		// 1)声明List变量
		private List<User> list;
		
		// 2)生成get和set方法
		public List<User> getList() {
			return list;
		}
		public void setList(List<User> list) {
			this.list = list;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(list);
			return NONE;
		}
	}
	
	jsp页面:
	<form action="${pageContext.request.contextPath }/list.action" method="post">
	<!-- 3)在表单输入项里面写表达式 -->
		<!-- list[0] : 表示list集合中第一个user对象 -->
		username:<input type="text" name="list[0].username"/>
		<br/>
		password:<input type="text" name="list[0].password"/>
		<br/>
		address:<input type="text" name="list[0].address"/>
		
		<input type="submit" value="提交"/>
	</form>
(2)封装数据到map集合
步骤:
	1)在action声明Map
	2)生成list变量的set和get方法
	3)在表单输入项里面写表达式

代码示例:
	/**
	 * 封装数据到map集合
	 * @author 一万年行不行
	 *
	 */
	public class MapAction extends ActionSupport {

		// 1)声明map集合
		private Map<String,User> map;
		
		// 2)生成get和set方法
		public Map<String, User> getMap() {
			return map;
		}
		public void setMap(Map<String, User> map) {
			this.map = map;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(map);
			return NONE;
		}
	}
	jsp页面:
	<form action="${pageContext.request.contextPath }/map.action" method="post">
	<!-- 3)在表单输入项里面写表达式 -->
		<!-- 设置key值 map['key值']
			设置value值
		 -->
		username:<input type="text" name="map['one'].username"/>
		<br/>
		password:<input type="text" name="map['one'].password"/>
		<br/>
		address:<input type="text" name="map['one'].address"/>
	
		<input type="submit" value="提交"/>
	</form>

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/83588589