Request和Response

本文详细解析了Servlet中的Request和Response对象,包括它们的作用、如何处理提交的数据、解决乱码问题以及响应重定向等内容。

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

1、Request和Response对象

Request和Response具体批的是在使用Servlet时,向服务器发送请求和返回请求的信息。在JAVA面向对象的语言中,把向服务器发送信息封装向Request对象,同样返回的信息封装成Response对象。因此本质上Request和Response对象就是http协议的请求和响应。
这里写图片描述

2、Request对象

浏览器发送的HTTP请求.会封装成request对象。它从客户端(浏览器)向服务器发出请求,包括用户提交的信息和浏览器的一些信息。客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据,然后通过request对象的相关方法来获取这些数据。request的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。
既然Request是封装的Http请求,那么它里面的内容就都应该是和http请求的内容大致相同,因此从http请求中去看request对象

代码如下

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //请求行中的内容:
        System.out.println("---------请求行信息------------");
        System.out.println("req.getMethod(): " + req.getMethod());
        System.out.println("req.getContextPath(): " + req.getContextPath());
        System.out.println("req.getRequestURI(): " + req.getRequestURI());
        System.out.println("req.getRequestURI(): " + req.getRequestURI());
        System.err.println("req.getScheme(): " + req.getScheme());
        System.out.println("---------请求头信息------------");
        System.out.println("req.getContentLength(): " +req.getContentLength());
        System.out.println("req.getContentType(): " +req.getContentType());
        System.out.println("req.getLocale(): " +req.getLocale());
        System.out.println("req.getServerName(): " +req.getServerName());
        System.out.println("---------请求正文信息------------");
        System.out.println("get:在请求的行中包括正文信息------post:在请求头下的是请求正文信息");
        System.out.println(req.getParameter(""));
        System.out.println(req.getParameterNames());
        System.out.println(req.getParameterValues(""));

    }

打印结果

这里写图片描述


1、http请求行
requst.getMethod():请求方式
request.getServletPath(): 获得项目路径
request.getScheme(): 获得请求协议

2、http请求头
request.getContentLength()获得请求正文的长度
request.getContentType()获得请求正文的类型
request.getLocale()获得浏览器请求的语言
request.getServerName()获得请求的主机名称
3、http请求正文
get在请求行中包含,post请求内容在请求头下面。在四个方法可以获取请求正文中的信息
String getParameter(String name) 根据键获得值
Enumeration getParameterNames() 获得表达参数的所有键
String[] getParameterValues(String name) 当一个键对应多个值时,该方法返回多个值.
Map

3、Request提交乱码问题

这里写图片描述
示例:

<body>
    <form action="/ServletDemo/MyServlet" method="get">
        用户名:<input type="text" name="name"><br>
         密码:   <input type="text"name="password"><br>
            <input type="submit" value="get提交">
    </form>

    <form action="/ServletDemo/MyServlet" method="post">
        用户名:<input type="text" name="name"><br>
         密码:   <input type="text"name="password"><br>
            <input type="submit" value="post提交">
    </form>
</body>

这里写图片描述

分析如下:

这里写图片描述

get请求乱码解决

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String name=req.getParameter("name");
        String password=req.getParameter("password");   
        System.out.println("-------get提交乱码");
        //转换成iso-8859-1字节数组
        byte[] b=name.getBytes("iso-8859-1");
        //将字节数据转换成utf-8编码
        String name2=new String(b,"utf-8");  
        System.out.println("name-------"+name2);
        System.out.println("password---"+password);
    }

post请求乱码解决

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        //在请求中指定请求的编码方式;
        req.setCharacterEncoding("utf-8");
        String name=req.getParameter("name");
        String password=req.getParameter("password");   
        System.out.println("-------post提交乱码");
        System.out.println("name-------"+name);
        System.out.println("password---"+password);
    }

4、Response对象

requst是http请求的封装,response是http响应的封装,因此response与http响应内容应该一致。
1、响应行
HTTP/1.1 200 OK => 协议名/版本号 状态码 状态码描述

用来发送表达错误信息 的状态码

void sendError(int sc)  
void sendError(int sc, String msg) 

用来发送表达正常的状态码

void setStatus(int sc)
void setStatus(int sc, String sm) 

2、响应头

void addHeader(String name, String value) 
void addDateHeader(String name, long date) 
void addIntHeader(String name, int value) 
void setHeader(String name, String value)     

set和add的区别是什么?
调用add开头的方法永远是增加一个头.
存在 A:B 这个头.
调用 addHeader(“A”,”C”); 会出现两个键为A的键值对
调用 setHeader(“A”,”C”); 将会覆盖原有的A:B键值对.

3、响应正文

getOutputStream();
getWriter();

5、Response重定向

response.sendRedirect("http://cn.bing.com");

6、Response字符流和字节流

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        OutputStream os =response.getOutputStream();
        //默认的response相应头中的编码方式为GB2312,因此如果不指定编码也不是乱码
        os.write("字节".getBytes());
        System.out.println();


    } 

字符流乱码解决

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //使用字符流如果不指定编码乱码   ???
        //当乱码出现???时,编码是使用的是iso-8859-1(码表中没有中文);
        response.setCharacterEncoding("utf-8");

        //设置解码码表
        response.setHeader("content-type", "text/html;charset=utf-8");
        response.getWriter().print("字符流");


    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值