黑马程序员技术交流社区

标题: 【石家庄校区】Java Web 随堂笔记 [打印本页]

作者: chenlong43210    时间: 2018-5-21 15:29
标题: 【石家庄校区】Java Web 随堂笔记
本帖最后由 小石姐姐 于 2018-5-23 16:46 编辑

Request

获取浏览器发送过来的数据,组成部分:请求行、请求头、请求体
    HttpServletRequest
            //作为域对象存取数据
            xxxAttribute() //三个方法set get remove
        //请求转发
        getRequestDispatcher("/servlet路径").forward(request,response)
            //获取请求参数
        String getParameter(String key) //获取一个值
            String[] getParameterValues(String key) //通过一个key获取多个值
            Map<String,String[]> getParameterMap() //获取所有的参数名称和值
            Enumeration getParameterNames() //用于获取表单中提交的所有的参数的名称.
        //获取客户机信息
            String getMethod() //获取请求方式。
            String getRemoteAddr() //获取IP地址
            String getContextPath() //获取/项目名
            String getRequestURI() //获取从/项目名到参数之前的内容
            StringBuffer getRequestURL() //获取http到参数之前的内容
        //获取请求头信息
        String getHeader(String key) //通过key获取指定的value (一个)
            Enumeration getHeaders(String name) //通过key获取指定的value(多个)
            Enumeration getHeaderNames() //获取所有的请求头的名称
            int getIntHeader(String key) //获取整型的请求头
            long getDateHeader(String key) //获取时间的请求头
         //获取Cookie
         Cookie[] getCookies() //获取所有Cookie
            //获取Session
            HttpSession getSession() //根据浏览器携带的sessionid,有则返回原来的session,没有则新建一个session返回
接收参数的中文乱码问题:(tomcat7使用ISO8859-1)
      1.GET
        原因:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
        解决:new String("参数".getBytes("iso-8859-1"),"utf-8");
      2.POST
        原因:参数是放在请求体中,数据封装到Servlet中的request中,request也有一个缓冲区是ISO-8859-1编码
        解决:request.setCharacterEncoding("utf-8");
常用响应头:
            user-agent:浏览器内核 msie Firefox chrome
            referer:页面从那里来 防盗链
            Cookie: key=value //携带cookie到服务器

Response

响应,用于向浏览器写输出内容
组成部分:响应行、响应头、响应体
    HttpServletResponse 接口。针对HTTP协议
        //响应行操作
            setStatus(int 状态码) //针对于1xx,2xx,3xx
            sendError(int 状态码) //针对于4xx,5xx
        //响应头操作
        //追加响应头,针对多个value的响应头
            addHeader(String key,String value)
            addDateHeader(String name,long date)
        addIntHeader(String name,int value)
        //设置/覆盖响应头,针对一个value的响应头
        setHeader(String key,String value)
            setDateHeader(String name,long date)
        setIntHeader(String name,int value)
        //快捷设置
            sendRedirect("/路径") //设置location值
        addCookie(Cookie cookie) //向浏览器添加cookie
        //响应体操作(两个流互斥,响应完成服务器会自动关闭流)
            PrintWriter getWriter() //字符流,回写内容
            ServletOutputStream getOutPutStream() //字节流
            响应中文乱码问题:
              字节流:
                设置浏览器解码:resposne.setHeader("Content-Type","text/html;charset=UTF-8");
                设置响应编码:"中文".getBytes("UTF-8")
              字符流:
                设置浏览器解码:resposne.setHeader("Content-Type","text/html;charset=UTF-8");
                    设置response缓冲区的编码:response.setCharacterEncoding("UTF-8");
                简化写法:setContentType("text/html;charset=utf-8") //设置content-type值,且设置response缓冲区的编码
    文件下载
            1. 超链接下载。前提:浏览器不能解析的文件
            <a href="资源路径"></a> //若浏览器能解析该资源则打开,否则下载
            2. 编写代码下载
            <a href="Servlet路径?filename=文件名">下载</a>
                      (1) 设置响应头
                      Content-Type: 文件的mime类型
                      content-disposition: "attachment;filename=文件名称"
                (2) 提供流传输
                      OutputStream response.getOutPutStream()
               InputSream new FileInputSream("服务器上文件路径")
            注意:中文名称的文件名下载的时候名称会出现乱码
            原因:
              常见的浏览器使用URL编码格式解码
              火狐使用base64解码
            解决:
              对于常见浏览器设置文件名URL编码:
              对于火狐将文件名base64编码:
              public static String getName(String agent, String filename) throws UnsupportedEncodingException {
                if (agent.contains("MSIE")) {
                    // IE浏览器
                    filename = URLEncoder.encode(filename, "utf-8");
                    filename = filename.replace("+", " ");
                } else if (agent.contains("Firefox")) {
                    // 火狐浏览器
                    BASE64Encoder base64Encoder = new BASE64Encoder();
                    filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
                } else {
                    // 其它浏览器
                    filename = URLEncoder.encode(filename, "utf-8");
                }
                return filename;
              }
   常见状态码
      1xx 已发送请求
      2xx 已完成响应
        200 正常响应
      3xx 还需浏览器进一步操作
               302 重定向
               304 读缓存
      4xx 用户操作错误
               404 用户操作错误
               405 访问的方法不存在
      5xx 服务器错误
               500 内部异常
    常见响应头
        location: "路径" //重定向
        refresh: "3;url=页面路径" //定时刷新。如: 秒后跳转到指定页面
        content-type: "text/html;charset=utf-8" //设置文件mime类型,设置响应流的编码及告诉浏览器使用什么编码打开
        content-disposition:"attachment;filename=文件名称" //用于文件下载配置
        Set-Cookie: key=value //保存cookie到浏览
重定向&转发的区别(redirect和forward区别)
- 地址栏:重定向地址栏发生改变,转发不变
- 请求响应次数:重定向两次请求两次响应,转发一次请求一次响应
- 路径:重定向是从浏览器发送,路径需要加项目名;转发是服务器内部之间跳转,路径可以不加项目名
- 跳转范围:重定向可以跳转到任意网站,转发只能在当前项目下跳转

Cookie

会话:用户打开一个浏览器访问页面,访问网站的多个页面,访问完成后将浏览器关闭的过程称为一次会话
作用:将用户数据私有化(如:购物信息)
原理:数据存在客户端。服务器将通过响应头(Set-Cookie: key=value)将cookie保存到浏览器端,当用户再次访问的时候会通过请求头(Cookie: key1=value2; key2=value2)携带cookie到服务器。
    Cookie(String name,String value) //创建Cookie
            getName() //获取键
            getValue() //获取值
            setDomain(String domain) //设置Cookie的有效域名
            setPath(String path) //设置Cookie的有效路径
              一般写工程名,用于删除持久化的Cookie。两个path相同,再设置存活时间为0即可。
            setMaxAge(int 秒) //设置cookie在浏览器端的存活时间。默认关闭浏览器时删除cookie
              0:删除该cookie(前提路径一致)
    Cookie分类:
            会话级别:默认Cookie,关闭浏览器Cookie就会销毁
            持久级别:可以设置Cookie有效时间。
    存储中文乱码问题:
            存之前:将value编码:java.net.URLEncoder.encode("中文value","utf-8")
            取之后:将value解码:URLEncoder.decode("中文value","utf-8")

Session

原理:依赖Cookie,数据存在服务器端。浏览器请求时,服务器调用request.getSession()获取session时,看浏览器cookie中是否携带JSESSIONID,没有则创建新session空间返回,并让将JSESSIONID写回浏览器cookie,有则根据SESSIONID找到对应的session空间返回。
    HttpSession
            //域对象
            xxxAttribute()
            //清除Session
            invalidate()

JSP

概述
JSP(java server pages)java服务器端页面:本质是一个servlet,在HTML中嵌套java代码。运行在服务器端,处理请求,生成动态的内容。
jsp = html + java代码 + jsp自身
执行原理:
1. 请求JSP文件 -> jspServlet查找对应jsp文件
2. jsp文件 -> java文件 -> class文件。java文件和class文件存放在tomcat/work/...下。
3. 服务器运行class文件组成响应信息,发送到浏览器
JSP脚本
JSP嵌入Java代码/JSP脚本元素:
    <%...%> java程序片段。内容生成到jsp的service()方法中。
    <%=...%> 输出表达式。内容生成到jsp的service()方法中,相当于out.print(...)
    <%!...%> 声明成员。(不建议)内容生成到类中成员位置。定义变量,方法,类。因为线程不安全,尽量少定义成员
JSP注释
    什么样的代码用什么注释。快捷键:Ctrl+Shift+/
    <%-- JSP注释 --%> //只存在于JSP源代码中,翻译成Servlet后消失
JSP指令
作用:声明JSP页面的属性和动作
    格式:<% @指令名称 属性="值" %> //多个属性空格分隔
    指令分类:一个页面可以出现多个指令,一般放在jsp页面最上面
    page指令:声明jsp页面的属性
            errorPage="内部路径" //当前jsp页面出现异常时要跳转的页面
                    也可在web.xml下项目配置全局错误页面
              isErrorPage="false" //当前jsp页面是否是一个错误页面,如果true,可以使用(Throwable exception)内置对象操作异常信息
            contentType="text/html; charset=UTF-8" //设置响应流的编码,通知浏览器用什么编码打开,设置文件的mime类型
            pageEncoding="UTF-8" //设置文件保存到硬盘,以及生成Servlet的保存的编码
            improt //导入需要的包,可以出现多次
            language="java" //当前jsp页面里可以嵌套的语言
            autoFlush="true" //设置JSP的缓存自动刷出
            buffer="8kb" //设置JSP的缓冲区的大小
            extends: //声明当前jsp页面继承于哪个类,必须继承的是httpservlet及其子类
            session="true" //设置jsp页面是否可以使用session内置对象
             isELIgnored="false" //是否忽略EL表达式
              extends //设置JSP翻译成Servlet后继承的类,默认值:org.apache.jasper.runtime.HttpJspBase,这个值要想修改,这个类必须是HttpServlet及其子类
      contentType和pageEncoding区别和联系
            若都出现,各自使用各自的编码
        若出现一者,两个都使用此编码
        两者都不出现,使用浏览器默认编码,ISO8859-1
    include指令:静态包含
            静态包含,就是将其他页面或者servlet的内容包含进来,一起进行编译,生成一个java文件
            file="内部路径"
    taglib指令:指示JSP引入标签库
            prefix="前缀名" //标签的别名
            uri="名称空间" //标签的URI路径
            导入之后
              <前缀名:标签 .. >
JSP内置对象
    对象类型                名称
    request                HttpServletRequest
    response        HttpServletResponse
    session                HttpSession
    application        ServletContext
    page                Object(this,JSP翻译成Servlet后的类的引用)
    out                        JspWriter(原理:先将缓冲区中内容写入response的PrintWriter的缓冲区,再通过response响应到页面)
    pageContext        PageContext
    config                ServletConfig
    exception        Throwable(指令page设置:isErrorPage="true")
    PageContext
            //域对象
            xxxAttribute()
            //代替其他三个域存取数据
            xxxAttribute(... , int scope)
            PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE
            findAttribute(String key) //依次从pageContext,request,session,application查找并返回值,没有返回null
            //获得其他的8个内置对象:编写通用性代码或者框架的时候
            getXxx() //如: getRequest()获取request内置对象
动作标签
代替代码,简化书写。后台由于架构体系,使用不多。
    //用于页面的转发.
      <jsp:forward page="内部路径"></jsp:forward>
      相当于:request.getRequestDispatcher(...).forward(...);
    //动态包含
      <jsp:include page="" />
    //静态包含和动态包含的区别?(<%@ include%>和<jsp:include>)
      静态包含:将被包含页面放入包含页面一起翻译成servlet,一起编译,一起执行
      动态包含:被包含页面和包含页面分别翻译成servlet,分别编译,将被包含页面执行结果一起执行
    <jsp:param /> //用于带有路径的标签下,传递参数.
    <jsp:useBean /> //用于在JSP中使用JavaBean.
    <jsp:setProperty /> //用于在JSP中向JavaBean设置属性的.
    <jsp:getProperty /> //用于在JSP中获得JavaBean的属性.

EL表达式

概述: EL(Expression Language)简化JSP写法,用来替代<% ... %>(JSP2.0开始)
语法
    格式:${EL表达式}
    获取域中数据(从4个域中)
            //获取普通单值数据
            ${xxxScope.域key } //pageScope,requestScope,sessionScope,applicationScope
            ${域key } //依次范围从小到大查找属性值,没有返回空字符串
            //获取集合|数组数据
            ${域key[index]} //获取数组|Listindex对应的值
            ${域key.MapKey} //获取Map中key对应的值
            //获取对象数据
            ${域key.bean属性} //获取对象中属性值
        //[]和.区别:
                []用于有下标的数据(数组,list集合)
                .用于有属性的数据(map,对象)
                如果属性名中包含有特殊的字符.必须使用[""]
    执行运算
            //算数运算(+-*/)
            +:只能加法运算,字符串形式数字可以进行加法运算
            //逻辑运算
            <        lt        //less than
            >        gt        //great than
            <=        le        //less equal
            >=        ge        //great equal
            ==        eq        //equal
            //关系运算
            &&        and
            ||        or
            !        not
            //三元运算
            a<b?...:...
            //empty运算
            empty 域中key //判断一个容器的长度是否为0|null,一个对象是否为null
            not empty 域中key //不为
    EL操作WEB开发的常用的对象(除了pageContext其余对象获取的都是map集合)
            pageScope(专门获取域数据)、requestScope、sessionScope、applicationScope
            param、paramValues //接收参数。values:对应多个值的参数,返回数组
            header、headerValues //获取请求头信息
            initParam //获取全局初始化参数(web.xml - <context-param>)
            cookie //返回Map<String,Cookie>
                    .Cookie的key.value //获取值
            pageContext //获取的不是Map集合,相当于JSP的pageContext
                    .request.属性名 //如:获取项目名:.contextPath
    调用Java中方法

JSTL标签库

概述:JSTL(JSP Standard Tag Library)JSP标准标签库。Apache提供。JSTL1.1版本后支持EL表达式
作用:替代java脚本,替换页面中<%%>。常用于遍历,判断
语法
    分类:
      core:核心标签
      fmt:格式化|国际化
      xml:过时,XML标签
      sql:过时,SQL标签
      fn:JSTL提供EL函数库,很少使用
    core
      1.导入jar包(jstl.jar 和 standard.jar)
      2.在页面上导入标签库
      <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <c:if test="EL表达式条件">满足条件输出</c:if>
        var="变量" scope="域" //将test结果存入域,不用。管理角度看:不利于项目发展
      <c:forEach var="取出的项命名"></c:forEach>
        items="待遍历对象" //相当于ForEach
        begin="开始值" end="结束值" step="步进默认1"
        varStatus="状态命名" //表示遍历状态
          .count //遍历到第几个
          .index //索引
      <c:set var="变量名" value="值" scope="域"></c:set> //向域中存数据
              域:page,
      <c:out value="值|EL" ></a:out>
        default="默认值" //没有时输出
        escapeXML="false"  //默认对输出内容转义
      c:choose
      c:when
      c:otherwise
    fn
      1.在页面上导入标签库
      <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>


MVC设计模式

动态网页开发模式。就是将业务逻辑,代码,显示相分离的一种思想。
    M : Model 模型层
            作用:封装数据,封装对数据的访问,JavaBean
    V : View 视图层
            作用:展示数据,JSP
    C : Controller 控制层
            作用:接收请求,找到相应JavaBean完成业务逻辑,Servlet
    JavaBean+Servlet+JSP
原理:用户请求一个Servlet(Controller层),Servlet先调用一个JavaBean(Model层)封装数据,再调用另一个JavaBean处理数据(Service,Model层)。然后跳转到JSP页面(View层)显示数据。







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