美文网首页
JavaWeb(第九周)

JavaWeb(第九周)

作者: mwj610 | 来源:发表于2019-04-28 21:35 被阅读0次

    day10

    一、response和request

    image.png

    服务器处理请求的流程

    • 服务器每次收到请求时,都会为这个请求开辟一个新的线程
    • 服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体
    • 服务器还会创建response对象,这个对象与客户端连接在一起,他可以用来向客户
      端发送响应。

    1.response

    image.png

    案例:发送404

    @WebServlet(name = "AServlet",urlPatterns = {"/AServlet"})
    public class AServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
            response.sendError(404,"哈哈哈哈");
        }
    }
    
    image.png

    setHeader(String name,String vlaue):适用于单值的响应头 ,例如:response.setHeader("aaa","AAA");
    案例:
    - 发送302,设置Location头,完成重定向

    @WebServlet(name = "BServlet",urlPatterns = {"/BServlet"})
    public class BServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("BServlet");
            //重定向: 
            response.setHeader("Location","/day10/CServlet");//设置Location
            response.setStatus(302);//发送302状态码
        }
    }
    
    @WebServlet(name = "CServlet",urlPatterns = {"/CServlet"})
    public class CServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("CServlet");
        }
    }
    

    - 定时刷新,设置Refresh头

    @WebServlet(name = "DServlet",urlPatterns = {"/DServlet"})
    public class DServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            PrintWriter writer = response.getWriter();//发送响应体
            writer.print("欢迎你,5秒后跳转主页");
            response.setHeader("Refresh","5;URL=/day10/EServlet");
        }
    }
    
    @WebServlet(name = "EServlet",urlPatterns = {"/EServlet"})
    public class EServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.getWriter().print("还是乱码");
    
        }
    }
    

    - 禁用浏览器缓存:Cache-Control、pragma、expires

    @WebServlet(name = "FServlet",urlPatterns = {"/FServlet"})
    public class FServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setHeader("Cache-Control","no-cache");
            response.setHeader("pragam","no-cache");
            response.setDateHeader("expires",-1);
            response.getWriter().print("hello");
        }
    }
    

    - <meta>标签可以代替响应头:<meta http-equiv="Content-Type"
    content="text/html;charset="UTF-8">


    响应体:通常是html、也可以是图片
    response的两个流:
    ServletOutputStream:用来向客户端发送字节数据
    PrintWriter:用来向客户端发送字符数据,需要设置编码
    两个流不能同时使用
    案例:
    使用PrintWriter发送字符数据

            String s = "hello output";
            byte[] bytes = s.getBytes();
            response.getOutputStream().write(bytes);
    

    使用ServletOutputStream发送字节数据(图片)

            String path = "C:\\a.jpg";
            FileInputStream in = new FileInputStream(path);
            byte[] bytes = toByteArray(in);   //读取输入流内容的字节到字节数组中
            response.getOutputStream().write(bytes);
    

    重定向:设置302.设置Location;其中变化的只有Location,使用快捷方法。

            response.sendRedirect("/day10/CServlet");
    

    2.request

    封装了客户端所有的请求数据

    获取常用信息

    • 获取客户端IP,案例:封IP:requset.getRemoteAddr();
            String addr = request.getRemoteAddr();
            System.out.println("ip:"+addr);
    
    • 请求方式,request.getMethod(),可能是POST也可能是GET
            System.out.println("请求方式:"+request.getMethod());
    

    获取HTTP请求头:

    • String getHeader(String name):适用于单值头
    • int getInHeader(String name):适用于单值int类型的请求头
    • long getDateHeader(String name):适用于单值毫秒类型的请求头
    • Enumeration<String> getHeaders(String name):适用于多值请求头

    案例:

    • 通过User-Agent识别用户浏览器类型
            String useragent = request.getHeader("User-Agent");
            System.out.println(useragent);
            //Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
    
    • 防盗链:如果请求不是通过本站的超链接发出的,发送的错误状态码404。Referer这个请求头,表示请求的来源
            String referer = request.getHeader("Referer");
            System.out.println(referer);
    

    获取请求URL

    image.png image.png
                response.getWriter().print(request.getScheme()+"<br/>");//获取请求协议
                response.getWriter().print(request.getServerName()+"<br/>");//获取服务器名称
                response.getWriter().print(request.getServerPort()+"<br/>");//获取服务器端口号
                response.getWriter().print(request.getContextPath()+"<br/>");//获取项目名称
                response.getWriter().print(request.getServletPath()+"<br/>");//获取Servlet路径
                response.getWriter().print(request.getQueryString()+"<br/>");//获取参数部分
                response.getWriter().print(request.getRequestURI()+"<br/>");//获取请求URL
                response.getWriter().print(request.getRequestURL()+"<br/>");//获取请求URL  
    

    获取请求参数:请求参数是由客户端发送给服务器的,有可能是在请求体中(POST),也可能是在URL之后(GET)

    image.png

    演示request获取请求参数:

      <body>
    <h1>测试请求参数</h1>
    <a href="/day10_1/AServlet?xxx=XXX&yyy=YYY">点击这里</a>
    <hr/>
    <form action="/day10_1/AServlet" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        爱好:<input type="checkbox" name="hobby" value="cf">吃饭
          <input type="checkbox" name="hobby" value="sj"/>睡觉
          <input type="checkbox" name="hobby" value="ddm"/>打代码
        <br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    
    @WebServlet(name = "AServlet",urlPatterns = {"/AServlet"})
    public class AServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String[] hobby = request.getParameterValues("hobby");
            System.out.println(username+", "+password+", "+ Arrays.toString(hobby));
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("GET"+request.getParameter("xxx"));
            System.out.println("GET"+request.getParameter("yyy"));
        }
    }
    

    获取所有请求参数的名称

            Enumeration names = request.getParameterNames();
            while (names.hasMoreElements())
            {
                System.out.println(names.nextElement());
            }
    

    获取所有请求参数,封装到MAP中

            Map<String,String[]> map = request.getParameterMap();
            for (String name:map.keySet()) {
                String[] values = map.get(name);
                System.out.println(name+"="+ Arrays.toString(values));
            }
    

    请求转发和请求包含

    请求转发:rd.forward(request,response);

    //OneServlet
    @WebServlet(name = "OneServlet",urlPatterns = {"/OneServlet"})
    public class OneServlet extends HttpServlet {
        protected void  doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("OneServlet...");
            response.setHeader("aaa","AAA");//设置响应头
            response.getWriter().print("hello OneServlet");//设置响应体
            //等同于调用TwoServlet的service()方法
            request.getRequestDispatcher("TwoServlet").forward(request,response);//请求转发
    
        }
    }
    //TwoServlet
    @WebServlet(name = "TwoServlet",urlPatterns = {"/TwoServlet"})
    public class TwoServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("TwoServlet...");
            response.getWriter().print("hello TwoServlet");//设置响应体
        }
    }
    //a.html
    <body>
    <h1>测试请求参数</h1>
    <a href="/day10_1/AServlet?xxx=XXX&yyy=YYY">点击这里</a>
    <hr/>
    <form action="/day10_1/AServlet" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        爱好:<input type="checkbox" name="hobby" value="cf">吃饭
          <input type="checkbox" name="hobby" value="sj"/>睡觉
          <input type="checkbox" name="hobby" value="ddm"/>打代码
        <br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    

    请求包含: rd.include(requset,response) ;


    image.png
    image.png

    同一请求范围内使用request.setAttribute、request.getAttribute()来传值;前一个Servlet调用SetAttribute()保存值,后一个Servlet调用getAttribute()获取值


    请求转发和重定向的区别:

    image.png

    二、编码

    常见的字符编码:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系统默认编码,中国的国标码)、utf-8(万国码,支持全世界的编码,所以我们使用这个)

    - 响应编码

    image.png
    - 请求编码
    image.png
    //演示2请求编码
    <body>
    This is my page.<br/>
    <form action="/day10_1/BServlet" method="post">
        用户名:<input type="text" name="username" value="李四"><br/>
        <input type="submit" value="提交"/>
    </form>
    <hr/>
    <a href="/day10_1/BServlet?username=张三">GET</a>
    </body>
    
    @WebServlet(name = "BServlet",urlPatterns = {"/BServlet"})
    public class BServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.先获取来使用iso的错误字符串
            //2.(iso)回退,(使用utf-8)重编
            String name = request.getParameter("username");
            byte[] b = name.getBytes("iso-8859-1");
            name = new String(b, "UTF-8");
            System.out.println(name);
    
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");//获取参数前调用request.setCharacterEncoding("UTF-8");
            String username = request.getParameter("username");//使用request.getParameter("username");获取参数
            System.out.println(username);
        }
    }
    

    URL编码

    image.png

    路径

    image.png

    =====================================================================================================================================================================================================================

    day11

    一、JSP入门

    1.JSP的作用

    Servlet:

    • 缺点:不适合设置html响应体,需要大量的response.getWriter().print("html>")
    • 优点:动态资源,可以编程

    html:

    • 缺点:html是静态页面,不能包含动态信息
    • 优点:不用为输出html标签而发愁

    jsp(java server pages):

    • 优点:在原有基础上添加java脚本,构成jsp页面

    2.jsp和servlet的分工

    JSP:

    • 作为请求发起页面,例如显示表单、超链接
    • 作为请求结束页面,例如显示数据

    Servlet:

    • 作为请求结束页面,例如显示数据

    JSP访问流程图

    image.png

    3.JSP的组成

    image.png

    案例:演示 JSP中java脚本的使用

    <body>
    <table border="1" align="center">
        <tr>
            <td>姓名</td>
            <td>年龄</td>
        </tr>
        <%for(int i =0;i<10;i++){ %>
        <tr>
            <td>张三</td>
            <td>29</td>
        </tr>
        <%}%>
    </table>
    

    JSP和Servlet分工演示

    //form.jsp
    <body>
    <form action="/day11/AServlet" method="post">
        整数1:<input type="text" name="num1"/><br/>
        整数2:<input type="text" name="num2"/><br/>
         <input type="submit" value="提交">
    </form>
    </body>
    
    //AServlet
    @WebServlet(name = "AServlet",urlPatterns = {"/AServlet"})
    public class AServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String s1 = request.getParameter("num1");//获取参数
            String s2 = request.getParameter("num2");
            int num1 = Integer.parseInt(s1);//转化成int类型
            int num2 = Integer.parseInt(s2);
            int sum = num1+num2;//运算
            request.setAttribute("result",sum);//把结果保存到request域中
            request.getRequestDispatcher("/jia/result.jsp").forward(request,response);//转化成result.jsp
        }
    
    //result..jsp
    body>
    <%
        Integer result = (Integer)request.getAttribute("result");
    %>
    <%=result %>
    </body>
    

    4.JSP原理

    image.png image.png image.png

    5.JSP注释

    <%-- --%>:当服务器把jsp文件编译成java文件时已经忽略了注释部分。

    二、Cookie

    1.Http协议与Cookie

    image.png

    2.Cookie的用途

    • 服务器使用Cookie来跟踪客户端状态
    • 保存购物车(购物车中的商品不能用request保存,因为他是一个用户想客户端发送的多个请求信息)
    • 显示上次登陆名(也是一个用户多个请求)

    3.JavaWeb中使用Cookie

    • 使用response,addCookie()方法向浏览器保存Cookie
    • 使用request.getCookies()方法获取浏览器归还的Cookie

    案例:一个jsp保存cookie,另一个jsp获取浏览器归还的cookie

    //a.jsp
    <body>
    <h1>保存Cookie</h1>
    <%
        Cookie cookie1 = new Cookie("aaa","AAA");
        response.addCookie(cookie1);
        Cookie cookie2 = new Cookie("bbb","BBB");
        response.addCookie(cookie2);
    %>
    </body>
    
    //b.jsp
    <body>
    <h1>获取Cookie</h1>
    <%
         Cookie[] cookies = request.getCookies();
         if(cookies != null){
             for (Cookie c:cookies) {
                 System.out.println(c.getName() + "="+c.getValue() + "<br/>");
             }
         }
    %>
    </body>
    

    4.Cookie详解

    Cookie不只有name和value两个属性

    Cookie的maxAge属性:Cookie的最大生命,即Cookie可保存的最大时长。以秒为单位。

    • maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定

    • maxAge<0:Cookie只在浏览器内存中国存在,当用户关闭浏览器时,Cookie就死亡了

    • maxAge=0:浏览器会马上删除这个Cookie


    Cookie的PATH

    image.png

    5.Cookie的domain(域)

    三、HttpSession

    1.HttpSession概述

    • HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端的对象,保存在服务器端。
    • HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以他也有serAttribute()、getAttribute()、removeAttribute()方法。
    • HttpSession底层依赖Cookie,或是URL重写。

    2.HttpSession的作用

    image.png

    案例一:

    image.png
    //a.jsp
    <body>
    <h1>向session域保存数据</h1>
    <%
        session.setAttribute("aaa","AAA");
    %>
    </body>
    
    //b.jsp
    <body>
    <h1>获取session中的数据</h1>
        <%
            String s = (String) session.getAttribute("aaa");
        %>
        <%=s %>
    </body>
    

    案例二:

    image.png
    image.png
    image.png
    //login.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>登录</h1>
    <%
    /*
    * 读取名为uanme的cookie
    * 如果为空显示:" "
    * 如果不为空显示:Cookie的值
    * */
    String uname = "";
    Cookie[] cs = request.getCookies();//获取请求中所有的cookie
        if(cs!=null){//如果存在cookie
            for (Cookie c:cs) {//遍历所有的cookie
                if("uname".equals(c.getName())){//查找名为uname的cookie
                    uname = c.getValue();//获取这个cookie的值,给uname这个变量
                }
            }
    
        }
    %>
    <%
        String message = "";
        String msg = (String) request.getAttribute("msg");
        if(msg!=null){
             message = msg;
        }
    
    %>
    <font color="red"><b><%=message %></b></font>
    <form action="/day11_1/LoginServlet" method="post">
        <%--把cookie中的用户名显示到用户名文本框中--%>
        用户名:<input type="text" name="username" value="<%=uname%>"/><br/>
        密 码:<input type="pa ssword" name="password"/><br/>
        <input type="submit" value="登录"/>
    </form>
    </body>
    </html>
    
    //succ1.jsp
    <body>
    <h1>succ1</h1>
    <%
        String username = (String) session.getAttribute("username");
        if(username == null ){
            //向request域中保存错误信息,转发到login.jsp
            request.setAttribute("msg","您还没有登陆");
            request.getRequestDispatcher("/session2/login.jsp").forward(request,response);
            return;
    
        }
    %>
    </body>
    
    //succ2.jsp
    <body>
    <h1>succ2</h1>
    <%
        String username = (String) session.getAttribute("username");
        if(username == null ){
            //向request域中保存错误信息,转发到login.jsp
            request.setAttribute("msg","您还没有登陆");
            request.getRequestDispatcher("/session2/login.jsp").forward(request,response);
            return;
    
        }
    %>
    </body>
    
    //LoginServlet
    @WebServlet(name = "LoginServlet",urlPatterns = {"/LoginServlet"})
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
             //1.获取表单数据
             request.setCharacterEncoding("UTF-8");//处理中文问题
             String username = request.getParameter("username");//获取表单信息
             String password = request.getParameter("password");
             //2.校验用户名和密码是否正确
            if(!"itcast".equalsIgnoreCase(username)){//登录成功
                //把用户名保存到cookie中,发送给客户端浏览器
                //当再次打开login.jsp时2,login.jsp中会读取request中的cookie,把他显示到用户名文本框中
                Cookie cookie = new Cookie("uname", username);//创建cookie
                cookie.setMaxAge(60*60*24);//设置cookie命长为一天
                response.addCookie(cookie);//保存cookie
    
                //3.如果成功
                //保存用户信息到session中
                //重定向到succ1.jsp中
                HttpSession session = request.getSession();//获取session
                session.setAttribute("username",username);//向session域中保存用户名
                response.sendRedirect("/day11_1/session2/succ1.jsp");
            }
            else{//登录失败
                //4.如果失败
                //保存错误信息到request域中
                //转发到login.jsp中
                request.setAttribute("msg","用户名或密码错误");
                RequestDispatcher qr = request.getRequestDispatcher("/session2/login.jsp");//得到转发器
                qr.forward(request,response);//转发
            }
        }
    
    }
    

    3..HttpSession的原理

    image.png

    4.HttpSession其他方法

    image.png

    5.web.xml中配置sesssion最大不活动时间

    <session-config>
       <session-timeout>30</session-timeout>
    </session-config>
    

    6.URL重写

    image.png

    相关文章

      网友评论

          本文标题:JavaWeb(第九周)

          本文链接:https://www.haomeiwen.com/subject/qiregqtx.html