JavaWeb(第九周)

2019-04-28  本文已影响0人  mwj610

day10

一、response和request

image.png

服务器处理请求的流程

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

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

获取常用信息

        String addr = request.getRemoteAddr();
        System.out.println("ip:"+addr);
        System.out.println("请求方式:"+request.getMethod());

获取HTTP请求头:

案例:

        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
        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:

jsp(java server pages):

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的用途

3.JavaWeb中使用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可保存的最大时长。以秒为单位。


Cookie的PATH

image.png

5.Cookie的domain(域)

三、HttpSession

1.HttpSession概述

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
上一篇 下一篇

猜你喜欢

热点阅读