Java学习全过程

================= 教学安排 =============================================日期 周次 内容 任务 项目 实验----------------------------------------------------------------------03-02 01 课程介绍,MVC架构 复习JavaWeb03-04 01 课程介绍,MVC架构 用户登录 Task01 实验0103-11 02 Struts1原理+Ajax 用户登录 Task02 实验0203-18 03 Struts1原理+CURD 用户管理 Task03 实验0303-25 04 Struts1原理+CURD Task04 实验0404-01 05 Struts2 用户管理、登录 Task05 实验0504-08 06 Struts2、Filter 日志、安全 Task06 实验05(6日清明节放假)04-15 07 Struts2原理 Task07 实验0604-22 08 Struts2原理 南化院网站 Task08 实验0704-29 09 Struts2其它,Spring 南化院网站 Task09 实验0805-06 10 XML装配、CRUD 用户管理 Task10 实验0905-13 11 注解、Spring、Struts整合 用户管理 Task11 实验1005-20 12 Spring MVC 用户管理 Task12 实验1105-27 13 Spring MVC注解 系统登录 用户管理 Task13 实验1206-03 14 JdbcTemplate 用户管理 Task14 实验1306-10 15 MyBatis、单表 用户管理 Task15 实验1406-17 16 主细表、Spring集成、总复习 角色管理、用户管理 Task16 实验15----------------------------------------------------------------------=========第 01 周=================================2017-02-20(周一)2017-02-22(周三)【任务-Task01】× 复习JavaWeb、课程介绍× 引出 SSH框架教学内容和教学安排× 用户登录2017-02-24(周五):实验01 —— 用户注册模块实现【知识点】× 上学期知识点回顾+ 知识体系- JSP- tcpip协议:浏览器与服务器- 浏览器:IE、FireFox- 服务器:Tomcat- html中嵌入 Java:<% java语句 %>- 显示:out.print,拼字符串基本功- 请求转发:session、application、request —— 内部对象- 重定向:repsonse —— 内部对象- 数据共享- request共享区- session共享区- 展示- <%out.print %>- ${}:EL表达式- <%=xxx%>:JSP表达式- Servlet:纯Java- 四件事- 提取参数- 参数处理- 业务逻辑:数据共享- 请求转发- 两重性- 既是Java,可以调用 Service业务- 又是网页:可以请求、可以跳转- web.xml- 继承 HttpServlet,override- init- destory- service+ 教学设计- JSP:html展示特长 + java数据动态 —— 分 ——>合- html中嵌入 Java:<% java语句 %>- 问题:Java与网页结合太紧- 两个 JSP —— 合 ——> 分- 快捷方式不能用- JSP- 纯JSP —— 一个 JSP:牛叉人- 两个JSP- 业务 JSP:准备数据,并放入页面的数据共享区 —— request、session- 展示 JSP:- 问题:- 先访问:业务JSP,准备好业务数据- 再请求转发显示JSP- 业务JSP:只有 Java —— 干嘛要用 JSP 来写?- Servlet- 框架- client:WebRoot,JSP网页- service- dao- util- domain- action:Servlet+ 项目- 前台页面:展示页面- login.jsp —— LoginAction.java- 验证码- Ajax- njcc.jsp —— NjccAction.java- ynxx.jsp- news.jsp- newsMore.jsp- 翻页技术- 后台页面:维护页面 —— 增删改查- 角色管理- 用户管理- 栏目管理- 科室管理- 新闻管理- 评论管理- 维护页面- 风格1- 风格2× 引出本学期知识点+ Struts:展示层- 提取参数、参数处理- 请求转发+ Spring:业务层- IoC+ Hibernate:数据持久层- MyBatis × 本周知识点+ Struts 1.x 原理+ Struts 1.x 的重要类- 总控制器:org.apache.struts.action.ActionServlet- 表单数据收集器:ActionForm- 后端控制器:Action+ form表单组件与ActionForm属性- 名称完全一致- 类型对应- text:String- text:int- text:double+ 配置文件- web.xml- struts.xml × 任务记录 + 搭建环境 - 引入 njcc.jar 包 - 引入jdbc - web.xml配置 - struts.xml配置 + MVC开发 - View开发:login.jsp - Controller开发Servlet实现:LoginAction.java - 提取页面参数 - 参数类型转换 - 请求转发 - 调用业务逻辑 - Controller开发Struts实现 - 前端控制器: - 提取页面参数 - 参数类型转换 - 请求转发 - 后端控制器: - 调用业务逻辑 + struts开发环境=========第 02 周=================================2017-02-27(周一)2017-03-01(周三)【任务-Task02】× Demo+ form:各种 form 输入+ action:收集各种 form 输入的数据× 用户登录+ 跳转× 南科院网站:主页× Struts1.x 工作原理2017-03-03(周五):实验02【知识点】× Struts 1.x 原理× Struts 1.x 的重要类+ 总控制器:org.apache.struts.action.ActionServlet+ 表单数据收集器:ActionForm+ 后端控制器:Action× form表单组件与ActionForm属性+ 名称完全一致+ 类型对应- text:String- text:int- + × ActionForm与domain+ 属性对应关系:按名字对应+ BeanUtils- 按名字相同的规则,拷贝数据- 名字不相同的属性,不拷贝数据0、Model1与Model2 :动态网页开发的两种模式× Model1:纯 JSP —— 小的应用系统、个人应用系统+ 一个JSP:既负责业务逻辑,又负责页面展示+ 两个JSP- 业务JSP:全部是 <% %>的纯Java- 展示JSP:html + EL + JSTL× Model2:MVC框架 —— 大的应用、企业级应用+ Model:模型、业务模型,Service、Dao+ View:视图、展示页面,JSP、html网页+ Controller:控制层,Servlet1、Struts 框架的基本原理× 三个重要的类+ 总控制器:ActionServlet——总控制器做了很多的事情+ 表单数据收集器:ActionForm+ 后端控制器:Action× 八个步骤详细分析:结合 struts-config.xml进行分析+ 1-初始化:ActionServlet详细分析- 读取 struts-config.xml,启动Tomcat时进行初始化- Action- ActionForm- Forward- MessageResources- ActionServlet怎样把请求转发给 Action?+ 2-http请求+ 3-填充ActionForm- 谁来填充 ActionForm、什么时候填充、按什么规则填充?+ 4-将请求转发到 Action- 总控制器如何转发到 Action- Action运行完以后,怎样进行跳转?+ 5-调用业务逻辑+ 6-返回 forward:需要转发到的页面的标识+ 7-请求转发:转发到下一个页面+ 8-http响应2、ActionForm 与 form表单× 问题+ 在用Servlet编写的Controller中,前台不同的input,对应后台的程序编写非常麻烦+ form表单各种组件与ActionForm属性如何对应× 作用+ 数据收集+ 类型转换× 对应关系+ text:String、int、double+ 单选钮:String、int、double+ 复选框:数组——String、int、double+ 下拉列表框:String、int、double× 测试3、ActionForm 与 domain× 问题+ form收集的是前台form传递过来的数据,与 domain 不一定是对应的× 解决+ BeanUtils.copyProperties(user, loginForm):将 loginForm 中的属性值拷贝给 user- 属性名称相同的进行拷贝× 测试==========第 03 周=================================2016-03-06(第 03 周一)2016-03-08(第 03 周三)【任务-Task03】× 复杂些的前后台关系+ 自定义一个含有各种form组件的网页任务,编写后台 ActionForm、Action+ 南化院主页- 单纯的展示页面+ 维护页面- 前面页面请求过来- 跳转到另外页面去+ 用户管理:带基础数据的业务管理模块+ 新闻管理:带基础数据的业务管理模块2016-03-10(周五):实验03【小结】× login.jsp:不带基础数据的业务模块+ 直接进入的页面:login.jsp+ 如果希望统一请求方式为:login.do- ForwardAction× Struts 1.x 搭建环境+ JAR包+ web.xml配置- 配置总控制器+ struts-config.xml配置- form-bean:相当于实例化一个 ActionForm- name:ActionForm类实例化后的变量名- type:ActionForm类名(等同于 class)- action- path:Action映射为页面访问的名称。是供总控制器转发使用的- type:Action类名(等同于 class)- name:Action类用于收集 前台表单form 数据的 ActionForm 名称- forward:页面跳转逻辑- name:跳转页面的标识- path:跳转的页面× web.xml 只需要配置一次了+ 总控制器:ActionServlet+ 指定自己的Struts配置文件- config参数- 参数的值一定要带 /WEB-INF/路径× 主要配置在 struts-config.xml 中+ 用 .do 路径直接跳转到 JSP× Struts 主要类+ 总控制器(前端控制器):ActionServlet+ 后端控制器:Action+ 数据收集器:ActionForm + .do直接跳转:ForwardAction× 开发流程+ 配置 web.xml:配置总控制器+ 编写ActionForm+ 编写Action+ 配置 struts-config.xml- form-bean- action【知识点】× Struts1.x收集前台参数+ text组件- String- 数值型+ checkbox组件+ radio组件+ textarea组件+ Bean 的规范:ActionForm- 不是 JSP 中 name 与 ActionForm 中属性同名- 而是 getter/setter 方法名称的规范- JSP 中 name- 首字母改大小- 再加 get/set 形成的方法名+ 后台Date类型不能对应,只能用String接收- 做特殊处理- String接收再转× Struts1.x原理× Struts1.x用法+ JSP页面input属性与ActionForm- 属性完全一致- 类型可转换× 先业务、后JSP+ njcc.do:action无需配置 ActionForm+ njcc.jsp× 通过.do直接进入JSP1、Struts 框架的基本原理× 三个重要的类+ 总控制器:ActionServlet——总控制器做了很多的事情+ 表单数据收集器:ActionForm+ 后端控制器:Action× 八个步骤详细分析:结合 struts-config.xml进行分析+ 1-初始化:ActionServlet详细分析- 读取 struts-config.xml,启动Tomcat时进行初始化- Action- ActionForm- Forward- ActionServlet怎样把请求转发给 Action?+ 2-http请求+ 3-填充ActionForm- 谁来填充 ActionForm、什么时候填充、按什么规则填充?+ 4-将请求转发到 Action- 总控制器如何转发到 Action- Action运行完以后,怎样进行跳转?+ 5-调用业务逻辑+ 6-返回 forward:需要转发到的页面的标识+ 7-请求转发:转发到下一个页面+ 8-http响应2、ActionForm 与 form表单× 问题+ 在用Servlet编写的Controller中,前台不同的input,对应后台的程序编写非常麻烦+ form表单各种组件与ActionForm属性如何对应× 对应关系+ text:String、int、double+ 日期型:没有Java对应+ 单选钮:String、int、double+ 复选框:数组——String、int、double+ 下拉列表框:String、int、double× 测试3、ActionForm 与 domain× 问题+ form收集的是前台form传递过来的数据,与 domain 不一定是对应的× 解决+ BeanUtils.copyProperties(user, loginForm):将 loginForm 中的属性值拷贝给 user- 属性名称相同的进行拷贝× 测试4、Action与JSP× 问题+ Action调用业务逻辑返回的值如何传给后面转发的JSP× 解决:与Servlet中一样+ 通过JSP内部对象:共享区- request- session- application==========第 04 周=================================2017-03-13(周一)【任务:Task04a】× 用户管理+ 通过 DispatchServlet 调用指定的方法2017-03-15(周三)【任务:Task04b】× 用户管理完整开发+ 用户列表+ CRUD操作2017-03-17(周五)【任务】实验04【小结】× JSP与ActionForm:页面复杂 form 组件的数据收集 ActionForm+ text:String、int、double+ 单选钮:String、int、double+ 复选框:数组——String、int、double+ 下拉列表框:String、int、double+ 日期型:没有Java对应× 网页类型与Action+ 查询网页- 先 njcc.action:检索业务数据- 跳转 njcc.jsp:展示业务数据+ 管理网页:没有Ajax功能- 先 userMgr.action:检索基础数据- 跳转 userMgr.jsp:展示业务管理- 请求 userMgr.action:进行 CRUD操作+ Login.jsp- 不需要基础数据:可以直接进入该 JSP- 又需要向后台提交业务数据:需要后台 Action× ActionForm与Domain+ BeanUtils【知识点】:Struts1.x深化配置× 特殊跳转:org.apache.struts.actions 包中+ ForwardAction:可以直接转向JSP+ DispatchAction:可以指定调用Action方法的Action1、web.xml配置细化× ActionServlet的初始化参数+ config:Struts的配置文件,确省是/WEB-INF/struts-config.xml× web.xml详细配置 config /WEB-INF/struts-config.xml× 可以改变 struts-config.xml 的名称2、struts-config.xml 细化× ActionForm分析+ 一般步骤:action 标签的配置属性- 由 name 属性找 actionForm- 由 scope 属性,到指定的共享区找 actionForm- 找到了:取出来- 没找到:实例化 actionForm- reset 清空 actionForm 的属性值- setter 设置 actionForm 的值- set + 名称:如 setTitle- 跟属性名无关- validate校验- 成功:派发到 Action- 失败:跳转到错误页面 —— input 属性指定的页面+ ActionForm 依附于 Action 的: ActionForm 是给 Action 用的- Action 中的 name 绑定 ActionForm+ ActionForm的实例化:从Action的 name配置找到名字,并反射实例化- 实例化出来的 ActionForm对象的 scape 范围,缺省——session- scape.getAttribute("name")- 取值:request.get{arameter(form的input名)、domain的 setter方法+ ActionForm与attribute属性的关系- attribute:是对 actionForm 的重新命名- scope.getAttribute("name") 其实是按 attribute 配置去取的,但缺省时 attribute 就是 name 名+ ActionForm的作用范围- 由 action 标签中的 scope 属性设置- request- session+ Action中的form与xml中配置的name分析- 是同一个对象- request.getAttribute(name)- form+ reset方法分析+ setter方法名与 form 表单的 input 的 name分析: Struts是如何将表单的值填入到 ActionForm 属性中的- 按 setter 方法名字,而不是看属性- input 的 name 名:首字母转大写,再加 set前缀构成的方法- 属性名称命名注意:第二个字母不要用大写 —— pDate+ validate方法分析:数据校验- 数据校验- 前台校验- 后台校验- 对取得的值进行校验:- 数据校验失败:不进入 Action(礼物没准备好,不好意思见 Action),而是进入- 与input属性的关系:表单数据验证不对时跳转到 input 指定的路径- 成功:进入 Action- 受 action 标签中的 validate 开关控制+ ActionErrors:存储和回收错误× ActionMapping分析+ ActionMapping 对象是由 struts-config.xml 中的配置创建的- getPath:path的值——Action映射成为的url- getName:name的值——ActionForm的name- getScope():ActionForm作用范围- getType:typa的值——Action类- findForwards:所有 局部forward标签的name字符串数组- 由 forward标签的name字符串 又能够取出 forward 的 name+ setPath等等:是不能使用的× ActionForward(导航器)分析+ forward标签:跳转方式- 请求转发:容器内跳转。是 path 前要添加当前应用的上下文路径- 重定向:容器外跳转,如:http://www.soho.com+ forward标签:除了name、path属性外,还有:- redirect="true":重定向,容器外跳转- true、false或yes、no- 此时,必须要用 http://www.soho.com 形式的绝对路径+ 全局跳转与局部跳转- 3、特殊跳转× 直接跳转到 JSP+ ForwardAction:只要配置 action,无需写 Action 类× 直接调用Action 的方法+ DispatchAction:继承该方法的 Action+ 后台的 方法 一定要跟 execute 方法格式完全相同4、struts-config.xml 细化× action标签的属性+ path+ type+ name+ scope+ validate+ attribute× forward标签的属性+ name+ path+ redirect- 域外跳转:path给的是绝对路径- 域内跳转:path给的是相对路径× Action分析+ Action的初始化——只实例化一次- Action 是在请求 Action 时才初始化的- 每个 Action 只实例化一次- 在构造方法打印一句话- 在 struts-config.xml 中把一个 Action 配置两次- 用两个页面分别请求不同的 Action- 测试:用两个 IE 请求 两个页面- 结论- 同一个 Action 配置两次,但都只实例化一次+ 线程不安全的- 所有的 Action 请求,共享同一个 Action实例的- 设计一个属性:统计Action被请求了多少次- 测试:- 结论- 线程不安全性的特性,无所谓好坏,看应用场合+ 可以不带 ActionForm==========第 05 周=================================2016-03-20(周一)【任务:Task05a】× 用户登录2016-03-22(周三)【任务:Task05b】× 用户管理2016-03-24(周五)【任务:实验05】【小结】Struts1.x基本原理× web.xml配置+ config参数× struts.xml配置+ action标签属性- scope- attribute- input- validate× 全局跳转+ :公共跳转配置- 所有Action公用的跳转+ 特殊跳转- 跨域跳转:- 直接跳转:ForwardAction- 继承特殊的Action:DispatchAction- parameter=“method”× Struts1.x+ Servlet缺陷- 参数提取、类型转换复杂- 网页挑战固定死的+ Struts1.x解决上面的三个问题- ActionForm:解决参数提取、类型转换问题- ActionMapping:网页跳转- ForwardAction:直接跳转- Action- ActionForward:跳转的方向- DispatchAction:按方法跳转+ Struts1.x缺点:太复杂了- 数据收集:继承 ActionForm- 继承 Action、DispatchAction× Struts2.x 大胆设想+ 就直接用 domain 接收数据+ 仍然用 domain 来分发【知识点】× struts1.x其它+ forward标签:跳转方式- 请求转发:容器内跳转。是 path 前要添加当前应用的上下文路径- 重定向:容器外跳转,如:http://www.soho.com+ forward标签:除了name、path属性外,还有:- redirect="true":重定向,容器外跳转- true、false或tes、no- 此时,必须要用 http://www.soho.com 形式的绝对路径+ 全局跳转与局部跳转- × mapping的使用+ getName+ getPath+ getType+ findForwards+ ......+ struts.xml配置:parameter=“method”- 把 input 的 name = “method” 的值放到 parameter 参数中- 把 parameter指定的参数用作后台调用方法的名称+ ActionForm:就不需要再指定与 input 对应的 method 属性了× Struts标签使用× Filter过滤器× struts2.x× Struts1.x缺点+ 需要用专门的 ActionForm 去收集前台数据+ 前台 action 能不能省掉+ 跟 Ajax结合不好 1、Struts2.3.8环境搭建× 版本匹配+ MyEclipse8.5内置环境:Task04- jdk1.6- tomcat6.0- struts2.1.x+ 外置环境- tomcat只能配置到 6.0:Task04t- jdk可以配置到1.7- struts可以配置到 2.3.81、struts-config.xml 细化× ActionMapping分析+ ActionMapping 对象是由 struts-config.xml 中的配置创建的- getPath:path的值——Action映射成为的url- getName:name的值——ActionForm的name- getScope():ActionForm作用范围- getType:typa的值——Action类- findForwards:所有 局部forward标签的name字符串数组- 由 forward标签的name字符串 又能够取出 forward 的 name+ setPath等等:是不能使用的× ActionForward(导航器)分析2、特殊跳转× 直接跳转到 JSP+ ForwardAction:只要配置 action,无需写 Action 类× 直接调用Action 的方法+ DispatchAction:继承该方法的 Action+ 后台的 方法 一定要跟 execute 方法格式完全相同3、Struts标签使用× bean标签× Logic逻辑标签:for、if判断 程序结构的标签化× html标签:替代基本的html元素× tiles标签4、Filter过滤器× Filter接口× Filter配置× Filter基本原理5、Struts1.x小结:× Web开发模式+ Model 1+ Model 2:MVC- M:Model —— Service- V:View —— html、jsp 等- C:Controller —— Servlet× View+ form:各种数据组件- 文本- 单选- 复选- 列表框- 隐含+ 提交- form提交- js提交- Ajax提交- url提交- IE 地址栏请求- 超链接 href 请求× Controller+ 收集数据:getParameter()- 后台:对应数据组件的- 文本- String- int- double- 单选- String- int- 复选- String[]- int[]- 列表框- String- int- 隐含:action+ 数据处理- 类型转换- null 值转换- 数据校验- 合法性校验- 逻辑校验- 数据封装- 封装到 domain+ 业务逻辑:Service- 根据 action 决定调用 CRUD 操作- service 返回值+ 请求转发:根据 service 返回值- 写入 共享区:Scope有效范围- application- session- request- 跳转- forward:域内转发- 转发到页面- 转发到 另外的 servlet- redirect:域外重定向+ web.xml:将 servlet 映射为 url× Struts 1 的实现:取代 servlet+ 继承 Action- 收集数据:ActionForm- 数据处理:ActionForm- 业务逻辑:同 servlet 方式- 请求转发- 写入 共享区:Scope有效范围- application- session- request- 跳转- forward:域内转发- 转发到页面- 转发到 另外的 servlet- redirect:域外重定向+ 关键类- ActionServlet:总控制器- Action:后台控制器- ActionForm:对 form 表单数据的封装- ActionMapping:对 action 标签的封装- ActionForward:对 forward 标签的封装+ web.xml- 配置总控制器:ActionServlet- config 参数配置- 另外命名 struts-config.xml 的名字+ struts-config.xml- 配置后端控制器:Action- form-bean 配置- action配置- path:Action映射成的 url- name:传给 action 的数据收集器 actionForm(可以做三件事:收集、转换、校验)- type:class——后端控制器Action类- scope:actionForm的有效范围- validate:actionForm的validate方法是否有效的”开关“- input:actionForm的validate方法检验出错时跳转的页面- attribute:actionForm的name- forward- name- path- redirect- global-forwards:全局跳转配置+ 特殊跳转- ForwardAction:直接跳转- 不经过 Action 跳转到 页面- DispatchAction:指定调用 Action 的方法- 继承 DispatchAction 的 Action 类- parameter="method":指定需要调用的方法=========第 06 周=================================2017-04-27(周一)【任务:Task06a】× 用户管理:CRUD+ Edit-List模式2017-04-29(周三)【任务:Task06b】× 用户管理:CRUD+ Edit-List模式细化2017-04-31(周五)【任务:实验06】小结:Struts1.x结束× 问题:+ 后端控制器一定要继承Struts1.x的Action类+ 跟Ajax结合(整合)不方便+ 必须通过ActionForm来收集数据+ 足以让好事者开发一个新的框架Strtuts2.x知识点:× struts2.x:采用 Filter,而不再是 Servlet+ FilterDispatcher:2.1.3版本之前+ StrutsPrepareAndExecuteFilter:2.1.3版本以后× “Action”:POJO类+ 属性- 接收网页数据- 传输共享数据+ 方法- getter/setter方法- execute方法× 配置+ web.xml+ struts.xml- - name="default"- namespace="/" - extends="struts-default"- - name="loginAction2"- class="edu.njcc.rj1441.action.LoginAction2"1、搭建 Struts2.x开发环境× 加JAR包× 配置 web.xml+ 2.1.3以前配置+ 2.1.3以后配置× 配置 struts.xml+ 缺省放在类路径下+ 缺省配置文件名:struts.xml2、收集表单数据× Form.jsp× FormAction.java× struts.xml配置3、用户登录× domain+ User× 编写 LoginAction.java+ 简单属性- 传入属性- username- password- 传出属性- message+ 引用属性- 传入属性- User user- 传出属性- message+ execute方法+ 指定方法- struts.xml配置- method指定方法- 请求:login!process× 配置 struts.xml+ 缺省放在类路径下+ 缺省配置文件名:struts.xml===========第 07 周===============================2017-04-01(第 06 周六)【任务:Task07a】× × 特殊跳转+ 直接跳转+ 域间跳转:重定向+ 2017-04-05(周三)【任务:Task08b】× 用户登录+ Ajax实现2017-04-07(周五)【任务:实验07】【知识点】× Filter:过滤器、拦截器+ Filter接口+ Filter配置- Filter× Action:+ 收集前台数据- 属性- getter/setter+ execute方法- 方法名- 返回值- String- 返回标志名称× 指定调用action方法+ 动态方法调用+ 通配符-占位符-替换 /index.jsp /index.jsp × 配置+ web.xml:FilterDispatcher+ struts.xml- 位置:类路径- /success.jsp/fail.jsp × struts2.x:采用 Filter,而不再是 Servlet+ FilterDispatcher:2.1.3版本之前+ StrutsPrepareAndExecuteFilter:2.1.3版本以后× “Action”:POJO类+ 属性- 简单类型:String- 引用类型:User user+ 方法- 自定义方法:process()- 不用缺省的 execute方法 —— 动态方法调用× Struts1的Action如何调用指定的方法+ DispatchAction:指定调用 Action 的方法- 继承 DispatchAction 的 Action 类- parameter="method":指定需要调用的方法× 前台指定调用后台Action的方法+ JSP:动态方法调用(url指定调用action的方法)- action地址!方法名- 限制动态方法调用+ struts.xml指定调用action的方法- - name="loginAction2"- class="edu.njcc.rj1441.action.LoginAction2"- method="process"1、struts.xml的核心配置 —— 基本配置× action的配置+ 属性- name:url映射- class:Action类- method:指定方法名+ 缺省属性- class:ActionSupport —— 缺省的 Action- 有一个 execute 方法,仅返回一个 success 字符串- 可以实现直接跳转- method:execute× result的配置+ result标签:可以不写任何属性- name属性:如 name属性不写, 不写时,缺省:success- type属性:四种转发类型- dispatcher:转发——缺省- redirect:重定向http://www.baidu.com- redirectAction:重定向到另外一个 actionparams- plainText:显示返回网页的源码/index.jsp+ 直接跳转:无需 Action,直接跳转到 JSP- 纯 Struts:全部都经过 action,再到 JSP /index.jsp ===========第 08 周===============================2015-04-10(周一)【任务:Task08a】× 用户登录+ Ajax实现× 南科院网站后台主控页面+ main.jsp2015-04-10(周三)【任务:Task08b】× 用 Ajax 实现各管理模块+ 角色管理+ 科室管理+ 栏目管理+ 用户管理+ 新闻管理2015-04-10(周五)【任务:实验08】【知识点】× Action控制器+ 简单的Java类- 收集数据和数据处理- POJO 类- 传入属性- 传出属性- 简单类型属性- 引用类型属性- 业务逻辑- execute缺省方法:要做的事情太多了(CRUD都做了),还需要另外加一个 action变量- 随便取方法名称:abc()——动态方法调用- 前台:!方法名- 后台配置:method=‘方法名’- 如何进行 CRUD 操作的程序设计——通配符-占位符-替换- 后台:- add()- remove()- modify()- query()- queryAll()- 后台配置:通配符、占位符- 前台:action名_方法名称- 优点:Action的结构跟 Service + Domain 完全一致- 跳转:return一个字符串× 指定调用action方法+ 动态方法调用+ 通配符-占位符-替换× 过滤器+ 实现 Filter 接口+ Filter 生命周期+ web.xml配置+ 常用的 Filter- StrutsPrepareAndExecuteFilter:版本2.1.3以后- FilterDispatcher:版本2.1.3以前× struts2.x 用 Filter 实现+ 不用依赖于 Servlet+ struts2.x 没有 Servlet 的东西的- request- response- session+ 如何使用 Servlet 的东西- ServletActionContext- 牺牲了Struts2.x的无侵入性优势知识点:× struts2.x配置+ 核心配置- action配置- result配置- type 类型- param配置:属性注入+ 其它配置- package配置- constant配置- global-results 配置+ 高级配置- bean配置- interceptor 配置- interceptor-stack 配置- default-interceptor-ref 配置× struts2.x多个配置文件===========第 09 周================================2017-04-17(第 09 周一)【任务:Task09a】× 用户登录+ Ajax实现× 南科院网站后台主控页面+ main.jsp2017-04-19(第 09 周三)【实验:实验09】2017-04-21(第 09 周五)【运动会停课】1、参数传递方法× 传入+ form表单传入:数据传入到Action× 传出+ Ajax返回:数据传出到自己页面2、参数注入:非表单传入的数据× 初始化模块:Init.java+ 将公司名、版本等全局参数配置到 action 中- 鼓楼医院3、页面间数据共享:传出到另外的页面× session共享+ HttpSession session = ServletActionContext.getRequest().getSession();× 登录后初始化基础数据+ LoginAction.java改造- 提取全部基础数据+ 放入共享区- session.setAttribute("roleList", roleList);× 南化院网站项目的配置文件设计+ struts.xml- 登录Action- 独立成功:初始化、跳转到主页面- 不成功:重新登录- 初始化Action- 再包含下面的所有配置文件+ 独立功能模块配置文件- userMgr.xml- roleMgr.xml- sectionMgr.xml- topicMgr.xml- newsMgr.xml- bbsMgr.xml=========第 10 周==================================2017-04-24(周一)【任务:Task10a】× 角色管理+ 模拟流程和分层结构2017-04-26(周三)【任务:Task10b】× 角色管理+ 模拟流程和分层结构2017-04-28(周五)【任务:实验10】× Spring3.x基本原理——基于xml装配【知识点】× Spring3.x 初步+ JAR包- 3.0.5 版- 换 3.2.0 版+ bean 的基本配置- id- class+ 属性注入- setter 方法注入- 构造方法注入+ IoC 容器- 创建容器:ClassPathXmlApplicationContext("配置文件")× 依赖注入的方法+ 使用 setter 注入+ 构造方法注入【随堂笔记】1、问题:为什么使用 Spring× 现象+ client- new User()- new xxxSvrImpl()+ service- new xxxDaoImpl()+ dao- new Tools()× 现象总结+ 由应用程序主动控制 对象 的创建- client创建 service- service 创建 dao- dao 又创建 tools- 等等+ 由应用程序控制对象间的依赖关系- client 依赖于 service- service 依赖于 dao- dao 依赖于- Tools- java.sql 包× 存在问题+ 耦合问题: 依赖与解耦- service 依赖于 dao 的实现类: new xxxDaoImpl()- 如果仅依赖于接口,而不是具体的实现类,就实现了解耦× 解决思路: 解耦+ 单独使用一个容器,由该容器管理所有需要 创建的对象+ 应用需要使用对象时,从容器中去取对象+ 应用需要使用对象时,将所依赖的对象注入2、Spring简介× 轻量级框架+ 依赖关系少+ 没有侵入性- 不用继承任何 Spring 的类 —— 丢掉 Spring 照样可以运行× 内容+ IoC(Inversion of Control) 容器 —— 是一个大工厂- 创建、管理对象(Bean)- 维护对象间的依赖关系 —— 装配- 提供 bean 对象服务+ IoC 对应 Java 技术 —— Java 反射机制 —— 工厂模式- 反射机制: 根据名称加载Java对象- Class.forName- 依赖注入(Dependency Injection): 由 IoC 管理的对象中,又依赖与另外一个 bean 对象+ AOP(Aspect orientation Programming):面向切面 —— 横切性技术- 横切- 日志- 权限- 拦截: 实现的方法+ AOP 对应 Java 技术 —— Java 代理机制 —— 代理模式+ AOP 应用- 声明式事务3、IoC容器× IoC 容器的创建和销毁+ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");- 创建 IoC 容器- 所有 beans.xml 配置的 bean,都由 IoC 管理- 管理 bean 对象- 管理 bean 对象的装配关系+ ctx.destroy()- 销毁 IoC 容器4、bean 的基本配置× id、class+ 相当于: UserSvr userSvr = new UserSvrImpl()- id: userSvr- class: UserSvrImpl+ 注意: bean 类需要基于接口5、注入值 —— 也叫“装配 wired”× 7、角色管理改造× Dao层改造× service层改造- 注入 dao× Client层改造- 初始化IoC容器===========第 11 周================================2017-05-01(周一)【任务:放假】2017-05-03(周三)【任务:Task11】× Tools改造+ 连接参数注入× 角色管理+ 字面值注入2017-05-05(周五)【任务:实验11】× 用户管理+ 字面值注入【知识点】× 注入+ 依赖注入+ 值注入× 多个 xml 配置文件+ BeanFactory ctx = new ClassPathXmlApplicationContext(new String[]{"beans-role.xml", "beans-section.xml"});× 对 bean 内地属性注入值时,用 property 标签比较繁琐× p命名空间+ xmlns:p="http://www.springframework.org/schema/p"+ 无需指定 xsi:schemaLocation× 配置:装配× 注入值:将值注入到 bean 中,可以注入+ 注入字面值(基本属性注入): String、int 等等+ 注入集合: Set、Map、List、List 等+ 注入其它 bean: 如 service 中注入 dao× Spring 的 bean 配置+ scope+ lazy-init+ init-method+ destroy-method============第 12 周===============================2017-05-08(周一)【任务:Task12a】× 用户管理2017-05-10(周三)【任务:Task12b】× 用户管理2017-05-08(周五)【任务:实验12】【知识点】× Spring3.x体验× 重要概念+ IoC:控制反转、IoC容器,被实例化的对象全部放在 IoC容器中+ AOP:横切面× 注入+ 类依赖注入- getter/setter注入- 构造方法注入+ 配置(XML装配):bean.xml- - - - 简化配置 p:password="123456"× IoC容器+ 初始化:ClassPathXmlApplicationContext("配置文件")+ 提取对象:cxt.getBean("role")任务: 用户管理 的改造× Pojo属性注入× Service层改造× Dao层改造知识点:× 注入值:将值注入到 bean 中,可以注入+ 注入字面值(基本属性注入): String、int 等等+ 注入集合: Set、Map、List、List 等+ 注入其它 bean: 如 service 中注入 dao× Spring 的 bean 配置+ scope+ lazy-init+ init-method+ destroy-method1、IoC容器初始化× IoC 容器的创建和销毁+ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");- 创建 IoC 容器- 所有 beans.xml 配置的 bean,都由 IoC 管理- 管理 bean 对象- 管理 bean 对象的装配关系+ ctx.destroy()- 销毁 IoC 容器× ApplicationContext 接口的几种实现+ ClassPathXmlApplicationContext:从类路径中的XML文件载入配置文件,手工装配对象+ FileSystemXmlApplicationContext:从文件系统中的XML文件载入配置文件,手工装配对象+ XmlWebApplicationContext:在 Web 应用中,由监听器 ContextLoader 在 Web 启动时,自动创建 IoC× BeanFactory 接口:较 ApplicationContext 更底层的接口2、注入值 —— 也叫“装配 wired”× 字面值注入+ 实体类: POJO.java —— 有各种类型的属性- int- String- String[]- List- Set- Map+ 简单属性注入:int、String奥巴马+ 数组注入:String[]米国小日本+ List集合注入:List —— 直接用 注入亚太中东+ Set集合注入:Set桃花岛白驼峰+ Map映射:Map× 引用其它 Bean 注入+ 实体- Role.javaprivate User user;- User.java+ 引用bean+ 内部bean3、bean 的基本配置× id、class、name+ 相当于: UserSvr userSvr = new UserSvrImpl()- id: userSvr- class: UserSvrImpl+ name: id的别名,用不用无所谓+ 注意: bean 类需要基于接口× scope: 有效范围 —— 见 实验报告 图形化 描述+ Java 环境- singleton: 单例 —— 每次 getBean 出来的 对象 都是同一个实例- 该对象仅仅用作功能性用途- prototype: 原型(多例) —— 每次 getBean 出来的 对象 都是不同的实例- 该对象不仅用作功能性用途,还用于封装数据+ JavaWeb环境- request- session- application× lazy-init: 延时实例化 bean+ 实例化 bean 对象的时间点- 饿汉式: 创建 IoC 容器时就全部都实例化- 缺省时: 在创建 IoC 容器时就实例化 配置文件中 配置的 bean 对象的- 懒汉式: 创建 IoC 容器时并不实例化,到真正调用 bean 方法时才实例化+ 延时实例化:将 bean 的实例化由 创建IoC容器时,延迟到 调用时- lazy-init="false"+ default-lazy-init="true": 设置全局的延时实例化开关+ init-method: 常用于初始化一些基础数据- 创建 IoC 容器时执行的初始化方法+ destroy-method- 销毁 IoC 容器时执行的销毁方法4、用户管理改造× Dao层改造+ Tools 注入× service层改造+ dao 类注入× Client层改造+ service 类注入============第 13 周===============================2017-05-15(周一)【任务:Task13a】× 用户登录2017-05-17(周三)【任务:Task13b】× 用户登录2017-05-19(周五)【任务:实验13】【知识点】× 基于 xml 配置的装配× 基于注解的装配+ JAR 包- \spring-framework-3.2.0.RELEASE\libs 下全部 JAR 包- 其它补充包- aopalliance-1.0- common-annotations- commons-logging-1.1.1+ 主要注解- @Component: 声明该类由 Spring 容器创建和管理- Controller(Action)注解: @Controller(bean的name)- Service 注解: @Repository(bean的name)- Dao 注解:@Service(bean的name)- @Autowired: 声明该属性由 Spring容器负责注入× Spring 与 Struts2.x 整合+ Spring 完整 JAR 包+ Struts2.x 完整 JAR 包+ Struts2.x 的 Spring 插件: struts2-spring-plugin-2.3.8.jar1、基于 xml 配置的装配× 类路径下 xml 配置文件2、基于注解的装配× Spring 2.5 以后才支持注解装配× JAR 包+ 其他补充包- aopalliance-1.0.jar- common-annotations.jar: 注解装配需要的- commons-logging-1.1.1.jar+ 主要注解- @Scope:设置标注为 @Component 组件的访问- @Scope("session")- @Scope("request")- @Component:将类标注为 IoC 容器管理的组件,更细分的注解如下:- @Repository:标注为Dao层组件 —— @Repository("userDao")- @Service:标注为 Service 层组件 —— @Service("userSvr")- @Controller:标注为 Web 层组件 —— @Controller("userAction")- @Autowired:自动装配,由 IoC 容器注入 —— @Resource- @Autowired(required = false): 如果被注解为 Autowired 的属性的 bean 不存在的话,不会报错- @Qualifier(限定符): 如果被注解为 Autowired 的属性的 bean 存在多个的话,就 @Qualifier(bean的name) 指定注入的 bean- @PostConstruct:对应 init-method 属性,标注为 初始化方法- @PreDestroy:定义 destroy-method 属性,标注为 销毁方法× 配置文件+ 启动对注解类的扫描:- 对 edu.njcc.rj1541 目录下的所有注解进行扫描× 举例+ Service 层+ Dao 层+ Client 层测试3、用户登录× Dao层的注解装配× Service层的注解装配× 测试4、Struts-Spring整合× 方案设计+ 问题: Web项目没有了 client,在哪里创建 IoC 容器?+ 解决思路- 方式1: 在 Action 中类似 client 创建 IoC 容器- 缺点: 每个 Action 都创建 IoC,效率低- 解决: 通过 Struts 容器去创建 IoC 容器 —— 方式2- 方式2: web.xml 配置,由 web 容器监听创建 IoC 容器- Struts2.x 配置- Spring 配置: 自动监听 Spring 配置,并创建 IoC 容器- contextConfigLocation: 指定 Spring 配置文件- ContextLoaderListener: web 上下文载入监听器× 引入 JAR 包: 拷贝到 WEB-INF 的 libs 下+ Struts2.x 包+ Spring 包+ Struts、Spring 整合插件: struts2-spring-plugin-2.3.8.jar× 配置 web.xml+ 监听器配置: ContextLoaderListenerorg.springframework.web.context.ContextLoaderListener+ 上下文参数:contextConfigLocationcontextConfigLocation/WEB-INF/beans.xml× 配置装配文件 beans.xml+ 类路径下配置: classpath:beans.xml+ WEB-INF下配置: /WEB-INF/beans.xml5、用户登录× Action+ 获取 service 的 bean× 注解方式+ xxxSvr 属性- 提供 setter 注入方法× 将 Action 纳入 IoC 容器管理+ xml 配置方式+ 注解方式- @Component- @Controller("userAction")=============第 14 周==============================2017-05-22(周一)【任务:Task14a】× 用户管理2017-05-24(周三)【任务:Task14b】× 用户管理2017-05-27(周五)【任务:实验13】× 【知识点】× 数据源dataSource× JdbcTemplate+ 增、删、改jdbcTemplate.update(sql, new Object[]{roleCode})+ 查- 单记录查询:jdbcTemplate.queryForObject(sql, new String[]{roleCode}, new RowMapper(){)- 多记录查询:jdbcTemplate.query(sql, new RowMapper<List>(){)× RowMapper()+ User: 单记录查询+ List: 多记录查询× 数据源dataSource 的 bean 配置× 数据库操作模板 JdbcTemplate 的 bean 配置=============第 15 周==============================2017-05-29(周一)【任务:Task14a】× 用户管理2017-05-31(周三)【任务:Task14b】× 用户管理2017-06-02(周五)【任务:实验14】× 【知识点】× MyBatis+ 属性配置文件+ 总配置文件+ 映射配置文件1、Dao层的 MyBatis 实现 —— 搭建环境× MyBatis: iBatis 的前身+ iBatis: 2002年+ MyBatis: 2010年 IBatis —— 被 Google 收购后改为 MyBatis× 开发准备+ 核心 jar 包: mybatis-3.0.4.jar- 将 mybatis-3.0.4.jar 解压缩,从解压缩的目录 mybatis-3.0.4\mybatis-3.0.4\org\apache\ibatis\builder\xml 下找到- mybatis-3-config.dtd- mybatis-3-mapper.dtd+ 帮助文档: MyBatis 3 User Guide Simplified Chinese.pdf —— 这个要仔细阅读+ 其他: 辅助的要不要无所谓× 搭建环境+ 引入 mybatis 的 Jar包: mybatis-3.0.4.jar 拷贝到 src 下+ 配置文件(主要有三个)- 总配置文件: SqlMapConfig.xml- 资源文件(可以不用): SqlMap.properties- 映射配置文件- 单表映射配置文件:User.xml- 主细表映射配置文件+ 资源文件: SqlMap.properties —— 属性配置文件,配置数据库连接的 4 个参数- 属性文件采用 key-value 对的方式- 也可以不用属性文件× 配置文件、映射文件的自动提示+ 配置文件: SqlMapConfig.xml- - 说明的是 该 xml 配置应该怎么使用标签库 dtd(标签描述库) —— 也有使用 xsd —— Scheme(模式)—— 规定可以说哪些话- 应该使用哪些标签 —— 规定可以说哪些话- 标签使用的先后顺序- Window/Preferences/XML/XML catalog/User Specified Entries/Add/3、MyBatis开发过程× S1 —— 数据源配置:SqlMap.properties× S2 —— 总配置文件:SqlMapConfig.xml× S3 —— 映射配置文件:User.xml× S4 —— Dao 接口实现开发+ 连接数据库+ 准备 SQL 语句+ 提交 SQL 语句+ 结果集处理4、数据源配置:SqlMap.properties× 数据库连接四个参数+ driver+ url+ username+ password5、总配置文件:SqlMapConfig.xml× 指定数据源配置× 指定类的别名: 简化编程× 配置数据源环境 //SQL Server 的环境 //事务管理器+ 使用 EL 表达式提取数据源属性值- 用 ${driver} 的形式从属性文件中提取属性的 key+ 不使用属性文件- 直接在配置文件中写上属性的 value× 比较总结- 纯 JDBC 时,用到的 4 个参数 —— 靠 JDBC 我们自己做- MyBatis框架中,MyBatis 帮我们做 —— 靠总配置文件去做6、映射配置文件:User.xml —— 单表映射× 问题SQL 语句还没有在配置当中管起来+ SQL 语句:CRUD语句配置+ 参数+ 结果× 映射配置文件 —— User.xml+ 映射文件做什么事- 是对原先 JDBC 编写的 SQL 语句都配置到 映射文件里头去,并给这个 SQL 设置一个 id- 提供了select * from user- id="selectAll":给该标签取一个 id 名称,以备编程使用- resultMap="UserResult":声明取出来的结果放到 id="UserResult" 声明的类中- select 操作- parameterType="String":指定参数的数据类型为String- delete 操作delete from user where username = #{x}- update 操作update user set password = #{password} where username = #{username}- parameterType="User":指定参数的类型为 User- #{password}:以 User 中的 password 属性作为参数- insert 操作insert into user values (#{username}, #{password})- 对数据库进行 CRUD 操作 —— 靠 JDBC 我们自己做- MyBatis 也帮我们做 —— 靠映射文件去做 —— User.xml- 每个 Java 对象都对应一个× 比较总结+ 纯 JDBC 时,所有 SQL 语句靠 JDBC 我们自己做+ MyBatis框架中,MyBatis 帮我们做 —— 靠总配置文件去做- 把原先用 JDBC 写在 Dao 中的 SQL 语句配置到 映射文件中7、接口实现开发+ 连接数据库:SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession- 准备主配置文件:Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");- SqlSessionFactoryBuilder -> SqlSessionFactory:SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(reader);- SqlSessionFactory -> SqlSession: SqlSession session = sf.openSession();+ 准备 SQL 语句:配置在 映射文件 User.xml 中- insert- id:操作的 id —— MyBatis 的 操作 所需要的 操作id- parameterType:参数类型 —— MyBatis 的 insert 操作所需要的参数- delete- update- select+ 提交 SQL 语句- session.insert("insertUser", user);8、测试单表的 CRUD× MyBatisUtil 工具配+ 加载总配文件、连接数据库 static {try {Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");sessionfactory = new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {e.printStackTrace();}}+ insert 插入+ delete 删除+ update 修改+ select 查询- 无条件查询- 带条件查询× service:接口及其实现类× dao:接口及其实现类+ 映射文件+ 总配置文件× TestCase------------------------------------------2015-06-08(第 15 周三)实验13:===========================================2015-06-10(第 15 周五)小结: MyBatis单表 CRUD× S1 —— 数据源配置:属性文件 SqlMap.properties 配置四个参数+ driver+ url+ username+ password× S2 —— 总配置文件:SqlMapConfig.xml+ 配置数据源文件+ 别名简化 实体类 的引用+ 连接数据库- 利用 EL 表达式取 属性文件的 属性值- ${driver}+ 配置映射文件× S3 —— 映射配置文件+ 实体类 映射: 建立实体类(属性) 与 数据库表(字段) 之间的映射关系- resultMap: 结果集(Map类型) —— Map<实体类User的属性名, 对应属性的值> —— 如: Map<"username", "admin">- 指的是 SQL 操作的结果集 与 类对象的映射- 不是 数据库表 与 类对象的映射- result: 建立 实体类User 属性与SQL语句中from表的字段 的 映射关系- property="roleCode": 实体类的属性- column="username": SQL 语句中相关的表的 字段+ CRUD 操作- 增删改操作- insert- delete- update- select- 参数- 传入参数: parameterType- 基本类型: int、String 等- 引用类型: User- 占位符替换- #{username}- 结果集- 结果集参数- 单值: resultType="User"- 集合: resultMap="UserResult"× S4 —— Dao 接口实现开发+ 连接数据库- 由 Mybatis 框架实现 —— 配置+ 准备 SQL 语句- 由 Mybatis 框架实现 —— 配置+ 提交 SQL 语句: 两个步骤- 获得 Session- 加载总配置文件- 实例化Session工厂- 连接数据库,获得 Session- 提交 SQL: Session 的主要方法- select: 提交 查询操作- update: 提交 增删改 操作- commit: 提交事务- rollback: 回滚事务+ 结果集处理: 由 Mybatis 框架实现 —— 配置任务: MyBatis与Spring整合、主细表 × MyBatis与Spring整合知识点:× MyBatis与Spring整合- mybatis-spring-1.0.0.jar 包- mybatis-spring-1.0.2.jar 包× MyEclipse 的 DB Browser: 在 MyEclipse 中操作数据库1、Spring与MyBatis整合× 搭建开发环境+ 引入集成包- mybatis-spring-1.0.0.jar 包:老包× Spring 配置+ MyBatis 主配置- 数据库连接属性文件- 实体类别名- 数据库连接- 映射文件+ 通过 Spring 配置文件去配置 —— beans-mybatis.xml- 数据库连接: 数据源配置- Session工厂配置: SqlSessionFactoryBean- 数据源- MyBatis 主配置 SqlMapConfig.xml× MyBatis 配置+ 主配置文件: SqlMapConfig.xml —— 只需要负责:- 实体类别名- 映射文件- 数据库连接参数属性文件: 不要了- 数据库连接: 不要了+ 映射文件: User.xml× Dao 层改造+ 注入 session- SqlSessionTemplate工具类: 被注入 SqlSessionFactoryBean+ CRUD 操作× Service 层+ 注入 UserDao× 测试× 新的集成包+ mybatis-spring-1.0.2.jar 包:新包+ 新老包使用方式上有点不同- typeAliasesPackage: 会将指定包下的 domain 类,把除去报名后剩下的裸体类名作为实体类的 别名- MyBatis 总配置文件可以省去2、MyEclipse 中操作数据库× DB Browser: MyEclipse 的数据库浏览器使用+ 打开 Database Explorer 视图+ 配置数据库连接:见实验报告+ 连接数据库+ 打开 SQL Editor 编辑器: 类似查询分析器× 一条 SQL 查询所有 角色 中的所有 User+ select * from role as r, [user] as u where r.roleCode = u.roleCode- 结果集中包含了全部的 Role 记录- 结果集中还包含了全部 User 记录+ select * from role as r, [user] as u where r.roleCode = u.roleCode and u.username='admin'- 结果集中包含了所查询的 User 记录- 结果集中还包含了所查询的 User 所属的 Role 记录× 问题: 包含了全部 Role、User 记录的结果集,如何分别转换到 roleList、userList 中去?+ 过去的做法: 分别查询 Role、User,形成两个结果集的+ 现在是一条 select,只有一个结果集+ 怎么办?这就是主细表查询的问题背景=====================================2015-06-20(第 16 周五)小结:Spring-MyBatis整合任务: 用户管理× 用 JdbcTemplate 改造 Dao 层× 总复习知识点:× 接口的不同实现1、Dao层的传统实现× 接口× 接口的 JDBC 实现: UserDaoImpl4Jdbc× 传统实现的问题+ 四步法- 数据库连接: Tools.getConn()- 准备 SQL 语句- sql- pstmt- 提交 SQL 语句- update- query- 结果集处理- ResultSet+ 问题- 频繁进行数据库连接- pstmt 参数处理比较麻烦- ResultSet 结果集处理比较麻烦+ 但套路都是完全一致的2、Dao层的 JdbcTemplate 实现 —— JDBC模板× JdbcTemplate 概述+ JDBC 的 CRUD 操作套路都是一致的: 可以提供一个模板化的 JDBC 工具 —— JdbcTemplate+ 套路- 连接数据库- 准备 SQL 语句- 提交 SQL 语句- 返回结果集处理+ 用 JdbcTemplate 代替 Tools.getConn()× 配置+ 数据源:dataSource- org.springframework.jdbc.datasource.DriverManagerDataSource- driverClassName- url- username- password+ jdbc模板:jdbcTemplate- org.springframework.jdbc.core.JdbcTemplate- dataSource× 接口的 JdbcTemplate 实现+ UserDao 接口的实现类 UserDaoImpl4Template+ 数据源: dataSource —— 数据库 —— Connection+ 方式1:先为 xxxDao 注入 dataSource,再由 xxxDao 实例化 JdbcTemplate+ 方式2:直接为 xxxDao 注入 JdbcTemplate- 在 beans.xml 装配 JdbcTemplate× Spring 开发了 JdbcTemplate 模板,提供了 SQL 的各种 CRUD 操作+ 增删改- sql = "insert into [user] values(?, ?, ?, ?, ?, ?, ?, ?)"- sql = "delete from [user] where username = ?"- sql = "update [user] set password = ?, name = ? where username = ?"- jdbcTemplate.update(sql, new Object[]{...})+ 查询一条记录- sql = "select * from [user] where username = ?"- jdbcTemplate.queryForObject(sql,new Object[]{username}, class)+ 查询多条记录- sql = "select * from [user]"- jdbcTemplate.query(sql, class)==========================================3、主细表的实体类× 较复杂的多表 select 查询时× 数据库模型: Role、User 表+ Role:角色表+ User:用户表+ 主外键关系- Role 主键:roleCode- User 外键:roleCode+ 角色表与用户表有主外键关系 —— 一对多关系- 一个角色可以有多个学生- 每个学生都肯定属于一个角色× 对象模型: 类的定义+ 定义 Role.java、User.java 类+ 情况1- Role: Role中包含了所有的下属用户- List users- User+ 情况2- Role- User: User中包含了该用户所属的角色- Role4、主细表映射× 主细表映射文件 —— RoleOne2Many.xml —— 注意 property="roleCode" column="roleCode" 中,必须与 类定义、表对应 名称保持一致+ 建立 类 与表 的结果映射- ofType="User": 相当于写了一个...- 遗憾: 为什么不用 ref 呢?+ 建立主细表联合查询 select 语句+同时建立对 Role、User 的单表查询- 注意:并没有单独建立 Role 类与 Role 表、 User 类与 User 表 的映射- 而是直接使用了 连接的映射× 总配置文件+ 设置 Role、User 的别名+ 加入映射配置5、主细表关联的查询 测试× client× service× dao============================================任务: 用户管理× 用 JdbcTemplate 改造 Dao 层× MyBatis 初步+ 单表的 CRUD 操作知识点:× 接口的不同实现× 数据源dataSource× JdbcTemplate+ 增、删、改jdbcTemplate.update(sql, new Object[]{roleCode})+ 查- 单记录查询:jdbcTemplate.queryForObject(sql, new String[]{roleCode}, new RowMapper(){)- 多记录查询:jdbcTemplate.query(sql, new RowMapper<List>(){)× RowMapper()+ User: 单记录查询+ List: 多记录查询× 数据源dataSource 的 bean 配置× 数据库操作模板 JdbcTemplate 的 bean 配置1、Dao层的传统实现× 接口× 接口的 JDBC 实现: UserDaoImpl4Jdbc× 传统实现的问题+ 四步法- 数据库连接: Tools.getConn()- 准备 SQL 语句- sql- pstmt- 提交 SQL 语句- update- query- 结果集处理- ResultSet+ 问题- 频繁进行数据库连接- pstmt 参数处理比较麻烦- ResultSet 结果集处理比较麻烦+ 但套路都是完全一致的2、Dao层的 JdbcTemplate 实现 —— JDBC模板× JdbcTemplate 概述+ JDBC 的 CRUD 操作套路都是一致的: 可以提供一个模板化的 JDBC 工具 —— JdbcTemplate+ 套路- 连接数据库- 准备 SQL 语句- 提交 SQL 语句- 返回结果集处理+ 用 JdbcTemplate 代替 Tools.getConn()× 配置+ 数据源:dataSource- org.springframework.jdbc.datasource.DriverManagerDataSource- driverClassName- url- username- password+ jdbc模板:jdbcTemplate- org.springframework.jdbc.core.JdbcTemplate- dataSource× 接口的 JdbcTemplate 实现+ UserDao 接口的实现类 UserDaoImpl4Template+ 数据源: dataSource —— 数据库 —— Connection+ 方式1:先为 xxxDao 注入 dataSource,再由 xxxDao 实例化 JdbcTemplate+ 方式2:直接为 xxxDao 注入 JdbcTemplate- 在 beans.xml 装配 JdbcTemplate× Spring 开发了 JdbcTemplate 模板,提供了 SQL 的各种 CRUD 操作+ 增删改- sql = "insert into [user] values(?, ?, ?, ?, ?, ?, ?, ?)"- sql = "delete from [user] where username = ?"- sql = "update [user] set password = ?, name = ? where username = ?"- jdbcTemplate.update(sql, new Object[]{...})+ 查询一条记录- sql = "select * from [user] where username = ?"- jdbcTemplate.queryForObject(sql,new Object[]{username}, class)+ 查询多条记录- sql = "select * from [user]"- jdbcTemplate.query(sql, class)------------------------------------------2015-06-08(第 15 周三)实验13:===========================================04-29 09 Struts2其它,Spring 南化院网站 Task09 实验0805-06 10 XML装配、CRUD 用户管理 Task10 实验0905-13 11 注解、Spring、Struts整合 用户管理 Task11 实验1005-20 12 Spring MVC 用户管理 Task12 实验1105-27 13 Spring MVC注解 系统登录 用户管理 Task13 实验1206-03 14 JdbcTemplate 用户管理 Task14 实验1306-10 15 MyBatis、单表 用户管理 Task15 实验1406-17 16 主细表、Spring集成、总复习 角色管理、用户管理 Task16 实验15

猜你喜欢

转载自blog.csdn.net/nice_fly/article/details/73168368
今日推荐