黑马程序员技术交流社区

标题: 【石家庄校区】Cookie-MVC [打印本页]

作者: nan935682648    时间: 2018-5-21 15:12
标题: 【石家庄校区】Cookie-MVC
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层
```

## 【技术选择】

```
以何种形式将数据返回:
    由于商品很多,商品中信息也很多,因此将商品封装到实体对象中,并将对象存入集合
```









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2