前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSH框架之Struts2第二篇

SSH框架之Struts2第二篇

作者头像
海仔
发布2019-09-18 14:43:19
5040
发布2019-09-18 14:43:19
举报
文章被收录于专栏:海仔技术驿站海仔技术驿站

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://cloud.tencent.com/developer/article/1508658

代码语言:javascript
复制
1.2 知识点
		1.2.1 Struts2的Servlet的API的访问
			1.2.1.1 方式一 : 通过ActionContext实现
				页面:
				<h1>Servlet的API的访问方式一:解耦合的方式</h1>
				<form action="${ pageContext.request.contextPath }/requestDemo1.action" method="post">
					姓名:<input type="text" name="name"/><br/>
					年龄:<input type="text" name="age"><br/>
					<input type="submit" value="提交">
				</form>
				编写Action
				/**
				 * Servlet的API的访问方式一:解耦合的方式
				 * 	* 只能用于接收参数 和 操作域中的数据
				 * @author jt
				 */
				public class RequestDemo1Action extends ActionSupport{

					@Override
					public String execute() throws Exception {
						// 接收数据:
						/**
						 * 在ActionContext中提供了一些方法:操作域对象的数据
						 * 	* Map<String,Object> getParameters();
						 * 	* Map<String,Object> getSession();
						 *  * Map<String,Object> getApplication();
						 */
						// 接收参数:
						ActionContext actionContext = ActionContext.getContext();
						Map<String,Object> map = actionContext.getParameters();
						for (String key : map.keySet()) {
							String[] arrs = (String[]) map.get(key);
							System.out.println(key+"    "+Arrays.toString(arrs));
						}
						// 向request域中存值:
						actionContext.put("reqName", "req如花");
						
						// 向session域中存值:
						actionContext.getSession().put("sessName", "sess凤姐");
						
						// 向application域中存值:
						actionContext.getApplication().put("appName","app石榴");
						return SUCCESS;
					}
				}
		
			1.2.1.2 方式二: 实现特定接口的方式实现:
				在struts中提供了一些接口 : ServletRequestAware,ServletResponseAware,ServletContextAware;
				页面:
				<h1>Servlet的API的访问方式二:实现特定接口的方式</h1>
				<form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">
					姓名:<input type="text" name="name"/><br/>
					年龄:<input type="text" name="age"><br/>
					<input type="submit" value="提交">
				</form>
		
				编写Action:
				/**
				 * Servlet的API的访问方式二:
				 * @author jt
				 *
				 */
				public class RequestDemo2Action extends ActionSupport implements ServletRequestAware,ServletContextAware{

					private HttpServletRequest request;
					private ServletContext application;

					@Override
					public String execute() throws Exception {
						// 接收数据:使用request对象。
						Map<String, String[]> parameterMap = request.getParameterMap();
						for (String key : parameterMap.keySet()) {
							String[] arrs = parameterMap.get(key);
							System.out.println(key+"   "+Arrays.toString(arrs));
							
						}
						// 向域中保存数据;
				//		向request域中保存数据
						request.setAttribute("reqName", "r郝三");
						 // 向session域中保存数据
						request.getSession().setAttribute("sessName", "s李四");
						// 向application域中保存数据
						application.setAttribute("appName", "a王五");
						return NONE;
					}

					@Override
					public void setServletRequest(HttpServletRequest request) {
						this.request =  request;
					}
					
					@Override
					public void setServletContext(ServletContext application) {
						this.application = application;
					}
				}
			1.2.1.3方式 : 通过ServletActionContext对象的静态方法实现 :
				页面:
				<h1>Servlet的API的访问方式三:通过ServletActionContext对象静态方法获取</h1>
				<form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">
					姓名:<input type="text" name="name"/><br/>
					年龄:<input type="text" name="age"><br/>
					<input type="submit" value="提交">
				</form>
				编写Action:
				/**
				 * Servlet的API访问方式三:通过ServletActionContext的静态方法访问
				 * @author jt
				 *
				 */
				public class RequestDemo3Action extends ActionSupport {
					public String execute() throws Exception {
						//接收参数:
						/*
						ServletActionContext 在struts2的API中的 : 
						HttpServletRequest getRequest();
						HttpServletResponse getResponse();
						ServletContext getServletContext();
						
						*/
						HttpServletRequest request = ServletActionContext.getRequest();
						Map<String,String[]> parameterMap = request.getParameterMap();
						for(String key : parameterMap.get()) {
							String[] value = parameterMap.get(Key);
							System.out.println(key + "  " + Arrays.toString(value));
						}
						
						//向域中存值 : 
						request.setAttribute("reqName" , "用request向域中存数据");
						request.getSession.setAttribute("session","向session域中存数据");
						ServletActionContext.getServletContext().setAttribute("ServletContext","向ServletContext域中存储数据");
						return super.execute();
						
					}
				}
		
			1.2.2.1 :结果页面的分类 : 
				全局结果页面 :
					针对一个包下所有的action都生效的一个页面.
					<!--全局结果页面-->
					<global-results>
						<result>/jsp/1.jsp</result>
					</global-results>
				局部结果页面 :
					针对某一个action生效的一个页面 : 
					<action name="requestDemo1" class="com.baidu.struts2.demo1.ActionDemo1">
					<result>/jsp/1.jsp</result>
					</action>
			
			1.2.2.2 配置结果页面 :
				<result>标签配置:
					name : 逻辑视图的名称.默认值是success.
					type : 
						dispatcher	 	: 默认值,转发.(转发到jsp的页面)
						redirect     	: 重定向.(重定向到JSP的页面),被跳转的页面中丢失传递的信息.
						chain 	  	    : 转发到另一个Action.
						redirectAction  : 重定向到另一个Action.跳转的页面中丢失传递的信息
						stream 			: 文件的下载
			
			1.2.2.3 Struts2的多例性 : 
					原来的Servlet是单例存在,多次请求,请求都是同一个Servlet的实例.Struts2中Action是多实例的.有异常请求就会有一个Action的实例.
				现在可以在Action中定义成员属性了.
				
				大部分我们会优先使用模型驱动的方式,因为Struts2内部有很多结果是围绕模型驱动设计的。但如果页面向多个对象中封装,那么就需要使用属性驱动的方式二了。
				这些都是像某个对象中封装数据,

		1.2.3 Struts2的数据封装 :
			1.2.3.1 Struts2中的数据封装-属性驱动 : 
				提供对应属性的set方法的方式 :
					页面:
					<h3>数据封装的方式一:提供属性的set方法的方式</h3>
					<form action="${ pageContext.request.contextPath }/employee1Action.action" method="post">
						姓名:<input type="text" name="name"/><br/>
						年龄:<input type="text" name="age"/><br/>
						性别:<input type="text" name="sex"/><br/>
						工资:<input type="text" name="salary"/><br/>
						<input type="submit" value="提交"/>
					</form>
					编写Action:
					/**
					 * 数据封装的方式一:提供set方法的方式
					 * @author jt
					 *
					 */
					public class Employee1Action extends ActionSupport{
						private String name;
						private Integer age;
						private String sex;
						private Double salary;
						
						public void setName(String name) {
							this.name = name;
						}

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

						public void setSex(String sex) {
							this.sex = sex;
						}

						public void setSalary(Double salary) {
							this.salary = salary;
						}

						@Override
						public String execute() throws Exception {
							System.out.println("员工姓名:"+name);
							System.out.println("员工年龄:"+age);
							System.out.println("员工性别:"+sex);
							System.out.println("员工工资:"+salary);
							// 手动封装数据:
							Employee employee = new Employee();
							employee.setName(name);
							employee.setAge(age);
							employee.setSex(sex);
							employee.setSalary(salary);
							
							
							return NONE;
						}
					}
					这种方式不是特别常用,因为需要手动封装数据,而且如果属性很多,提供很多的set方法,导致Action类易读性变差
		
				页面中提供表达式的方式:
					页面:
					<h3>数据封装的方式二:页面提供OGNL表达式的写法</h3>
					<form action="${ pageContext.request.contextPath }/employee2Action.action" method="post">
						姓名:<input type="text" name="employee.name"/><br/>
						年龄:<input type="text" name="employee.age"/><br/>
						性别:<input type="text" name="employee.sex"/><br/>
						工资:<input type="text" name="employee.salary"/><br/>
						<input type="submit" value="提交"/>
					</form>
					编写Action:
					/**
					 * 数据封装的方式二:页面提供表达式的方式
					 * @author jt
					 *
					 */
					public class Employee2Action extends ActionSupport{
						// 提供成员的属性employee,必须提供属性的get和set方法
						private Employee employee;
						
						public Employee getEmployee() {
							return employee;
						}
						public void setEmployee(Employee employee) {
							this.employee = employee;
						}

						@Override
						public String execute() throws Exception {
							System.out.println(employee);
							return NONE;
						}
					}
		
			1.2.3.2 Struts2 中的数据封装-模型驱动 :
				采用模型驱动完成数据封装(推荐)
				页面:
				<h3>数据封装的方式三:采用模型驱动的方式</h3>
				<form action="${ pageContext.request.contextPath }/employee3Action.action" method="post">
					姓名:<input type="text" name="name"/><br/>
					年龄:<input type="text" name="age"/><br/>
					性别:<input type="text" name="sex"/><br/>
					工资:<input type="text" name="salary"/><br/>
					<input type="submit" value="提交"/>
				</form>
				编写Action:
				/**
				 * 数据封装的方式三:采用模型驱动的方式
				 * @author jt
				 *
				 */
				public class Employee3Action extends ActionSupport implements ModelDriven<Employee>{
					// 模型驱动使用的对象:必须手动构建对象的实例。
					private Employee employee = new Employee();
					@Override
					public Employee getModel() {
						return employee;
					}
					@Override
					public String execute() throws Exception {
						System.out.println(employee);
						return NONE;
					}
				}
				***** 模型驱动只能向一个实体中封装数据,如果需要向多个实体封装数据优先采用第二种方式。
		1.2.4 Struts2 的复杂数据的封装 :
			1.2.4.1 封装到List集合 :
				页面:
				<form action="${ pageContext.request.contextPath }/product1Action.action" method="post">
					商品名称:<input type="text" name="list[0].name"/><br/>
					商品价格:<input type="text" name="list[0].price"/><br/>
					商品名称:<input type="text" name="list[1].name"/><br/>
					商品价格:<input type="text" name="list[1].price"/><br/>
					商品名称:<input type="text" name="list[2].name"/><br/>
					商品价格:<input type="text" name="list[2].price"/><br/>
					<input type="submit" value="批量导入"/>
				</form>
				Action:
				/**
				 * 封装复杂的数据到List集合中。
				 * @author jt
				 *
				 */
				public class Product1Action extends ActionSupport{
					private List<Product> list;
					
					public List<Product> getList() {
						return list;
					}

					public void setList(List<Product> list) {
						this.list = list;
					}

					@Override
					public String execute() throws Exception {
						for (Product product : list) {
							System.out.println(product);
						}
						return NONE;
					}
				}
		
			1.2.4.2 封装到Map集合
				页面:
				<h1>批量插入商品:封装到Map集合</h1>
				<form action="${ pageContext.request.contextPath }/product2Action.action" method="post">
					商品名称:<input type="text" name="map['one'].name"/><br/>
					商品价格:<input type="text" name="map['one'].price"/><br/>
					商品名称:<input type="text" name="map['two'].name"/><br/>
					商品价格:<input type="text" name="map['two'].price"/><br/>
					商品名称:<input type="text" name="map['three'].name"/><br/>
					商品价格:<input type="text" name="map['three'].price"/><br/>
					<input type="submit" value="批量导入"/>
				</form>
				Action:
				/**
				 * 复杂类型数据封装:封装到Map集合
				 * @author jt
				 *
				 */
				public class Product2Action extends ActionSupport {
					private Map<String,Product> map;
					
					public Map<String, Product> getMap() {
						return map;
					}

					public void setMap(Map<String, Product> map) {
						this.map = map;
					}

					@Override
					public String execute() throws Exception {
						for (String key : map.keySet()) {
							Product product = map.get(key);
							System.out.println(key+"   "+product);
						}
						return NONE;
					}
				}
		
随堂笔记 :	
		1 strtus2对servlet API的访问

		 1  使用ServletActionContext类的静态方法(重要)
					
		 2  使用ActionContext对象的方法(理解)往域中存储数据,到页面展示(ps:这个对象获取不到域对象,只能操作域中的数据)
					静态方法getContext()获取ActionContext对象

				特点: 只能接受页面的数据,以及对域中数据的进行操作

				       获取不response对象做不了响应,也获取不到域对象
						使用ActionContext对象的方法(理解)
					// getContext()  --获取ActionContext对象
					// Map<String,Object> ----- getParameters() 获取页面的所有数据
					// Map<String,Object> ------getSession()   获取session域中的数据
					// Map<String,Object> -------getApplication()  获取servletContext域中的数据
		 3  实现特定的接口来获取的方法(了解)
证明Action是单实例还是多实例?
			servlet是单实例  成员属性有线程危机
			Action是多实例   成员属性没有线程危机

2 结果页面的逻辑视图配置
		分类:
			全局配置
				针对一个包下所有的action都生效的一个页面
			
			局部配置
				针对某一个action生效的一个页面
		
			注意:如果全局配置和局部配置都配置了,局部配置的优先级大于全局配置

		result标签: 对返回的逻辑视图进行匹配

			name:
				逻辑视图的名称。默认值是success。

			type:
				dispatcher  默认  请求转发(用于转发到jsp页面)

				redirect   重定向(用于重定向到jsp页面)

				chain     请求转发(用于转发到action)

				redirectAction  重定向(用于重定向到action)

				stream  用于下载的(CRM3天案例)

3 struts2对页面数据的封装(模型驱动,属性驱动)

			 1 属性驱动---set属性方式(例如:分页玩法)  (重点)
				  条件:
					 1 需要在action的成员位置提供属性,并且要有set()方法

			 2 属性驱动---页面表达式的方式  (理解)
				 条件:
					1 需要在action的成员位置上申明javabean对象,且提供get/set方法
							例如:
								private User user;
								get()/set()

					2 在页面上的参数name属性需要:
							name=javabean对象.属性

							例如: user.username;
							      uiser.age;


			 3 模型驱动(单一的对象)  (掌握)
					条件:
						1 让action实现一个接口: ModelDriven

						2 需要在action的成员位置上申明javabean对象,并且这个对象得实例化 private User user=new User;

						3 需要 ModelDriven 这个接口中的getModel()方法

						4 需要在getModel()方法里面将我们的javabean对象以返回值的形式返回回去

						主页:页面还是正常的写法
					 
			 4 批量方式(针对的是多个对象数据的封装)
					条件:
						需要在action中提供集合,且提供get()/set()方法
				
				list封装:

					  在action中集合名称:
								ll

					  在页面需要:
							ll[0].username
							ll[0].age

							ll[1].usrname
							ll[1].age

				map封装:
					 在action中集合名称:
								mm

					在页面需要:
							
							mm[键名].属性

总结:
	 1 struts2怎么样获取到servlet的API(request,response,session,ServletContext,以及接受页面的数据)

			1 通过ServletActionContext类的静态方法

			2 通过ActionContext对象的方法(理解)
						getActionContext()--对象的获取
						注意:只能接受操作页面参数,以及操作域中的数据
						     不能获取到域对象,也不能做响应(response对象也获取不到)

			3 通过特定的接口来实现
					  ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware

	2 结果逻辑视图的配置
			全局配置 针对的是一个包下的所有action
			局部配置 针对的是指定的action
			2个都存在的情况下优先级:局部>全局
			result标签:
			name: 逻辑视图的名称。默认值是success。
			type:
				dispatcher	:默认值,请求转发。(请求转发到JSP的页面)
				  redirect	:重定向。(重定向到JSP的页面)
				  chain		:转发到另一个Action。
				  redirectAction:重定向到另一个Action。
				  stream	:文件的下载。

	3 struts2对页面数据封装的方式: 4种  ps:action多实例的,每访问一次就创建一个action对象,所以它成员位置的属性不存在线程危机
			1 属性驱动---set方式
				条件: action提供相应的成员属性,必须得有set方法
				
			2 属性驱动---页面表达式的方式
				条件:
					1 需要在action的成员位置上申明javabean对象,且提供get/set方法
					2 在页面上的参数name属性需要:
							name=javabean对象.属性

							例如: user.username;
							      uiser.age;

			3 模型驱动
				条件:
						1 让action实现一个接口: ModelDriven

						2 需要在action的成员位置上申明javabean对象,并且这个对象得实例化 private User user=new User;

						3 需要 ModelDriven 这个接口中的getModel()方法

						4 需要在getModel()方法里面将我们的javabean对象以返回值的形式返回回去

						主页:页面还是正常的写法
			
			
			4 批量封装
				条件: 提供集合且提供set/get方法

				list:
					在action中: ll

					在页面: ll[索引].属性
				
				map:
					在action中: mm
					在页面: mm['键名'].属性
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档