servlet http状态码,重定向和请求转发

http状态码

  1.Http状态码是由一个三位数字组成符号

  2.Http状态码由Tomcat负责创建生成

  3.Http状态码由Tomcat写入到【状态行】

  4.Http状态码通知浏览器在接收到响应包之后的行为Http状态码通知浏览器,服务端无法提供本次服务的原因

【分类介绍】:5类

  1xx: 通知浏览器本次返回的资源文件并不完整,需要浏览器继续向服务端发送申请

  2xx: 通知浏览器,服务端将一个完整的文件推送给浏览器。
    200:浏览器与服务端进行了一次完美通信

  3xx: 服务端推送给浏览器的是一个【网址】,要求浏览器在接收到这个网址后,立刻自动向这个网址发送请求

    302:response.sendRedirect("地址") ,由servlet重定向一个地址

  4xx: 通知浏览器,服务端本次未能提供服务的原因,是由于服务端没有对应的资源文件

    404: 服务端没有对应的资源文件

    405:服务端有本次请求对应的Servlet,但是Servlet不负责处理浏览器当前的请求方式
      GET:浏览器 -------> Tomcat --------> OneServlet.doGet/one.do

      POST:浏览器-------> Tomcat--------> OneServlet.doPost/one.do

      HTTP Status 405 - HTTP method GET is not supported by this URL

      浏览器使用GET方式发送请求,但是对应Servlet中没有重写doGet方法

  5XX: 通知浏览器,服务端本次未能提供服务的原因被调用Servlet在运行时抛出了异常,即服务器运行代码出异常了

 

【默认欢迎资源文件】:

  1.【定义】:Http服务器在接收到一个【默认请求时】返回的资源文件

  2.【默认请求】: 浏览器向某一个网站发送请求时,并没有指定索要的文件的情况

    http://localhost:8080/myWeb 默认请求

    http://localhost:8080/myWeb/one.html 具体请求

  3.【默认欢迎文件配置】:

    第一种方式: 手动在web.xml配置

      <welcome-file-list>
        <welocome-file>one.html</welcome-file>
      </welcome-file-list>

    第二种方式: 由Tomcat自行确认

      如果Tomcat在当前网站中没有找到<welcome-file-list>标签
      此时Tomcat回到自己的config文件夹下寻找一个web.xml文件
      在这个web.xml寻找<welcome-file-list>标签,来获得默认欢迎文件地址(一般是index.html / index.htm / index.jsp)

  4.【默认欢迎资源文件分类】:

    1.首选 html文件或则jsp文件

    2.也可以是一个Servlet,但是这个Servelt应该是一个查询Servlet并且在运行是不需要得到浏览器发送的请求参数

 

重定向:

【重定向方案原理】:

  在第一个Servlet工作完毕后,将【第二个Servelt地址】推送给用户浏览器,

  由用户浏览器根据这个地址来【自动的】向第二个Servelt发送请求

【重定向方案涉及命令】:response.sendRedirect(第二个Servelt地址);

  将一个地址写入到【响应头】中location浏览器接受大响应包之后,

  自动根据location地址发送第二次请求这样好处避免用户多次手动发送请求

【重定向方案特征】:

  1.[发生位置]: 在客户端的浏览器上

  2.[浏览器发送的请求次数]:多次

  3.[地址栏内容是否会发生变化]: 会发生变化,内容是浏览器第二次需要访问的资源地址

  4.[重定向时,浏览器采用的请求方式]:由于此时通过地址栏命令浏览器发送请求,所以浏览器采用请求方式一定是GET

  5.[重定向时,访问的资源文件范围]:可以访问的资源文件可以是同一个网站的资源也可以是其他网站的资源。

【从定向方案适用场景】:

  1.添加功能Servlet  调用  查询功能Servlet

  2.删除功能Servlet  调用  查询功能Servlet

  3.更新功能Servelt  调用  查询功能Servlet

应用:

OneServlet在完成任务后向浏览器推送的响应头中有TwoServlet的地址

public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("洗菜");
        resp.sendRedirect("/myWeb/two.do");//这里要写网站地址
    }
}
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("炒菜");
    }
}

 

请求转发

【请求转发原理】:

  在第一个Servelt工作完毕后,代替当前浏览器向Tomcat申请调用第二个Servlet。
  Tomcat在接受到申请之后,调用第二个Servelt来完成本次请求中剩余任务

 

【请求转发涉及的命令】:

  OneServlet 

    //1.创建一个资源申请报告对象

    RequestDispatcher report = request.getRequestDispatcher("第二个Servelt地址");

    //2.将申请报告推送给Tomcat,同时将OneServlet拥有的【request和response】一并交给Tomcat

    report.forward(request,response)

    //3.Tomcat在接受到报告之后,就会调用第二个Servelt来完成剩余任务

【请求转发时为什么将第一个Servelt中request和response交给Tomcat】:

  1.Tomcat在接受到请求后,需要调用第二个Servlet.
  2.Tomcat此时需要为第二个Serelt提供运行时需要【request】和【response】
  3.但是,本次请求是由第一个Servelt来发送的,没有对应的【请求协议包】因此导致Tomcat在接受到请求后,不会创建【request】和【response】
  4.为了解决这个问题,需要将第一个Servlet使用【request】和【response】通过Tomcat交给第二个Servlet来使用。

【请求转发特征】:

  1.[发生位置]:发生在服务端

  2.[浏览器发送请求次数]:浏览器只向服务端发送了一次请求

  3.[地址栏内容是否会发生变化]:由于请求转发发生在服务端,因此浏览器地址内容保持在一次请求内容

  4.[调用资源文件范围]:只能访问同一个访问内部的资源文件

  5.[通过请求转发调用的Servlet接受的请求方式]:与浏览器第一次发送请求时,使用的请求方式保持一致
   参与同一次请求转发的所有Servlet接受的请求方式是一样的。

  6.【参与同一次请求转发的所有Servlet之间如何进行数据共享】

    1)可以使用全局作用域对象,提供共享数据

    2)可以使用会话作用域对象,提供共享数据

    3)  可以使用请求作用域对象,提供共享数据

应用

OneServlet完成任务后请求转发TwoServlet,两个Servlet通过三种方式共享数据

public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("One servlet负责洗菜工作");

        //1.将一段共享数据保存到全局作用域对象
        ServletContext applicationg = req.getServletContext();
        applicationg.setAttribute("key1","mike");

        //2.将一段共享数据保存到当前来访的浏览器的HttpSession对象中
        HttpSession session = req.getSession();
        session.setAttribute("key2","北京");

        //3.将一段共享数据保存到当前的请求对象中
        req.setAttribute("key3",33);


        //请求转发时不能从网站根目录开始写
        RequestDispatcher report = req.getRequestDispatcher("/two.do");
        report.forward(req,resp);

    }
}
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Two servlet负责炒菜工作");

        //1.TwoServlet从全局作用域对象获取共享数据
        ServletContext app = req.getServletContext();
        String value1 = (String) app.getAttribute("key1");
        System.out.println("全局共享数据"+value1);

        //2.TwoServlet从会话中获取共享数据
        HttpSession session = req.getSession();
        String value2 = (String) session.getAttribute("key2");
        System.out.println("会话共享数据"+value2);

        //3.从请求对象中获取数据
        Integer age = (Integer) req.getAttribute("key3");
        System.out.println("请求作用域共享数据"+age);
    }
}

十一:[请求转发不适合场景]:重定向适合的请求转发就不适合

  1.添加功能Servlet 调用 查询功能Servlet

  2.删除功能Servlet 调用 查询功能Servlet

  3.更新功能Servelt 调用 查询功能Servlet

十二。[请求转发适合场景]: 查询Servlet调用JSP时

posted on 2020-04-09 20:19  zsben  阅读(696)  评论(0编辑  收藏  举报

导航