Servlet -- Request && Response

本文详细介绍了如何使用HttpServletRequest和HttpServletResponse对象处理HTTP请求与响应,包括获取请求信息、设置响应头及响应体等内容,并对比了请求转发与重定向的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Request对象

1. 基本概念
  HttpServletRequest 继承自父接口ServletRequest,它的对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户端及请求信息。


2. Request获取请求行信息
  请求行的组成内容:请求方式 + 请求路径 + 协议版本
  
API:

1. String getMethod()  获取请求方式的类型
2. String getRequestURI()  获取请求行中的资源名部分
3. StringBuffer getRequestURL()  获取客户端发出请求 完整URL

4. String getProtocol()  获取当前协议的名称和版本
5. String getRemoteAddr()  获取IP地址
6. int getLocalPort()  获取端口

代码:

//1. 请求方式
String method = request.getMethod();
//2. 请求资源uri/url
String uri = request.getRequestURI();
String url = request.getRequestURL().toString();
//3. 当前的协议版本
String protocol = request.getProtocol();

//4. 当前网站的ip地址
String ip = request.getRemoteAddr();
int port = request.getLocalPort();
System.out.println("IP地址:" + ip + " 端口号:" + port);

3. Request获取请求头信息

API:

1. String getHeader(String name)  通过请求头的键获取到对应请求头的值
2. Enumeration getHeaderNames()   返回此请求包含的所有头名称的枚举

1)请求头中referer :判断当前的请求是来自于哪个页面的,(经过哪个页面来到这个Servlet)

代码:

@WebServlet(urlPatterns = "/referer")
public class RefererServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取当前用户是经过哪个页面过来的。
       String  referer =  request.getHeader("referer");
       System.out.println("当前用户是经过:"+ referer +"页面过来的..");
    }
}

2)请求头中user-agent:获取客户端使用的是什么浏览器版本与浏览器内核

代码:

@WebServlet(urlPatterns = "/userAgent")
public class UserAgentServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取客户端当前使用浏览器版本
        String userAgent = request.getHeader("user-agent");
        if(userAgent.contains("Chrome")){
            System.out.println("当前使用的是谷歌浏览器");
        }else if(userAgent.contains("Firefox")){
            System.out.println("当前使用的是火狐浏览器");
        }else if(userAgent.contains("Trident")){
            System.out.println("当前使用的是IE浏览器");
        }
    }
}

4. Request获取请求体参数数据
  请求体,包含的是用户通过浏览器发送的请求参数

API:

1. String getParameter(String name)   根据表单的name属性,获取对应的值
2. String[] getParameterValues(String name)  获取name相同的所有value,例如复选框
3. Map getParameterMap()  参数名作为key,参数值作为value,封装到map中

代码:

@WebServlet(urlPatterns = "/getParam")
public class GetParamServlet extends HttpServlet {

    //get请求方式提交的数据是不会出现中文乱码问题的。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //根据表单的name属性获取提交的数据
        String userName = request.getParameter("username");
        //获取兴趣爱好,如果是复选框,那么我们不能使用getParameter()获取请求参数,因为该方法只是返回一个值,应该使用getParameterValues
        String[] hobby = request.getParameterValues("hobby");
        System.out.println("用户名:"+ userName+" 爱好是:"+ Arrays.toString(hobby));
    }
    
    //post请求方式提交中文数据时会出现乱码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //设置了request对象获取请求体时使用的码表
        request.setCharacterEncoding("UTF-8");
       //获取提交的name值
        String userName = request.getParameter("username");
        System.out.println("post方式获取到的名字:"+ userName);
    }
}

5. Request获取工程名字

API:

1. String getContextPath()  获取工程项目名

代码:

@WebServlet(urlPatterns = "/getContextPath")
public class GetPathServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取当前到工程名字
        String  contextPath = request.getContextPath();
        System.out.println("当前的工程名字:"+ contextPath);
    }
}

二、Response对象

1. 基本概念
  HttpServletResponse 对象封装了向客户端发送数据、发送响应头,发送响应状态码的方法,学会使用 HttpServletResponse,才能给浏览器发送数据。

2. 常用API

1. void setStatus(int sc)  设置此响应的状态码
2. void setHeader(String name, String value)  用给定名称和值设置响应头

3. 响应头:location
  作用: 浏览器一旦收到了location的响应头,那么就会发生页面跳转

代码:

@WebServlet(urlPatterns = "/location")
public class LocationServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置状态码
        response.setStatus(302);
        //为response设置location的响应头
        response.setHeader("location","/test/hello.html");  //通知浏览器跳转的页面

		//上面代码可以换成请求重定向,上面代码是该句的原理
		response.sendRedirect("/test/hello.html");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

4. 响应头:Content-Type
作用:

  • 设置了response使用字符流时候使用的码表。

  • 通知浏览器使用指定的码表去解码(解决浏览器乱码问题)

    response.setContentType(“text/html;charset=utf-8”);

5. 响应头:refresh
  作用:设置浏览器定时刷新页面或定时跳转到指定的资源

代码:

@WebServlet(urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //实现定时刷新,每一秒就定时刷新一次
		//response.setHeader("refresh","1");

        //实现定时跳转   3秒钟后跳转到hello.html页面上。
        response.setHeader("refresh","3;url=/test/hello.html");
    }
}

6. 响应头:Content-Disposition
  作用:通知浏览器以附件的形式处理响应的内容

代码:

//需求: 向浏览器输出一张图片,然后通知浏览器以附件的形式下载

@WebServlet(urlPatterns = "/downImage")
public class ContentDispositionServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //通知浏览器以附件的形式下载图片
        response.setHeader("Content-Disposition","attachment;filename=1.jpg");

        //找到图片,然后获取图片的输入流对象
        // ServletContext对象可以理解为就是当前工程
        ServletContext context = this.getServletContext();
        //利用ServletContext 找web路径的下的资源文件
         InputStream inputStream =  context.getResourceAsStream("/img/1.jpg");
         byte[] buf = new byte[1024];
         int length = 0;

         //获取向浏览器输出数据的输出字节流,Outputstream是通过response对象得到,那么response一旦死亡,outputstream也会死亡
        OutputStream out = response.getOutputStream();
        //边读边写
        while((length = inputStream.read(buf))!=-1){
            out.write(buf,0,length);
        }
        //关闭资源
        inputStream.close();
    }
}

7. 响应体
  概述:就是服务器输出的数据,服务器输出数据给浏览器,浏览器显示给用户。

作用:

  • 输出字符数据、字节数据
  • 输出资源文件数据(资源图片)
  • 输出缓存(内存中)图片 - - 验证码
三、解决中文乱码

Servlet解决中文乱码


四、请求转发和请求重定向的区别

1. 请求转发
  request.getRequestDispatcher().forward(),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。

request.getRequestDispatcher("success.jsp").forward(request,response);

2. 请求重定向
  response.sendRedirect(),是一种客户端行为,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。

response.sendRedirect("success.jsp");

3. 区别

区别请求转发请求重定向
哪里进行服务器端客户端
转发速度
请求次数一次两次
地址栏不变发生改变
是否能跨域不可以,只能访问本身的web资源可以,能访问本身之外的资源

注意:请求转发跳转之间传输的信息不会丢失,重定向跳转之间传输的信息会丢失(request范围)。

4. 请求转发和重定向的应用场景
  重定向需要经过客服端且还得发出一个新的请求,速度比转发慢,两者皆可时优先使用请求转发;
  请求转发智能访问当前Web的应用程序,如果要访问到另外一个Web站点上的资源时,只能使用重定向。

请求转发与请求重定向的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值