HttpServletRequest 和 HttpServletResponse

在doGet(HttpServletRequest req, HttpServletResponse resp)和doPost(HttpServletRequest req, HttpServletResponse resp)这两个方法中,都涉及到了两个参数:HttpServletRequest 和 HttpServletResponse。

所以我们肯定需要好好研究这两个参数。

HttpServletRequest 和 HttpServletResponse都是接口。

它们分别继承了ServletRequest 和 ServletResponse。

1.HttpServletRequest

HttpServletRequest封装了HTTP请求协议的全部内容,如请求方式,URI,协议版本号,表单提交的数据等等。

表示一次请求,即输入URL按回车到内容显示在屏幕上即为一次请求。

一次请求对应一个HttpServletRequest对象,100次请求对应100个HttpServletRequest对象。

常用方法:

  • 获取请求参数(request对象将请求参数封装到一个Map<String,String[]>中)

     String getParameter(String name);//通过key获取第一个value
     String[] getParameterValues(String name);//通过key获取key所对应的所有value
     String getParameterMap(); //获取整个参数集合
     Enumeration<String> getParameterNames();  //获取参数中的所有key
    
  • 与域对象数据有关

    request域对象中的数据范围是很小的,只在一次请求中有效。

     void setAttribute(String var1, Object var2);  //向request域对象中存数据
     Object getAttribute(String var1);  //向request域对象中取数据
     void removeAttribute(String var1);  //移除request域对象中的数据
    
  • 获取信息

     String getRemoteAddr();  //或取客户端ip
     String getMethod();  //获取请求方式
     String getContextPath();  //获取webapp路径下的工程名
     String getRequestURI();  //获取请求的URI
     StringBuffer getRequestURL();  //获取请求的URL
     String getServletPath();  //获取servlet的路径
    
    //下一篇文章专门将session和cookie
     HttpSession getSession();  //获取session对象
     Cookie[] getCookies();  //获取cookie
    
  • 设置编码

    //在乱码中使用,在此处不做示范
    void setCharacterEncoding(String var1) throws UnsupportedEncodingException;  //设置请求参数的编码
    
  • 请求转发

    请求转发为一次请求。

    RequestDispatcher getRequestDispatcher(String var1);  //获取转发对象,参数为新的资源路径
    //再调用RequestDispatcher的forward(request,response)进行转发
    

例:

web.xml:两个servlet,其中Servlet08用作请求转发的资源

<servlet>
     <servlet-name>servlet07</servlet-name>
     <servlet-class>com.dh.servlet.Servlet07</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servlet07</servlet-name>
    <url-pattern>/servlet07</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>servlet08</servlet-name>
    <servlet-class>com.dh.servlet.Servlet08</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servlet08</servlet-name>
    <url-pattern>/servlet08</url-pattern>
</servlet-mapping>

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="/servlet_01_javaweb/servlet07" method="get">
        姓名:<input name="name" type="text"><br>
        性别:<input name="sex" type="text"><br>
        爱好:
        打游戏<input name="hobby" type="checkbox" value="打游戏">
        看电影<input name="hobby" type="checkbox" value="看电影">
        睡觉<input name="hobby" type="checkbox" value="睡觉"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

Servlet07:


Servlet08:


测试:

点击提交之后的路径为:

结果:

equest.getContextPath():/servlet_01_javaweb
request.getMethod():GET
request.getRequestURL().toString():http://localhost:8080/servlet_01_javaweb/servlet07
request.getRequestURI():/servlet_01_javaweb/servlet07
request.getServletPath():/servlet07
request.getRemoteAddr():0:0:0:0:0:0:0:1
获取指定key的第一个value:
张三
获取指定key的所有value:
打游戏
看电影
获取所有的key:
name
sex
hobby
获取整个Map:
name=[Ljava.lang.String;@205aaba5
sex=[Ljava.lang.String;@655821ca
hobby=[Ljava.lang.String;@5940e1dc
转发:
1

以上都是一些信息的获取,最重要的是验证转发是一次请求(转发的路径为/资源名)。不需要添加/项目名

2.HttpServletResponse

HttpServletResponse中所使用的方法比较少:

PrintWriter getWriter() throws IOException;	//获得输出流(输出到浏览器)
void setContentType(String var1);  //设置编码
void sendRedirect(String var1) throws IOException;	//重定向
void addCookie(Cookie var1);  //服务器向浏览器添加cookie

例:

web.xml:

<servlet>
    <servlet-name>servlet09</servlet-name>
    <servlet-class>com.dh.servlet.Servlet09</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servlet09</servlet-name>
    <url-pattern>/servlet09</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>servlet10</servlet-name>
    <servlet-class>com.dh.servlet.Servlet10</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servlet10</servlet-name>
    <url-pattern>/servlet10</url-pattern>
</servlet-mapping>

Servlet09:重定向到Servlet10

package com.dh.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet09 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //路径要/项目名/资源
        response.sendRedirect("/servlet_01_javaweb/servlet10");
    }
}

Servlet10:

package com.dh.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码为UTF-8,解决中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.print("hello,world!");
        writer.print("你好,世界!");
    }
}

测试:输入http://localhost:8080/servlet_01_javaweb/servlet09

结果:会重定向到Servlet10


下一篇文章讲转发和重定向的区别,以及如何解决中文乱码的问题。

posted @ 2021-03-11 16:33  deng-hui  阅读(195)  评论(0编辑  收藏  举报