• Servlet——进阶


    目录

    1、Http协议

    1.1、协议介绍

    1.2、Post请求方式

    1.3、Get请求方式

    1.4、 请求的http中post和get区别

    1.5、状态码

    2、HttpServletRequest

    2.1、获取请求API

    2.2、获取请求参数API

    2.3、Post请求乱码问题解决

    2.4、Get请求乱码的解决

    2.5、转发

    3、HttpServletResponse

    3.1、常用API

    3.2、重定向

    3.3、转发和重定向的区别

    3.4、 设置响应体/响应浏览内容

    3.5、解决响应乱码问题

    3.6、自动刷新

    4、域对象

    4.1、什么是域对象

    4.2、域对象共有方法

    4.3、Request域

    4.4、Session域

    4.5、ServletContext域


     

    1、Http协议

    1.1、协议介绍

    协议:双方的约定。

    网络协议:计算机网络中进行数据交换而建立的规则、标准或约定等等。
    http协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计http的最初目的是为了提供一种发布和接受html页面的方法。
    互联网数据交互一种规则。

    http特点:
    1、http协议是基于tcp协议的。属于应用层
    2、默认端口是80(如果是80可以省略:80) 地址栏可以省略不写
    http://www.baidu.com
    http://www.baidu.com:80

    3、基于请求响应模型。
    请求:浏览器向服务器发送的信息,request
    响应:服务器向浏览器发送的信息,response
    请求和响应涉及到数据的发送。涉及到数据的格式。请求和响应的格式,满足http的规范。

    1.2、Post请求方式

    所有请求信息 【请求的url ,请求方式,请求状态码, 请求端口】

    请求行

    请求头

     

    请求体 (Post请求方式特有,Post请求参数,以请求体的方式存在)

     

    1.3、Get请求方式

    所有请求信息 【请求的url (请求行),请求方式,请求状态码, 请求端口, 参数 】

    请求行

    请求头

    Accept: text/html,image/*   客户端识别文件类型
    Accept-Charset: ISO-8859-1  客户端字符集
    Accept-Encoding: gzip   客户端支持编码类型 gzip 压缩格式 
    Accept-Language:zh-cn  客户端语言
    Host: www.yanqi.com:80  访问服务器地址 
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT和Last-Modified 一起使用 控制缓存 (tomcat 提供缓存  过滤器 缓存处理)
    Referer: http://www.itcast.com/index.jsp (重要) 防止盗链  获取网站域名地址  
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器类型(文件下载时,不同浏览器进行不同处理)  不同的浏览器器存在兼容性!!
    Connection: close/Keep-Alive   请求后连接是关闭还是保持
    Date: Tue, 11 Jul 2000 18:23:51 GMT 请求时间

    1.4、 请求的http中post和get区别

    1、post请求行,请求头,请求体
    2、get请求行,请求头,没有请求体
    3、post请求的参数在请求体中,理论上来说是无限大,安全性相对较高
    4、get请求的参数在请求行中,通过url拼接,安全性相对较低

    1.5、状态码

    常见状态码:
    200 - 请求成功 
    302 – 请求重定向 (response+302)==重定向
    404 - 请求的资源(网页等)不存在 (请求的url找不到具体的资源,例如找不到servlet,或者html,如果遇到404的错误,通常检查url是否写错,或者url-patten 是否配置错。)
    500 - 内部服务器错误(如果遇到500的情况,表示的是java代码出错误)

    2、HttpServletRequest

    2.1、获取请求API

    方法说明
    getMthod()获取请求方式
    getRequestURI()获取请求的uri(相对路径)
    getRequestURL()获取请求的url(绝对路径)
    getRemoteAddr()获取请求的地址
    getProtocol()获取请求的协议
    getLocalPort()获请请求的端口
    getHeader("Host")获取请求的端口+地址
    1. @WebServlet(urlPatterns = "/RequestAPIServlet")
    2. public class RequestAPIServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. //相对地址
    5. String requestURI = request.getRequestURI();
    6. System.out.println(requestURI);
    7. //绝对地址
    8. StringBuffer requestURL = request.getRequestURL();
    9. System.out.println(requestURL);
    10. //获取请求地址
    11. String remoteAddr = request.getRemoteAddr();
    12. System.out.println(remoteAddr);
    13. //获取请求的协议
    14. String protocol = request.getProtocol();
    15. System.out.println(protocol);
    16. //获取请求的端口
    17. int localPort = request.getLocalPort();
    18. System.out.println(localPort);
    19. //获取请求的端口+地址
    20. String host = request.getHeader("Host");
    21. System.out.println(host);
    22. }
    23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    24. this.doPost(request, response);
    25. }
    26. }

    请求路径 

     

    2.2、获取请求参数API

    方法说明
    public String getParameter(String name)获取请求指定单个参数
    public String[] getParameterValues(String name)获取请求指定多个参数
    public Map request.getParameterMap()获取页面所有提交过来的数据

    准备一个页面 

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <form action="RequestAPIServlet02" method="post">
    9. user:<input type="text" name="username"><br>
    10. sex:<input type="text" name="sex"><br>
    11. age:<input type="text" name="age"><br>
    12. 爱好:<input type="checkbox" name="hobby" value="吃饭">吃饭
    13. <input type="checkbox" name="hobby" value="睡觉">睡觉
    14. <input type="checkbox" name="hobby" value="打豆豆">打豆豆<br>
    15. <input type="submit">
    16. form>
    17. body>
    18. html>

    创建servlet类测试 

    1. @WebServlet(urlPatterns = "/RequestAPIServlet02")
    2. public class RequestAPIServlet02 extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. //解决post请求乱码问题
    5. request.setCharacterEncoding("utf-8");
    6. //方式一:通过getParameter方法获取
    7. String username = request.getParameter("username");
    8. String sex = request.getParameter("sex");
    9. String age = request.getParameter("age");
    10. System.out.println("username:"+username);
    11. System.out.println("sex:"+sex);
    12. System.out.println("age:"+age);
    13. System.out.println("=================");
    14. //方式二:通过getParameterValues方法获取,返回的是数组
    15. String[] hobbies = request.getParameterValues("hobby");
    16. for (String hobby : hobbies) {
    17. System.out.println(hobby);
    18. }
    19. //通过getParameterMap方法获取,返回是一个map集合
    20. System.out.println("=============");
    21. Map parameterMap = request.getParameterMap();
    22. for (String key : parameterMap.keySet()) {
    23. String[] strings = parameterMap.get(key);
    24. for (String value : strings) {
    25. System.out.println(value);
    26. }
    27. }
    28. }
    29. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    30. this.doPost(request, response);
    31. }
    32. }

    启动tomcat服务器,访问请求路径

     

    点击提交按钮后,页面跳转到了RequestAPIServlet02类 

     

    2.3、Post请求乱码问题解决

    post方式请求如果不设置编码格式,会出现以下乱码问题

    为了能够解决这个乱码问题,我们需要在servlet的开头进行设置编码。

    1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. //解决post请求乱码问题
    3. request.setCharacterEncoding("utf-8");
    4. //指定获取输入框内容,如果获取不到返回null
    5. String username = request.getParameter("username");
    6. String sex = request.getParameter("sex");
    7. String age = request.getParameter("age");
    8. System.out.println(username);
    9. System.out.println(sex);
    10. System.out.println(age);
    11. }

    2.4、Get请求乱码的解决

    tomcat8 以上的版本都默认解决了get请求乱码问题,无需关注。

    如果是tomcat8以下版本出现乱码问题想要解决,通过以下代码

    1. String username = request.getParameter("username");
    2. username = new String(username.getBytes("iso8859-1"),"utf-8");
    3. System.out.println(username);

    2.5、转发

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. //转发到指定页面
    3. // request.getRequestDispatcher("index.jsp").forward(request,response);
    4. //转发指定servlet,注意:请求方式要与转发的请求方一致
    5. request.getRequestDispatcher("ServletDemo").forward(request,response);
    6. }

    转发:
        一次请求一次响应。
        转发是服务器内部行为。
        url不会发生改变。

    3、HttpServletResponse

    3.1、常用API

    方法说明
    public void setStatus(int status)设置响应状码
    public void setHeader(String name,String value)设置响应该头
    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. //重定向
    3. response.setStatus(302);
    4. response.setHeader("Location","http://localhost:8081/index.jsp");
    5. //这种方法等价于以上两行代码
    6. response.sendRedirect("http://localhost:8081/index.jsp");
    7. }

    3.2、重定向

    重定向: 客户端形行,一次请求,把上一个url清空,重新响应了一个新的url,最终看到是新的url,重定向不能返回上一个url。

    3.3、转发和重定向的区别

    在request中有个转发进行页面跳转,而response中的重定向也是页面跳转,那么它们两个有什么区别呢?

    重定向(redirect):属于客户端行为,一次请求两个url,url会在地址栏中显示,不能返回上一个历史记录,不能携带数据
    转 发(forward): 属于服务器行为,一次请求一个url,url地址始终只有一个,可以携带数据

    3.4、 设置响应体/响应浏览内容

    方法名说明
    setContentType(String charset)设置响应字符集(解决响应乱码问题)
    getWriter()把响应内容以流的形式输出(响应给浏览器)
    getHeader()设置响应头
    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. //设置响应体及响应乱码
    3. response.setContentType("text/html;charset=utf-8");
    4. //响应给浏览器
    5. PrintWriter writer = response.getWriter();
    6. writer.println("

      servlet是动态网页技术

      "
      );
    7. writer.println("servlet");
    8. response.getWriter().println("从后台servlet响应给浏览器的");
    9. }

    3.5、解决响应乱码问题

    1. //设置响应体及响应乱码
    2. response.setContentType("text/html;charset=utf-8");

    3.6、自动刷新

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. //设置响应体及响应乱码
    3. response.setContentType("text/html;charset=utf-8");
    4. response.getWriter().println("对不起,你访问的资源不存在,3秒之后跳转到百度网站!!");
    5. response.setHeader("refresh","3;url=https://www.baidu.com");
    6. }

    4、域对象

    4.1、什么是域对象

    一个有作用范围的对象,可以在范围内共享数据。

    常见的域对象

    Request    范围是一次请求。
    Session    范围是一次会话。
    ServletContext(application)   范围是整个项目中,直到服务器关闭。

    4.2、域对象共有方法

    方法说明
    void setAttribute(String name,Object obj)设置数据
    Object getAttribute(String name)获取数据
    void removeAttribute(String name)删除数据

    4.3、Request域

    代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据。

    AServlet类 

    1. @WebServlet(urlPatterns = "/AServlet01")
    2. public class AServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. System.out.println("我是AServlet");
    5. request.setAttribute("checkCode", "6666");
    6. //转发
    7. request.getRequestDispatcher("BServlet01").forward(request, response);
    8. }
    9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    10. this.doPost(request, response);
    11. }
    12. }

     BServlet类

    1. @WebServlet(urlPatterns = "/BServlet01")
    2. public class BServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. System.out.println("我是BServlet");
    5. Object checkCode = request.getAttribute("checkCode");
    6. System.out.println(checkCode);
    7. }
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. this.doPost(request, response);
    10. }
    11. }

    请求Aservlet01 

     

    4.4、Session域

    session域对象,作用范围:一次会话 (打开浏览器 ,操作数据 ,关闭浏览器)。

    AServlet类

    1. @WebServlet(urlPatterns = "/AServlet02")
    2. public class AServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. System.out.println("我是AServlet");
    5. HttpSession session = request.getSession();
    6. session.setAttribute("checkCode","5699");
    7. }
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. this.doPost(request, response);
    10. }
    11. }

    BServlet类

    1. @WebServlet(urlPatterns = "/BServlet02")
    2. public class BServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. System.out.println("我是BServlet");
    5. HttpSession session = request.getSession();
    6. Object checkCode = session.getAttribute("checkCode");
    7. System.out.println("从session域获取到的验证码为:"+checkCode);
    8. }
    9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    10. this.doPost(request, response);
    11. }
    12. }

    请求AServlet02路径 

     

    再请求BServlet02路径 

     

     

    4.5、ServletContext域

    ServletContext生命周期

    1、何时创建?
            项目加载时,创建。
    2、何时销毁?
            项目服务器关闭时,销毁。

    3、作用范围?
            与项目共存亡(多个servlet都可以操作它)。

    AServlet类

    1. @WebServlet(urlPatterns = "/AServlet03")
    2. public class AServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. ServletContext servletContext = request.getServletContext();
    5. servletContext.setAttribute("checkCode","6998");
    6. }
    7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    8. this.doPost(request, response);
    9. }
    10. }

    BServlet类 

    1. @WebServlet(urlPatterns = "/BServlet03")
    2. public class BServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. ServletContext servletContext = request.getServletContext();
    5. Object checkCode = servletContext.getAttribute("checkCode");
    6. System.out.println(checkCode);
    7. }
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. this.doPost(request, response);
    10. }
    11. }

    请求路径 

     

    结果

  • 相关阅读:
    Java设计模式之模板方法模式
    [大数据]docker搭建Hadoop
    算法课作业1
    算法刷题:P1025 [NOIP2001 提高组] 数的划分
    9月25日复习
    nginx--正向代理、反向代理及负载均衡(图解+配置)
    安装gitlab
    我,原教培老师,大环境不景气,转行IT拿高薪
    仿东郊到家小程序源码 同城按摩源码 家政小程序源码 美容理疗小程序源码+公众号H5+APP源码
    Java学习笔记——Collection之Set
  • 原文地址:https://blog.csdn.net/select_myname/article/details/126888033