day60-struts2_02:笔记。--整理版
2017-09-24 16:14
399 查看
回顾: struts2是web层的框架,对web层的功能进行了封装 struts1 struts2 webwork springmvc 环境搭建: struts2提供的项目 struts-2.3.24-all\struts-2.3.24\apps\struts2-blank\WEB-INF\lib 下的所有包 一共是13个包 配置文件的加载和加载顺序: StrutsPrepareAndExecuteFilter的init()发生的加载 struts提供好的: default.properties 键值对的常量 struts-default.xml 放了大量的拦截器 struts-plugin.xml 插件 自己编写的: struts.xml(最重要) struts.properties(一般是不用的) struts.action.extension=xxx 去web.xml下加载StrutsPrepareAndExecuteFilter的初始化参数(一般不用的) 配置文件的先后顺序加载有一个特点: 后面加载的配置文件内容如果和前面先加载的配置文件内容相同了 后面的内容会覆盖前面的内容 (以后面的配置文件命令为主) 配置文件的编写 constant :配置常量 package: 所有的action都要写在这个标签里面 action: 就是struts2的action的配置标签 include: 引入外部的配置文件 result: 接收action传递的逻辑视图名,根据逻辑视图名到指定的页面 action的内容: 1 action的3种编写方式 普通的javabean 实现action接口 (5个常量 默认方法execute()) 继承actionsupport(内容最多,以后使用的就是这种方式) 2 action的3种访问方式 method方式 通配符方式 动态方法方式 struts2-02 ====今日内容介绍: 1 struts2对servlet API的获取 2 页面逻辑视图的配置 <result> 3 struts2对页面数据的封装(属性驱动封装 模型驱动封装) 今日案例: 客户信息列表的查询(昨天做的) 客户信息的保存 ===1 strtus2对servlet API的访问 1 使用ServletActionContext类的静态方法(重要) ===### 可以直接拿到servlet各种域对象。使用方便--暂不需要考虑耦合servlet问题。 2 使用ActionContext对象的方法(理解) ===###### 可以拿到域对象底层存储数据的集合。例如request和session底层集合是map。 获取ActionContext对象: ActionContext.getContext() 特点:获取不到任何域对象,只能获取域对象底层用来存放数据的map集合以及通过方法获取页面的数据(getParameters) setAttribute("msg","aaa")--->map<"msg",aaa> getAttribute("msg")--->map.getkey() 3 实现特定的接口来获取的方法(了解) public class ActionDemo3 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware { private HttpServletRequest request; private HttpServletResponse response; private ServletContext servletContext; @Override public String execute() throws Exception { Map<String, String[]> map = request.getParameterMap(); for(String key:map.keySet()) { System.out.println(key+":"+Arrays.toString(map.get(key))); } // 写响应数据 /*response.getWriter().print("ok");*/ // 存数据到页面 request.setAttribute("msg1", "request...."); request.getSession().setAttribute("msg2", "session..."); servletContext.setAttribute("msg3", "sevletContext..."); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request=request; } @Override public void setServletResponse(HttpServletResponse response) { this.response=response; } @Override public void setServletContext(ServletContext servletContext) { this.servletContext=servletContext; } } 4 面试题: 【证明: action是单实例还是多实例?===######=(面试题)】 原因: 如果是单实例,成员位置上的属性会有线程危机 如果是多实例,成员位置上的属性就不会有线程危机 servlet: 是单实例的 成员位置上就不会有成员属性。===(多个用户表单提交的数据,最后一个会覆盖前面的) action: 是多实例的 成员位置上可以有成员属性。===数据封装。 ======代码演示,代码怎默写? ===总结:两个角度:①是否可以有成员属性(加分项) ②构造函数(servlet也有构造)多次访问调用次数(最直观); servlet单例: ===①不能用成员属性;②构造方法:直观演示:新建servlet,init()方法 输出“创建了servlet对象”提示信息,多次访问,控制台只输出一次。 action多例: ===①可以有成员属性;②构造方法:直观演示:新建action,XxxAction()构造方法 输出“创建了action对象”提示信息,多次访问,每次控制台都输出一次。 成员属性每个session都会维护一个各自的action对象。不同用户的数据不会覆盖。 但是多线程的情形一人无法模拟。没关系。面试官还会追问这个?别逗了。 ===能说出这些,足够体现你基础扎实! //action【已测:输出多次】 public class ActionDemo4 extends ActionSupport { public ActionDemo4() { System.out.println("构造:创建了action对象"); } } //servlet【已测:构造、init都只输出一次】 public class qq extends HttpServlet { private static final long serialVersionUID = 1L; public qq() { super(); System.out.println("构造:创建了servlet对象"); } public void init(ServletConfig config) throws ServletException { System.out.println("init:创建了servlet对象"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 证明Action是单实例还是多实例? 【结论-记住】 servlet是单实例 成员属性有线程危机 Action是多实例 成员属性没有线程危机 ===2 结果页面的逻辑视图配置 分类: 全局配置 针对一个包下所有的action都生效的一个页面 局部配置 针对某一个action生效的一个页面 注意:如果全局配置和局部配置都配置了,局部配置的优先级大于全局配置 result: 为action返回的逻辑视图名进行页面的匹配 name: 逻辑视图的名称。默认值是success。 dispatcher 默认 请求转发(用于转发到jsp页面) redirect 重定向(用于重定向到jsp页面) chain 请求转发(用于转发到action) ###### 对起始资源(是页面还是action)有要求吗?起始都是action(控制页面跳转的都是action Java类) redirectAction 重定向(用于重定向到action) stream 用于下载的(CRM3天案例) ===3 struts2对页面数据的封装(属性驱动封装 模型驱动封装)###【重点-容易忘】 1 属性驱动封装----set属性方式 (分页查询) 条件: 1 在action的成员位置上需要设置属性,且给set方法 2 属性驱动封装----页面表达式方式 封装对象 针对的是不同对象的数据封装 条件: 1 在action的成员位置上需要声明对象,且给set/get方法 例如:private User user; get()/set() 2 页面name属性上要写ognl表达式 对象.属性的方式 例如: <input name="user.username" /> <input name="user.age" /> 3 模型驱动(单一的对象) (掌握) 条件: 4步实现: 1 让action实现一个接口: ModelDriven 2 需要在action的成员位置上申明javabean对象,并且这个对象得实例化 private User user=new User; 3 需要 ModelDriven 这个接口中的getModel()方法 4 需要在getModel()方法里面将我们的javabean对象以返回值的形式返回回去 ps: 主页:页面还是正常的写法。### 4 批量方式(针对的是多个对象数据的封装) 条件: 需要在action中提供集合,且提供get()/set()方法 list封装: 在action中集合名称: list 在页面需要:===理解:list底层本就是数组。ps:Java语法不可以list[i]直接取list值。 list[0].username list[0].age list[1].usrname list[1].age map封装: 在action中集合名称: map 在页面需要: map[键名].属性 ps: ==###==map键名是自己在表单页面自定义设置,封装数据用处不大; 页面取值时遍历keySet,键的值也不需要知道,可以任意设置。 ==######==struts封装数据的方式(总结) ========【上面所有struts封装数据的方式中, 《只有模型驱动方式必须初始化对象属性,才能成功封装数据》, 其他的方式都不用初始化(已测-结论-记住)】 //==###=总结:哪些方式需要getset?【除了模型驱动 都需要,都是属性驱动】。 =================【易错-易忘小知识点总结】: ==①==#####=访问action,不能加斜杠。(访问页面必须加斜杠) ---理解:页面资源去找,action反射匹配name即可,不需要找。 <!-- 案例 --> <package name="test2" extends="struts-default" namespace="/"> <action name="customer_*" class="cn.itcast.web.ActionDemo5" method="{1}" > <result name="ok">/jsp/customer/list.jsp</result> <result name="addUI">/jsp/customer/add.jsp</result> <!-- 通配符代表了很多个action。==#####=访问action,不能加斜杠。 --> <result name="toFindAll" type="redirectAction">customer_findAll</result> </action> </package> ==②==######==struts2表单数据封装:实例。----【批量封装本质还是属性驱动,必须有get set】 public class Action10 extends ActionSupport { // private String username; // private String pass;//====【属性驱动:页面属性方式】==get set必须。 // private User user;//====【属性驱动:页面表达式方式】==get set必须。 // private User user0;//====【模型驱动:页面属性 方式】==###### 没有初始化。。。醉了总是报空指针 // private User user = new User();//====ok // private List<User> list;//====【属性驱动:页面表达式方式:《list批量封装数据》--医疗系统】==get set必须。ok private Map<String,User> map;//====【属性驱动:页面表达式方式:《map批量封装数据》--医疗系统】==get set必须。ok //==######=批量封装,本质还是属性驱动。 所以getset必须。 @Override //==总结哪些方式需要getset??。 public String execute() throws Exception { Set<String> keySet = map.keySet(); for (String string : keySet) { System.out.println( map.get(string) ); } return null; } public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } }
相关文章推荐
- Struts2学习笔记02 之 使用
- java学习笔记知识点整理02
- Struts2表单验证、模型驱动、防重复提交、数据回显笔记整理 文章标题
- 变量 类型 运算符 笔记整理02
- Java基础笔记整理02
- Web前端常用代码笔记整理(02)
- Struts2的笔记整理与复习
- 韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理
- day25_Struts2学习笔记_02
- struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持
- 菜鸟学python(02)—— 基础笔记整理
- Struts2表单验证、模型驱动、防重复提交、数据回显笔记整理
- C++ primer plus笔记整理 02
- Struts2学习笔记整理1
- 阶段大纲 struts2 火推 01 02笔记
- Struts2 学习笔记 —— 02 —— Namespace
- js笔记整理02
- Java笔记整理-02.Java基础语法
- struts2笔记02-action和Action类
- [机器学习]机器学习笔记整理02-机器学习概述