zoukankan      html  css  js  c++  java
  • request和response

    概念

    在b/s架构中,请求和响应都是必须的,在我们跟网页进行交互的时候,我们需要使用request发送请求,当服务器接收到请求后,根据设定代码,返回响应包的内容。

    当我们需要在页面上显示一些东西的时候,就需要使用response来打印。

    request和response

    1. request和response对象是由服务器创建的。我们来使用它。
    2. request对象是来获取请求信息,response对象是来设置相应信息。

    request

    常用方法:

    • String getMethod() 获取请求方式
    • String getContextPath() 获取虚拟路径
    • String getServletPath() 获取Servlet路径
    • String getQueryString() 获取get请求方式参数
    • String getRequestURL() 获取url
    • String getProtocol() 获取协议版本
    • String getRemoteAddr() 获取客户端ip
    • String getHeader(String name) 通过请求头的名称获取请求头的值
    • Enumeration getHeaderNames() 获取所有的请求头名称

    代码:

    package Request;
    
    import javax.jws.WebService;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(urlPatterns = "/demo01")
    public class Demo01 extends HttpServlet {
       protected void doGet(HttpServletRequest request, HttpServletResponse response){
           String header = request.getHeader("user-agent");//获取ua
           System.out.println(header);
           String method = request.getMethod();//获取请求方式
           System.out.println(method);
           String contextPath = request.getContextPath();//获取虚拟路径
           System.out.println(contextPath);
           String servletPath = request.getServletPath();//获取servlet路径
           System.out.println(servletPath);
           String queryString = request.getQueryString();//获取get请求参数
           System.out.println(queryString);
           String requestURL = request.getRequestURI();//获取url路径
           System.out.println(requestURL);
           //StringBuffer requestURL = request.getRequestURI();//获取完整url路径
           //System.out.println(requestURL);
       }
    
    
        protected void doPost(HttpServletResponse response,HttpServletRequest request){
           System.out.println("post请求");
       }
    }
    

    可以看到,通过这些方法,我们可以提取请求包里面的一些内容。

    请求转发

    在访问网站的过程中,我们经常会遇到一种情况,最常见的就是百度一下页面,在我们搜索指定的值之后,百度并不会在原本的页面直接给我们展示结果,而是会跳转到另外一个页面然后再将结果打印。

    这就是servlet请求转发。

    通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

    使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)

    servlet1

    package Request;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet("/demo02")
    public class Demo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.getRequestDispatcher("/demo00").forward(request,response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            super.doPost(request, response);
        }
    }
    

    servlet2:

    package Request;
    
    import com.sun.net.httpserver.HttpServer;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/demo00")
    public class Demo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response){
            System.out.println("demo03被访问");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            super.doPost(request,response);
        }
    }
    

    可以看到,我访问的地址是servlet1的地址,但是sevlet2里面的doGet方法被调用了。

    这种方法,一般用于大型网站,因为这样会让功能更多样化,使用起来更方便。

    Response

    常用方法:

    • setStatus(int sc):设置响应状态码
    • setHeader(String name,String value):设置相应头
    • response.sendReadirect(String Redirect):302跳转

    转发和重定向的区别

    重定向:

    1. 地址栏发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是两次请求。不能使用request对象来共享数据

    转发:

    1. 转发地址栏路径不变
    2. 转发只能访问当前服务器下的资源
    3. 转发是一次请求,可以使用request对象来共享数据

    重定向代码

    response类:

    package Response;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/response")
    public class Demo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response){
            response.setStatus(302);
            response.setHeader("location","demo01");
        }
    
        protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
            super.doPost(request,response);
        }
    }
    

    这个代码在我们访问response的时候,就会自动帮我们跳转到demo01这个页面去。

    ServletDemo类

    package Response;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/demo01")
    public class Demo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            System.out.println("已跳转");
            response.sendRedirect("https://www.baidu.com");
        }
    
        @Override
        protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
            super.doPost(request,response);
        }
    }
    

    write的使用

    package Response;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.HttpConstraint;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/response")
    public class Demo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setCharacterEncoding("gbk");
            PrintWriter writer = response.getWriter();
            writer.write("response");
            writer.write("12345");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            super.doPost(request,response);
        }
    }
    
  • 相关阅读:
    2017-2018-2 20179202《网络攻防技术》第一周作业
    《构建之法(第三版)》第四章
    《深入理解计算机系统(第三版)》第四章
    《文献管理与信息分析》第三章
    我们不一样
    linux centOS 7安装mysql 5.7.24
    centOS 8 使用dnf安装Docker
    centOS7服务器/dev/vda1空间100%,没有可用空间
    深刻理解 Docker 镜像大小
    使用linux docker环境打包Springboot jar包为docker镜像
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14135975.html
Copyright © 2011-2022 走看看