黑马程序员技术交流社区

标题: 【成都校区】jsp/MVC/EL/JSTL/Cookie/Session/response/request/servletContext [打印本页]

作者: zeroHe    时间: 2018-12-27 08:52
标题: 【成都校区】jsp/MVC/EL/JSTL/Cookie/Session/response/request/servletContext
【jsp】

01 jsp 指令
    格式:<%@ 指令 属性1=属性值1;属性2=属性值2 %>

    01 page 指令
        01 contentType,指定页面编码
           低级的编辑工具还需要指定pageEncoding
           language,默认且只支持java
           buffer,缓冲区大小
                <%@ page contentType="text/html;charset=UTF-8"
                         language="java"
                         pageEncoding="utf-8"
                         buffer="16kb"
                %>

        02 inport 导包
                <%@ page import="java.util.ArrayList" %>
                <%@ page import="java.util.List" %>

        03 isErrorPage="false"(默认为false) errorPage="500.jsp"
                当isErrorPage为true,可以使用exception内置对象

                全局页面错误的配置 web.xml
<error-page>
    <error-code>500</error-code>
    <location>/jsp/500.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/jsp/exception.jsp</location>
</error-page>


    02 include 指令 包含资源文件
                <%@ include file="jsp/top.jsp"%>

    03 taglib 指令 倒入资源
                <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

02 jsp 注释
    01 <!-- --> html注释
    02 <%-- --%> jsp注释

03 jsp内置对象 9
        pageContext         PageContext                 当前页面
        request                HttpServletResquest        一次请求访问的多个资源(转发)
        session                HttpSession                一次会话的多次请求之间
        application        ServletContext                当前web应用

        response        HttpServletResponse        响应对象

        page                Object                        当前页面(servlet)的对象,this
        out                JspWriter               
        config                ServletConfig                配置对象

        exception        Throwable                异常对象

【MVC】
01 M model 模型 完成具体的业务操作
02 V view 视图 展示数据
03 C controller 控制器 获取客户端的输入,调用模型,将数据交给视图展示


【EL】 表达式语言,替换和简化jsp页面中java代码的编写

    01 语法 ${表达式}
        jsp默认支持El,可以使用 isELIgnored="true" 忽略 EL 表达式 或者
        \${表达式}

    02 运算
        01 算术运算符 + - * /(div) %(mod)
        02 比较运算符 > < >= <= == !=
        03 逻辑运算符 &&(and) ||(or) !(not)
        04 空运算符 empty 【】
                ${empty list}
                判断字符串、集合、数组对象是否为null或者长度为0
                ${not empty list}
                判断字符串、集合、数组对象是否为null并且长度为0

    03 获取域的数据
        01 ${域名.属性名}

  ${pageScope.page}
  ${requestScope.attr}
  ${sessionScope.attr}
  ${applicationScope.attr}
        ${属性名} 从小的区域查找,如果找不到到大的区域查找,如果实在找不到,则为

内容为空的字符串

        02 对象属性的值
            ${user.id}

        03 list ${list[索引值].属性值}

        04 map ${map.key} / ${map["key"]}

    04 隐式对象 EL表达式中有11个隐式对象
        01 pageContext 可以获取jsp其他八个内置对象
                ${pageContext.request.contextPath} :动态获取虚拟目录


【jstl】jsp标准标签库,替换和简化jsp页面中java代码的编写
        apache组织提供的开源的jsp标签

    01 使用步骤
        01 导入 jstl 相关的jar包
        02 使用 taglib 引入标签库

    02 常用的标签
        01 if <c:if test="true">我是真的</c:if> test属性值为真,标签体内容被显示

        02 choose

<c:choose>
    <c:when test="${week == 1}">
        周一见
    </c:when>
    <c:otherwise>
        今天不是周一
    </c:otherwise>
</c:choose>

        03 foreach
            01 begin
            02 end
            03 var 【】
            04 step 步长
            05 varStatus (index 从0开始,count从1开始)【】
            06 items

常见的例子:

01

<c:forEach begin="1" end="10" var="i" step="1" varStatus="st">
${i} ${st.index} ${st.count} <br>
</c:forEach>

02 list

<c:forEach items="${requestScope.userList}" var="user" varStatus="st">
    ${st.index} ${st.count} ${user.id} ${user.username} ${user.password}<br>
</c:forEach>

03 map

<c:forEach items="${requestScope.map}" var="entry" varStatus="st">
    ${st.count} ${entry.key} ${entry.value}<br>
</c:forEach>


【MVC】
【三层架构】
01 界面层 用户看到的组件,用户可以通过组建跟服务器进行交互
02 业务逻辑层 处理业务逻辑
03 数据访问层 操作数据存储文件

【用户信息的增删改查操作】

    servlet + jsp + mysql + jdbctemplete + druid + beanutils + tomcat

【Cookie】客户端会话技术
    一次会话包含多次请求和响应

    Cookie tmp = new Cookie("name","value");

    resp.addCookie(tmp);

    Cookie[] cookies = req.getCookies();

    cookie.getName()/cookie.getValue()

    生命周期:
        01 默认情况下,当浏览器关闭后,cookie数据被销毁
        02 设置 cookie 的生命周期 cookie.setMaxAge(int seconds);
            正数,将cookie数据写到硬盘的文件中,持久化存储
            负数,默认值
            0,删除 cookie 信息

    存储中文:
        01 tomcat8之前,tomcat不能直接存储中文数据
            需要将中文数据转码,一般采用URL编码
        02 tomcat8之后,tomcat能直接存储中文数据

    共享范围:
        如果服务器有多个web项目,那么在这些web项目中cookie是否能共享

        01 默认情况下,不能共享

        02 cookie.setPath(String path)【默认情况下,path为当前项目的虚拟目录】
            如果想共享cookie,可将 path 设置为 "/"

        不同 tomcat 服务器之间的 cookie 共享问题
            setDomain(String path)
                【如果设置的一级域名相同,那么多个服务器之间cookie共享】
                ".baidu.com"

    特点:
        01 存储在客户端,不大安全
        02 浏览器对单个cookie的大小有限制(4kb)以及同一域名的cookie的数量也有数

量(20个)
    作用:
        01 一般用于存储少量的不太敏感的数据
        02 在不登陆的情况下,完成服务器对客户端的身份识别


【cookie : 记住上一次访问时间】

【jsp java server page】java 服务端 页面

    01 既可以写html代码,也可以写java代码

    02 本质上是servlet

jsp脚本 jsp定义java代码的方式
    01 <%  %>
    02 <%= %>
    03 <%! %>

jsp 内置对象(共九个)
    01 request
    02 response
    03 out vs response.getWriter():
        tomcat先清空response.getWriter()的缓冲区,在清空out的缓冲区


【Session】服务端会话技术,在一次回话的多次请求响应之间共享数据,存储在服务器。
    01 获取
        HttpSession session = request.getSession();

    02 作为域对象
        session.setAttribute("USER",new Object());
        Object obj = session.getAttribute("USER");
        session.removeAttribute("USER");

    03 创建,第一次调用 request.getSession() 时创建

    04 Session的实现依赖于Cookie JSESSIONID

    05 当客户端关闭后,服务端不关闭,两次获取的session是否相同
        01 默认情况下,不同
        02 如果想设置相同 创建Cookie,其中name设置为JSESSIONID,value设置为

session.getID()

       客户端关闭,服务器关闭后,两次获取的session是否相同
        01 不是同一个,但是要保证数据不丢失
                01 session的钝化:服务器正常关闭时,将session序列化到硬盘中
                02 session的活化:服务器启动时,将session从硬盘中反序列化
                【】01 tomcat会自动钝化与活化;02 idea会钝化,但在启动的时候会删

除work目录

    06 session什么时候销毁
        01 服务器非正常关闭(正常关闭,会进行session的钝化)
        02 调用 session.invalidate()
        03 session默认失效时间:30分钟

    07 配置项目的session实现时间,单位:分钟
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

【Session 验证码】


【response】

javaBean 封装数据
    01 类,public
    02 成员变量,private
    03 无参数构造函数
    04 提供公共的getter/setter方法

字段
属性

【http 响应消息】


响应行
    HTTP/1.1 200 OK
    协议/版本 响应状态码 状态码描述


    响应状态码:服务器告诉客户端浏览器本次请求和相应的一个状态

        1XX:服务器接收客户端的数据,但没有接收完成。等待一段时间后,发送1XX状态

码。

        2XX:成功。代表:200

        3XX:重定向。代表:302,重定向;304,访问本地缓存。

        4XX:客户端错误。代表:404,请求路径没有响应的资源;405,请求方式错误。

        5XX:服务端错误。代表:500。


响应头

    Content-Type:text/html;charset=UTF-8
    服务器 告知 客户端 本次响应体【数据格式】以及【编码方式】

    Content-disposition:
    服务器 告知 客户端,以什么格式打开响应体的数据
        01 默认为 in-line,在当前页面内打开
        02 attachment;filename=xxx,以附件的格式打开

    Location:结合302状态码做重定向使用

响应空行

响应体:传输的数据


【response】
    01 setStatus(int state)
    02 setHeader(String header,Stirng value)
    03 getOutputStream()/getWriter()

【重定向】
    01 状态码,302
    02 location,新资源的请求路径

        response.setStatus(302);
        response.setHeader("location","/servlet/response02");

        response.sendRedirect("/servlet/response02");

        response.sendRedirect("http://www.baidu.com");

重定向特点:
    01 浏览器地址栏发生变化
    02 可以访问其他站点的资源
    03 两次请求【不能使用request对象来共享数据】(可以通过url传递参数)

【路径】
    相对路径 绝对路径

    虚拟目录的动态获取:String contextPath = request.getContextPath();


【输出字符数据】
   01 获取流之前,设置流的编码方式(默认为 ISO-8859-1)为utf-8
     request.setCharacterEncoding("utf-8");
   02 告知浏览器,响应体数据的编码方式
     response.setHeader("Content-Type","text/html;charset=UTF-8");

     response.setContentType("text/html;charset=UTF-8");

     PrintWriter writer = response.getWriter();【默认为 ISO-8859-1】
     writer.write("世界你好");
     writer.flush();
     writer.close();

【输出字节数据】
    response.setHeader("Content-Type","text/html;charset=UTF-8");
    OutputStream os = response.getOutputStream();
    os.write("世界你好".getBytes("utf-8"));


【验证码】

【ServletContext】
    代表整个web应用,可以 和程序的容器(服务器)进行通信

    request.getServletContext();
    this.getServletContext();

    01 获取文件的MIME类型
         String mime = servletContext.getMimeType("1.txt");//text/plain

MIME
    多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类

型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一

些客户端自定义的文件名,以及一些媒体文件打开方式。


    02 作为域对象
        void setAttribute(String name,Object value)
        Object getAttribute(String name)
        void removeAttribute(String name)

        整个web应用范围
        服务器启动的时候,会为每个web项目创建独立的servletContext对象
        服务器关闭/项目被移除的时候销毁


    03 获取路径
        String realPath = servletContext.getRealPath(String path);
        InputStream is = servletContext.getResourceAsStream(String path);


【文件下载】


一次会话:浏览器第一次请求服务端资源,会话建立,直到其中一方断开为止

功能:在一次会话的多次请求间,共享数据


【servlet && http && request】

Servlet 接口

GenericServlet 抽象类
将servlet接口其他方法进行了空实现
只保留service抽象方法

String method = req.getMethod();
if("GET".equals(method)){
        //get方式获取数据
        doGet();
}else if("POST".equals(method)){
        //post方式获取数据
        doPost();
}

HttpServlet 抽象类

    http请求方式,7种

对http协议的一种封装,简化操作

定义类继承 HttpServlet
复写 doGet\doPost  方法

url 直接访问,get方法
form method="post" post方式

servlet 相关配置
一个servlet可以定义多个访问路径
路径定义规则:
        /xxx
        /xxx/xxx /xxx/* /*       
        *.do

http 超文本传输协议
定义了客户端和服务器端通信时,发送数据的格式

基于 TCP/IP 的高级协议
默认端口:80
基于请求/响应模型的:一次请求一次响应
无状态的:每次请求之间互相独立,不能交互数据

历史版本:1.0 1.1
【http 1.0 VS http 1.1】
http 1.0:每一次请求都会建立一个新的连接
http 1.1:复用连接

请求消息数据格式
请求行
        请求方式 请求url 请求协议/版本
        GET /login.html HTTP/1.1
请求头
        请求头名称: 请求头值(如果有多个,使用分号分隔)

        User-Agent: 浏览器告诉服务器,我访问你使用的浏览器版本信息
            可以在服务器获取该信息,解决浏览器的兼容问题

        Referer: 告诉服务器,当前请求从哪里来
            防止盗链、统计工作

请求空行
        空行
请求体
        useranme=zhangsan

       
get
        请求参数在请求行中
        请求的url长度有限制
        不太安全
post
        请求参数在请求体中
        请求的url长度没有限制
        比较安全

【Request】

封装请求信息,request对象有服务器创建

ServletRequest(接口)

HttpServletRequest(接口)

org.apache.catalina.connector.RequestFacade(实现)

【request方法】
方法:
    01 getMethod() 请求方式
    02 getContextPath() 虚拟路径
    03 getServletPath() servlet路径
    04 getRequestURI() 较短 getRequestURL() 较长
        URI:统一资源标识符 /request01        【共和国】
        URL:统一资源定位符 http://localhost:8080/request01 【中华人民共和国】
    05 getRemoteAddr() 获取客户端ip

参数相关:
    01 String getParameter("name")
    02 String[] getParameterValues("hobby")
    03 Map<String, String[]> getParameterMap()
    04 Enumeration<String> getParameterNames()

请求头相关:
    01 String getHeader(String header)
    02 Enumeration<String> getHeaderNames()


请求体相关:
    01 BufferedReader getReader()
    02 ServletInputStream getInputStream()

注意:由于get请求方式,请求体为空;所以需要使用post请求方式
     而,当前我们的知识需要使用 html-form

     getReader() 与 getInputStream() 不能同时使用【】


乱码问题:
    get方式  : tomcat 8已经将get方式乱码问题解决了
    post方式 :request.setCharacterEncoding("utf-8");

【请求转发】

浏览器地址栏不发生变化
只能转发到当前服务器内部资源
客户端是一次请求

当前请求路径:http://localhost:8080/servlet/request02
目标请求路径:http://localhost:8080/servlet/request03

    RequestDispatcher requestDispatcher =
        request.getRequestDispatcher(path);
    requestDispatcher.forward(request,response);

【如何确定path】path为相对路径

当前请求路径:http://localhost:8080/servlet/request02
目标请求路径:http://localhost:8080/servlet/request03

    01 相同访问路径下
        ./request03 a
        request03 b
        /request03 c
            a 和 b等价,c的访问路径为servletPath

当前请求路径:http://localhost:8080/servlet/c/request02
目标请求路径:http://localhost:8080/servlet/a/b/request03

    01 不同访问路径下
        ../a/b/request03
        /a/b/request03

其中,get/post请求方式,将调用相对应servlet路径的get/post请求方式


【共享数据】
    域对象:一个有作用范围的对象,可以在范围内共享数据
    request区域:代表一次请求的范围,一般用于【请求转发】的多个资源中共享数据

方法:
    request.setAttribute("MSG","attr");
    String msg = (String) request.getAttribute("MSG");

    request.removeAttribute("MSG");

    Enumeration<String> attributeNames = request.getAttributeNames();


【获取ServletContext】
    ServletContext servletContext = request.getServletContext();






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