第八周day14 1. 案例:记录用户浏览商品的记录 (1) 步骤分析 ① 在登录完成后,显示商品列表页面. ② 为商品列表页面做一些准备工作. ③ 点击某个商品,将商品ID传递一个Servlet. ④ 在Servlet中:判断是否是第一次浏览商品 ⑤ 如果是第一次:将商品的ID存入到Cookie中即可. ⑥ 如果不是第一次:判断该商品是否已经浏览了. ⑦ 如果浏览器过.删除之前元素,将该元素添加到最前面. ⑧ 如果没有浏览过该商品.判断最大长度,没有超过限制,直接加到最前,如果已经超过限制,删除最后一个,将其插入到最前. (2) 需要用到的方法 ① request.getCookies()——获得从浏览器提交到服务器所有cookie ② response.addCookie(Cookie cookie)——向浏览器设置cookie ③ getValue();——获得cookie中的值 ④ new LinkedList<E>(Arrays.asList(数组))——把数组转换成双链集合(arraylist是单链集合) day151. session域对象 (1) 创建:服务器端第一次调用getSession()创建session (2) 销毁 ① session过期,默认30分钟, 1) 在Tomcat/conf/web.xml可以修改 2) 在项目下的web.xml可以修改 3) 在代码中session.setMaxInactiveInternal(秒);可以修改 ② 非正常关闭服务器(断电或手动点击terminate按钮),如果正常关闭session序列化到硬盘 ③ 手动调用session.invalidate(); (3) 作用范围:多次请求,一次会话 2. JSP (1) 什么是jsp: ① Java Server Pages(Java服务器端的页面) (2) 为什么要学习: ① Servlet自身有缺陷,没有办法与ASP,PHP进行竞争,推出了动态网页开发技术 (3) 使用 ① jsp=HTML+Java+jsp本身的东西 (4) 执行过程 ① jsp翻译成Servlet,编译这个Servlet的类,生成class文件 (5) jsp的脚本 ① <%! %>:翻译成Servlet中的成员内容,定义变量,方法和类——不建议使用 ② <% %>:翻译成Servlet中service方法内部的内容,定义类,变量 ③ <%= %>:翻译成Servlet中service方法中out.print(); (6) page指令 ① page指令 1) <%@ page %>——用来设置jsp 2) contentType:设置浏览器打开这个jsp的时候采用的默认字符集编码 3) pageEncoding:设置文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码 4) import:在jsp中引入类对象,但是import可以出现多次 5) extends:设置jsp翻译成Servlet后继承的类 6) autoFlush:设置jsp的缓存自动刷出true自动刷出 7) buffer:设置jsp的缓冲区的大小,默认8kb 8) isELIgnored:设置在jsp中是否忽略EL表达式。默认不忽略 9) * 设置全局的错误友好页面: a. * 在web.xml中设置: b. <error-page> c. <error-code>404</error-code> d. <location>/404.jsp</location> e. </error-page> f. <error-page> g. <error-code>500</error-code> h. <location>/500.jsp</location> i. </error-page> ② include指令 1) 可以包含其他页面 a. <%@ include file=”相对路径”%> ③ taglib指令 (7) jsp的内置对象 ① 概念:在jsp中可以直接使用的对象 ② 九大内置对象 1) request 2) response 3) session 4) application 5) page:真是对象是object,就是jsp翻译成Servlet后的类的引用 6) pageContext 7) config 8) out: a. out和response.getWriter是不是同一个对象?区别是什么? a) out真是对象是JspWriter 9) exception 3. PageContext (1) 作用范围:仅限当前页面 (2) 作用: ① 域对象里面存取值,setAttribute getAttribute ② 获取其他8大内置对象: 1) 主要在编写框架,通用性很高的代码中 ③ 可以往其他三大域里存取值: 1) jsp的四个域范围: a. pagescope:当前页面有效 pageContext b. requestscope:一次请求范围 request c. sessionscope:一次会话范围 session d. applicationscope:应用范围 application 敲浏览记录和购物车案例day161. EL (1) 概述:表达式语言,只能在jsp页面使用 (2) 基本语法:${el表达式} (3) 功能: ① 获取数据:(jsp的四个域) 1) 举例: a. ${pageScope.name} a) pageScope是域范围 b) name是key b. ${name} a) 先从page里面找有没有name,没有的话再找request,再找session,再找application(就近原则) c. 如果有没name,就会返回一个””(空字符串) d. ${str[0]} a) 获取数组的元素,集合同理 e. ${map.key} a) map是map集合 b) key是map里的建 c) 如果key有特殊字符(如.),就需要加[]——${map.[key.key]} f. ${list[0].name} a) list里面存的是JavaBean(普通类,实现类),name是这个JavaBean的属性,这个el表达式获取的是这个JavaBean的name的值 ② 执行运算: 1) 算数运算 a. 1+”2”=3 2) 比较运算 3) 逻辑运算 4) 三元运算 5) 特殊字符empty:判断域对象中的值是否为null a. ${empty key} ③ 操作web开发的常用的对象: 1) 获取请求头的信息 a. ${header[“User-Agent”]} 2) 获取cookie中的值 a. ${cookie.键.value} ④ 调用Java中的方法:(不常用) 2. JSTL (1) 概述: ① JSP标准标签库 ② 作用:与el结合减少<%%>的使用 (2) jsp怎么使用 ① 引入jar包(两个) 1) jar:jstl.jar 2) standard.jar ② 在页面中引入标签库<%@ taglib uri=”路径” prefix=”标签库的前缀”%> (3) 常用标签 ① 定义变量: 1) <c:set var=”变量名” value=”值” scope=”存入的域对象”></c:set> ② 输出值: 1) <c:out value=””></c:out> 2) <c:out value=”${a}” default=”b”></c:out>:如果变量a没有值就输出b ③ 判断: 1) <c:if test=”判断”>如果成立就执行这里</c:if> 2) <c:if test=”判断” var=”变量名” scope=”存入的域对象”>如果成立就执行这里</c:if> ④ 遍历: 1) <c:forEach var=”元素” items=”${域对象名称}”> ${元素} </c:forEach> 2) <c:forEach var=”元素” begin=”0” end=”10” step=”每次增加” varStatus=””> ${元素} </c:forEach> (4) 函数库 ① 需要另外引入jar包 3. MVC(model view beanUtils) (1) jsp+ Servlet+ JavaBean (2) M——model:对应JavaBianca技术,作用封装和处理数据 (3) V——view:视图,对应jsp和html等技术,作用展示数据给用户看 (4) C——controller:控制对应Servlet,Struts,SprinMVC等技术,作用接收浏览器请求,然后响应 day171. 反射 (1) 目的 ① 操作某个类的属性或方法 (2) 与反射有关的对象 ① Class字节码对象 1) 获得方法 a. Class.forName(“全类名”)——推荐 b. 类名.class c. 类的对象.getClass() ② Field对象(属性) 1) 获取属性:getDeclaredField(String name) 2) 设置访问权限:setAccessible(Boolean flag) ③ Method对象(方法) 1) 获取一个方法:getMethod(方法名,该方法参数的字节码对象); 2) 获取所有方法:getMethods(); 3) 执行方法:invoke(当前方法的实例化对象,方法里的参数); ④ Constructor构造器对象 2. JavaEE三层架构和MVC的区别 (1) Java ① web层:控制层——处理浏览器发送的请求,然后响应 ② service层:业务层——处理业务逻辑(处理事务) ③ dao层:数据库持久层——操作数据库 (2) MVC ① M:model模型层,JavaBean技术,封装和处理数据 ② V:view视图层,jsp和html等,展示数据给用户看的 ③ C:Controller控制层,Servlet,Struts,spring等技术,作用处理浏览器的请求,然后响应 3. 事务(了解) (1) 概述 ① 一组不可分割的单元,这个单元的操作要不一起成功,要不一起失败(转账案例)。 (2) 特点 ① 原子性:强调事务的不可分割 ② 一致性:强调的是事务的执行的前后,数据的完整性要保持一致 ③ 隔离性:一个事务的执行不应该受到其他事务的干扰 1) 如果不考虑事务的隔离性,引发一些安全性问题(读问题/写问题) ④ 持久性:事务一旦结束(提交/回滚)数据就持久保存到了数据库 (3) 三大读问题 ① 脏读:一个事务读到另一个事务还没有提交的数据 ② 不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在当前事务中多次查询结果不一致 ③ 虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致 (4) 四大隔离级别(性能与级别成反比) ① read uncommited:未提交读——脏读,不可重复读和虚读都可能发生 ② read committed:已提交读——避免脏读(Oracle默认) ③ repeatable read:可重复读——避免脏读和不可重复读(MySQL默认) ④ serializable:串行化读——避免三大读 (5) MySQL的事务管理两种方式(默认自动提交) ① 手动开启事务 1) start transaction——开启事务 2) 多条sql 3) commit/rollback; ② 设置一个自动提交参数 1) set autocommit=0;——将autocommit设置成off a. show variables like ‘%commit%’——查看与commit相关参数 (6) JDBC的事务管理 ① 常用方法 1) void setAutoCommit(boolean autoCommit)——设置是否自动提交 2) void commit()——提交 3) void rollback()——回滚 ② 第一种思路 1) 通过参数传递的方式,把connection在service层传递到dao ③ 第二种思路 1) 通过把connection绑定到当前线程,用TreadLocal() a. 在JDBCUtils中创建TreadLocal b. 在开启事务方法中获取新的连接,开启之后把连接存入线程 c. 在commit/rollback中,从线程中获取连接,提交/回滚后close关闭连接后,要把连接从线程中移除,以免重复开启 day181. 案例:商品管理 (1) 需求分析: ① 添加商品 ② 修改商品 ③ 删除商品 ④ 查看商品 1) 单个查询 2) 多个查询 3) 条件查询 ⑤ 分页显示 (2) 概要设计:根据需求分析文档,设计功能里面需要用的表和具体的功能实现的流程图 day191. ajax(异步的JavaScript And XML) (1) 什么是ajax:局部刷新页面(同步是整个刷新) (2) 功能:不中断用户体验 (3) 概念:异步请求技术,依赖异步XMLHTTP (4) XMLHttpRequest ① 属性 1) onredystatechange:异步请求对象的状态发生改变,会触发时间,发送异步请求 2) 异步请求对象的状态属性 a. 请求的状态:readyState==4,表示浏览器向服务器发送请求成功 b. 响应的状态:status==200,表示服务器向浏览器响应成功 3) 接收服务器响应数据的属性 a. 服务器向浏览器响应的字符串:responseText b. 服务器形影浏览器响应xml数据:responseXML; ② 方法 1) open(请求方式,请求路径,是否异步):异步去想服务器发送请求 2) send(请求参数):发送请求 3) setRequestHeader(头信息,头的值):处理post请求方式的中文问题 (5) 通过ajax ① 创建异步请求对象(粘贴) ② 发送异步请求(建立连接) ③ 发送请求的参数(如果是post请求方式需要设置请求头,get方式不需要) ④ 监听异步请求过程的状态(这个步骤可以放在2,3前面) 1) 判断请求是否发送成功 2) 判断响应是否成功 3) 接收服务器响应的数据 2. jQuery (1) ajax部分的方法 ① jq对象.load(路径,提交的参数,回调函数); ② $.get(路径,提交的参数,回调函数,服务器响应的数据类型)——常用 1) 响应的数据类型:文本,json,xml,jsp,html,等等 ③ $.post(路径,提交的参数,回调函数,服务器响应的数据类型)——常用 ④ $.ajax();——用的不多 ⑤ serialize();——jq的ajax传递参数的时候需要使用的方法 (2) 其他常用方法 ① html() 1) 如果不带参数,结果就是获取标签内的内容 2) 如果带参数,结果就是给标签内添加参数 ② attr() 1) 带一个参数,获取该属性的value 2) 带两个采纳数,给该参数设置值 day201. jQuery案例:省市联动 (1) 用xml作为传输数据的格式 ① 需要用一个 XStream()对象 调方法toXML()把数据转换成xml格式 ② 需要设置传输时的格式response.setContentType(“text/xml;charset=utf-8”); (2) 用json作为传输数据的格式 ① 什么是json 1) 一种数据交换的格式,更加轻量级,解析非常简单 ② JsonConfig fig = new JsonConfig();//创建json工具 ③ fig.setExcludes(new String[]{"pid"});//排除pid ④ JSONArray.fromObject(list,fig);//把list转换成json格式 ⑤ 也需要设置传输格式response.setContentType(“application/json;charset=utf-8”); (3) 用json转换单个对象 ① JsonObject jo=jsonObject.fromObject(user); 2. listener(监听器)了解 (1) 什么是监听器 ① 就是一个Java类,用来监听其他的Java的状态的变化 (2) web开发中的三类监听器 ① 生命周期监听器 1) request:访问服务器就创建,响应结束就销毁 2) session:第一次请求服务器,调用getSession就创建 a. 销毁:默认30分钟销毁 b. 非正常关闭 c. 手动调用销毁方法invalidate() 3) 注意:ServletContextListener监听器:在服务器启动时,加载spring的配置文件 4) ServletContext:在服务器启动时创建,服务器关闭销毁 ② 域对象属性值的变化的监听器(设置值,替换之,移除值) ③ session的钝化和活化,绑定和解绑定的监听器 day211. Filter(过滤器)重要 (1) 概述 ① 什么是过滤器 1) 可以过滤从客户端向服务器发送的请求 ② 应用场景 1) 基本的校验操作:用户没有登录,不允许操作 2) 全站的乱码问题处理 3) 自动登录 4) ...... ③ 过滤器生命周期(了解) 1) 创建:服务器启动的时候 2) 销毁:服务器关闭的时候或者移除项目的时候 3) init方法,启动服务器时调用一次 4) destroy方法,关闭服务器时调用一次 5) doFilter方法,请求一次,执行一次 (2) 入门案例 ① 直接新建filter文件(跟Servlet一样,配置xml) (3) 路径配置 ① 完全目录匹配:/jsp/jsp.jsp ② 目录匹配 1) 拦截所有请求:/* 2) 拦截jsp下的所有请求:/jsp/* ③ 扩展名匹配:*.do或者*.action(不能写/*.do) (4) 过滤器链的概述 ① 一个项目可以有多个Filter,多个Filter组成一个过滤器链 ② 执行顺序根据xml配置来排序 (5) 拦截方式<dispatcher></dispatcher> ① REQUEST 默认拦截方式,拦截的请求 ② FORWRAD 拦截转发 ③ (6) 案例:过滤器,自动登录
|