Cookie
###记录浏览记录:
技术分析:
```
ServletContext:
作用域:整个工程,也就是整个网站,但是所有用户共享数据,无法私有每个用户的私有数据
Request:
作用域:一次请求一次响应,生命周期/作用域太短,用户的操作必定多次请求
Cookie和Session会话技术:
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie:
作用域:整个浏览器,生命周期:一次浏览器的打开关闭(默认),数据保存到浏览器,和一个浏览器端绑定,不同浏览器端存储数据不同,实现了私有化.
```
需求分析:
```
1. 用户浏览商品时需要记录这次访问
2. 将浏览过的商品显示在页面上,按时间倒叙排列
3. 浏览记录最多三条
```
代码实现分析:
```
1. 点击商品后将商品的唯一标识存入cookie
必须由Java代码实现,点击(请求)-->servlet获取ID
判断是否具有历史记录,如果没有将ID封装到cookie对象中(history)
有判断是否浏览过此商品,如果没有将ID添加到history对象第一个
浏览过此商品,将ID放到第一个
2. 通过查找数据库找出商品信息,然后显示在商品页面上
动态页面必须用到JSP
```
Session
## 购物车
需求分析:
```
将商品存储到购物车
```
技术选择:
```markdown
* ServletContext、request域对象不能用和上节相同。
* cookie:本身有大小和个数的限制,不适合当购物车
* 数据库:访问次数太频繁,更不适合
* session:同cookie,存储用户私有数据,可以实现同一用户多次请求时数据的保存
```
步骤分析:
```markdown
1. 在详情页点击购物车将商品加入购物车,相同商品只有数量增加
2. 添加完后提供`继续购物`和`购物车结算`两个跳转
3. 在购物车结算页面显示商品和数量
```
代码分析:
```java
1. 在点击购物车向servlet发送请求,将商品名字传递过去:`/webcookie/CartServlet?name=贝尔`(GET方式)
2. 由于需要存储商品名和数量,所以value类型为Map
3. 在servlet页面获得session对象,判断是否有购物车:
//解决GET方式的请求的中文乱码
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
Map<String,Integer> map =request.getSession.getAttribute("cart");
//没有购物车就新建一个
if( map== null){
map = new LinkedHashMap(String,Integer);
}
//有购物车就判断购物车中有没有此商品
if(map.containsKey(name)){
int value =map.get(name);
map.put(name,++value);
}else{
map.put(name,1);
}
//先创建value值,再利用key键存入session
request.getSession().setAttribute("Cart", map);
```
## Session概述
```markdown
【session原理】
一个用户和一个客户端绑定,和cookie一样
* Cookie本身是有大小和个数的限制.Session没有限制.Cookie的数据保存在客户端,Session数据保存在服务器端.
* Session的执行原理:基于Cookie的.
使用Session:
* 获得Session:
* request.getSession();
【生命周期】
session何时创建和销毁?作用范围:
* 创建:服务器端第一次调用getSession()创建session.
* 销毁:三种情况销毁session:
* 1.session过期. 默认过期时间为30分钟.
* 2.非正常关闭服务器.如果正常关闭session序列化到硬盘.
* 3.手动调用session.invalidate();
* 作用范围:多次请求.(一次会话)
【作用范围一次会话的根本原因】
* 服务器识别是否为同一用户根据用户cookie携带的AsessionID,一次会话后cookie销毁,服务器中开辟的session没有钥匙打开
```
## 验证码
【需求分析】
```
在验证码位置生成一个验证码图片
验证码文本框输入的值和提示的验证码进行比较
```
【技术分析】
```markdown
【提示的验证码如何生成?生成后存在哪里】
图片位置的src为`/webcookie3/verifyServlet`
```
JSP
# JSP
## 【JSP的概述】
```markdown
什么是JSP:
* Java Server Pages(Java服务器端的页面)
为什么要学习JSP:
* SUN公司推出的Servlet自身有缺陷,没有办法与ASP,PHP进行竞争.推出了动态网页开发技术JSP.
使用JSP:
* JSP = HTML + Java代码 + JSP自身的东西.
执行JSP的过程:
* JSP翻译成Servlet,编译这个Servlet的类,生成class文件.得到执行. 因此JSP也有请求响应
JSP文件保存位置:
* 服务器所在路径\work\Catalina\localhost\webproduct\org\apache\jsp
```
## 【JSP的脚本】
```
<%! %> :翻译成Servlet中的成员内容. 定义变量,方法,类. -- 不建议.
<% %> :翻译成Servlet中service方法内部的内容. 定义类,变量
<%= %> :翻译成Servlet中service方法中out.print();
```
## 【JSP的注释】
```java
HTML的注释 :<!-- 注释 -->
Java代码的注释 :// 单行注释 /*多行注释*/ /** 文档注释 */
JSP的注释 :<%-- JSP的注释 --%>
* 一个原则:什么代码用什么注释
```
## 【JSP的指令】
```XML
指令的语法:
<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%>
JSP中有三个指令:page指令, include指令, taglib指令.
* JSP中page指令:<%@ page %> -- 设置JSP的.
* errorPage :设置错误友好页面的提示.
* isErrorPage :通过这个设置显示JSP的错误信息.
* 设置全局的错误友好页面:
* 在web.xml中设置:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
* JSP中的include指令:指示JSP包含其他的页面.
<%@ include file="logo.jsp" %>
<%@ include file="menu.jsp" %>
<h1>BODY部分</h1>
<%@ include file="footer.jsp" %>
* JSP中的taglib指令:指示JSP引入标签库.
<%@ taglib uri="标签的URI的路径" prefix="标签的别名" %>
```
## 【JSP的内置对象】
```markdown
JSP的内置对象:在JSP中可以直接使用的对象.
JSP中有9大内置对象:
* request HttpServletRequest
* response HttpServletResponse
* session HttpSession setAttribute();getAttribute();
* application ServletContext setAttribute();getAttribute();
* page Object toString();wait();
* pageContext PageContext setAttribute();getAttribute();
* config ServletConfig getServletName();getServletContext();
* out JspWriter write(),print();
* exception Throwable
page内置对象 :真实对象是Object,就是JSP翻译成Servlet后的类的引用.
out内置对象 :out和response.getWriter是不是同一个对象?区别是什么?(截图)
pageContext内置对象 :
* 获得其他的8个内置对象 :编写通用性代码或者框架的时候.
* 向JSP的四个域中存取数据 :
JSP的四个域范围:
* PageScope :当前页面中有效. pageContext PageContext
* RequestScope :一次请求范围. request HttpServletRequest
* SessionScope :一次会话范围. session HttpSession
* ApplicationScope :应用范围 application ServletContext
```
## 【JSP的动作标签】-列出六个
```jsp
标签的作用:简化代码.(现在设计模式已经不用了)
<jsp:forward /> :用于页面的转发.
* <jsp:forward page="/demo1-jsp/demo3-object/demo3.jsp"></jsp:forward>
<jsp:include /> :用于页面的包含.(动态包含)
*****静态包含和动态包含的区别?(<%@ include%>和<jsp:include>)
<jsp:param /> :用于带有路径的标签下,传递参数.
<jsp:useBean /> :用于在JSP中使用JavaBean.
<jsp:setProperty /> :用于在JSP中向JavaBean设置属性的.
<jsp:getProperty /> :用于在JSP中获得JavaBean的属性.
```
## EL表达式
###【EL的概述】
```markdown
【什么是EL】
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
【为什么学习EL】
简化JSP的代码,而且减少<%%>
【使用EL表达式】
语法:${EL表达式}
【EL的功能】
* 获取数据:(JSP的四个域)
以什么名字存进去就以什么名字取出来,存进去什么类型取出来就是什么类型
数组、List :[] ---下标
map、java对象 :. ---属性
* 执行运算:
empty:是否为空
not empty:
lt:less than
gt:great than
le:less equal
ge:great equal
eq:equal
* 操作WEB开发的常用的对象:
* 调用Java中方法:--很少用.
```
## JSTL
### 【JSTL的概述】
```markdown
【什么是JSTL】
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
【为什么学习JSTL】
* JSTL和EL结合 替换页面中<%%>
【JSTL版本】
* JSTL1.0 :不支持EL表达式.
* JSTL1.1 和 1.2 :支持EL表达式.
【JSTL的标签库:包含了五类标签.】
* core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL函数库)
【使用JSTL】:
* 引入JSTL的相关的jar包.
* 在页面中引入标签库.<%@ taglib uri=”” prefix=””%>
```
【JSTL的核心标签的用法 】
```markdown
* if
* forEach
```
# 商品信息页面的动态显示
## 【需求分析】
```
从数据库获取商品信息,利用JSP显示在页面上
```
## 【步骤分析】
```markdown
**MVC模式:**
1. 发送请求,由Servlet接收作为控制层分配任务和控制流程,业务流程都有体现,但本身不做,创建Service对象(业务逻辑层),调用它的对应方法完成业务逻辑
* 无参数,直接创建Service对象,查找商品信息
* 每个具体Servlet的对象只有一个,但是每次请求都会调用Service的创建方法,因此Service对象不同
2. Service对象中对应方法处理业务逻辑,如果需要从数据库获取信息则创建Dao对象,调用方法让Dao层完成查询
3. Dao对象对应方法只实现数据查询,并将结果返回给Service层
```
## 【技术选择】
```
以何种形式将数据返回:
由于商品很多,商品中信息也很多,因此将商品封装到实体对象中,并将对象存入集合
```
|