SSH框架之Struts2第二篇
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['键名'].属性
SSH框架之Struts2第二篇的更多相关文章
- SSH框架之Struts2第一篇
1.2 Struts2的概述 : Struts2是一个基于MVC设计模式的WEB层的框架. 1.2.1 常见web层框架 Struts1,Struts2,WebWork,SpringMVC Strut ...
- SSH框架之Spring第二篇
1.1 基于注解的IOC配置 既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. 1.2 环境搭建 1.2.1 第一步:拷贝必备的jar包 需要多拷贝一个sp ...
- SSH框架之Hibernate第二篇
1.1 持久化类的编写规则 1.1.1 什么是持久化类? 持久化类 : 与表建立了映射关系的实体类,就可以称之为持久化类. 持久化类 = Java类 + 映射文件. 1.1.2 持久化类的编写规则 ( ...
- 搭建SSH框架整合Struts2和Spring时,使用@Autowired注解无法自动注入
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架,在进行Struts2和Spring整合时,使用Spring的@Autowired自动注入失败,运行报错java.lan ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤
在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用. 整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补.一般而言,在进 ...
- SSH框架之Struts2第三篇
1.3相关知识点 : 1.3.1 OGNL的表达式 : 1.3.1.1 什么是OGNL OGNL是Object-Graph Navigation Language的编写,它是一种功能强大的表达式语言, ...
- Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】
前言 我们现在学习的是Struts2,其实Struts1和Struts2在技术上是没有很大的关联的.Struts2其实基于Web Work框架的,只不过它的推广没有Struts1好,因此就拿着Stru ...
- SSH开发模式——Struts2(第二小节)
上一小节已经学会了如何去搭建Struts2的开发环境,该篇博客我们继续深入Struts2,了解Struts2框架的拦截器. 首先对我们在web.xml文件配置的过滤器进行一个源码的分析. 在Strut ...
- SSH框架之Spring第一篇
1.1. spring概述: 1.1.1 spring介绍 : Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control : 反 ...
随机推荐
- 一个proc预编译代码时coredump的问题分析
最近有同事在搞编译环境迁移,碰上一个问题让我帮他看一下. 他建了一个新目录,然后把现在的代码拷过去,编译的时候发现有一个文件编译不了一执行就出现core,不知道啥情况. 我进到他的编译环境 ...
- HTML连载57-相对定位和绝对定位
一.定位流 1.分类 (1)相对定位: (2)绝对定位 (3)固定定位 (4)静态定位 2.什么相对定位 相对定位就是相对于自己以前在标准流中的位置来移动. 例子: <style> div ...
- spring boot 2 + shiro 实现权限管理
Shiro是一个功能强大且易于使用的Java安全框架,主要功能有身份验证.授权.加密和会话管理.看了网上一些文章,下面2篇文章写得不错.Springboot2.0 集成shiro权限管理 Spring ...
- oop面向对象【继承、super、this、抽象类】
今日内容 1.三大特性——继承 2.方法重写 3.super关键字 4.this关键字 5.抽象类 教学目标 1.能够解释类名作为参数和返回值类型 2.能够写出类的继承格式 3.能够说出继承的特点 4 ...
- EtreCheck是否修复恶意软件和广告软件?为什么EtreCheck无法制作截图?
EtreCheck for Mac是一款Mac上的软件,有很对人对这款软件并不熟系,今天小编就来给大家介绍一下这款软件最常出现的问题—EtreCheck是否修复恶意软件和广告软件?为什么EtreChe ...
- TI的32位定点DSP库IQmath在H7和F4上的移植和使用
说明: 1.最近在制作第2版DSP教程,除了ARM家的,这次重点了解下载TI的DSP库,特此移植了一个TI的IQmath. 2.初次使用这个定点库,感觉在各种Q格式的互转,Q格式数值和浮点数的互转处理 ...
- 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理
第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数 typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...
- Python中的测试工具
当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试 ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(1)- Boot简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的BootROM功能简介. 截止目前为止i.MX RTyyyy系列已公布的芯片有三款i.MXRT ...
- Jenkins使用SSH构建Go项目并执行
目录 下载插件 配置要部署的服务器 构建项目 Jenkinx可以帮助我们通过SSH插件,将项目直接部署到指定的服务器. 下载插件 (1)点击左侧的"系统管理"菜单 ,然后点击 (2 ...