HttpServlet

设计Servlet之初,考虑到互联网中使用的协议不仅仅是http协议,所以为了支持更多的协议,Servlet使用接口的设计思想

GendericServlet,Servlet接口的子接口,一个通用的Servlet

HttpServlet继承自GendericServlet,就是和http协议相关的Servlet,专门用来处理http协议的请求和响应

  • 使用HttpServlet类,就不需要重写service方法,在HttpServlet中重写doGet、和doPost方法即可
  • 如果是get请求,那么就重写doGet,是post就重写doPost

Servlet2.5和Servlet3.0:

  • 2.5:Servlet、过滤器Filter、监听器Listener的声明必须使用web.xml
  • 3.0:新增注解的支持,用于简化Servlet、过滤器、监听器的配置,所以从3.0开始web.xml不再是必选的。

使用注解@WebServlet,该注解中value和urlPatterns都可以用来指定访问该Servlet的url,同时只能使用一个,都是一个Sting[]类型的,所以一个Servlet可以为它定义多个url

HttpServletRequest接口

继承至ServletRequest接口,获取客户端发送的请求数据,它是与Http协议相关的Request,代表一个请求

  • HttpServletRequest接口对象是tomcat容器提供的,所以我们不需要自己创建
  • request对象中获取的数据就是请求报文中的请求行、请求头和请求体

获取请求行信息的方法:

返回值 方法名 说明
String getMethod() 获取请求的方式(get/post)
String getRequestURL() 获取请求路径和参数
String getQueryString() 获取请求中的参数
String getContextPath() 获取web应用程序的名称

获取请求头信息的方法:

返回值 方法名 说明
String getHeader(String name) 获取请求头中指定key的value
Enumeration getHeaderNames() 获取所有请求头的key

获取请求参数信息的方法:

(get请求方式的参数信息在url后,post请求方式放在请求体中)

返回值 方法名 说明
String getParameter(String name) 获取请求中指定name 的值
String[] getParameterValues(String name) 获取请求中指定name 的所有值,针对复选框这种一个key对应多个value
Map< String,String[]> getParameterMap() 获取请求中所有参数,参数名为key,对应值为value存入Map集合中

示例:

在JavaWeb项目中web目录下创建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>javaWeb首页</title>
</head>
<body>
    <h2>welcome to html</h2>
    <form action="request1" method="post">
        用户名:<input type="text" name="username"/><br>
        密码:<input type="password" name="password"/><br>
        爱好:<input type="checkbox" name="hobby" value="eat"/><input type="checkbox" name="hobby" value="sleep"/><input type="checkbox" name="hobby" value="code"/><br>
        <input type="submit" value="post提交"><br>
    </form>
    <form action="request1" method="get">
        <input type="submit" value="get提交">
    </form>
</body>
</html>

准备一个Servlet:

@WebServlet(urlPatterns = {"/request1"})
public class HttpServletRequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-------------获取请求行信息--------------");
        System.out.println("获取请求方式"+req.getMethod());
        System.out.println("获得URI"+req.getRequestURI());
        System.out.println("获得URL"+req.getRequestURL());
        System.out.println("获得get请求参数"+req.getQueryString());
        System.out.println("获得web根路径"+req.getContextPath());

        System.out.println("-------------获取请求头信息--------------");
        Enumeration<String> e = req.getHeaderNames();
        while (e.hasMoreElements()){
            String key = e.nextElement();
            System.out.print(key+":");
            String value = req.getHeader(key);
            System.out.println(value);
        }
        System.out.println("-------------获取get请求中的参数--------------");
        //Tomcat8.5之后可以自动处理中文乱码问题
        System.out.println(req.getParameter("user"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-------------获取请求体信息--------------");
        //修改request缓冲区中的编码类型
        req.setCharacterEncoding("UTF-8");
        System.out.println("获取username的值"+req.getParameter("username"));
        System.out.println("获取一个复选框信息"+Arrays.toString(req.getParameterValues("hobby")));
        System.out.println("获取表单全部信息");
        Map<String,String[]> map  = req.getParameterMap();
        for (Map.Entry<String,String[]> e:map.entrySet()){
            System.out.println(e.getKey()+Arrays.toString(e.getValue()));
        }
    }
}

Request接收表单请求中数据中文乱码:

  • post请求:
    • post方式提交的数据在请求体中,request对象接收到数据后,放入缓冲区,而request缓冲区的编码方式为ISO-8859-1
    • 设置缓冲区编码格式:req.setCharacterEncoding("UTF-8");
  • get请求:
    • get方式提交的数据都在url的后面(以 ?key1=value1&key2=value2···的方式)
    • 当数据存在中文时,在地址栏中其实就已经进行过一次url编码了
    • 在Tomcat8.5版本之后,tomcat可以自动处理get请求中中文乱码的问题
    • 如果使用之前的版本,可以使用ISO-8859-1的方法获取,在使用UTF-8转码得到

HttpServletResponse接口

继承至ServletResponse接口,返回数据到客户端

当服务器获取request请求后,经过一些处理,再把服务器中的数据返回给客户端浏览器,这就是响应

  • HttpServletResponse接口对象也是由tomcat容器创建和管理的

设置响应行的方法:

返回值 方法名 说明
void setStatus(int code) 设置相应的状态码

设置响应头的方法:

返回值 方法名 说明
void addHeader(String key,String value) 添加一个响应头,值为String类型
void addIntHeader(String key,int value) 添加一个响应头,值为int类型
void addDateHeader(String key,long i) 添加一个响应头,值为日期类型
void setHeader(String key,String value) 设置一个响应头,值为String类型
void setIntHeader(String key,int value) 设置一个响应头,值为int类型
void setDateHeader(String key,long i) 设置一个响应头,值为日期类型

(add开头的方法,可以实现一个key对应多个value的情况(key相同,继续添加),set开头的方法,针对一个key对应一个value(key相同,会替换掉之前的))

设置响应体的方法:

返回值 方法名 说明
PrintWriter getWriter() 返回一个打印流,写出数据到浏览器
  • PrintWriter中的方法:
    • writer(···):输出数据到浏览器上,字符串没有区别,但是如果输入整数,则是ASCII码值
    • print(···):输出数据到浏览器上,无论什么类型都是原样输出

字符流输出乱码:

  • response缓冲区编码也是ISO-8859-1
  • 设置response缓冲区的字符集和浏览器的编码格式一致即可
  • resp.setCharacterEncoding("utf-8"):设置响应内容的编码方式
  • resp.setContextType("text/html;charset=utf-8"):设置浏览器打开页面时使用的字符集

示例:

在浏览器中访问response1

@WebServlet({"/response1"})
public class HttpServletResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//规定是使用的字符集
        resp.setContentType("text/html;charset=utf-8");
        //设置状态码为200
        resp.setStatus(200);
        //添加响应头信息
        resp.setHeader("a","aaa");
        resp.addHeader("a","a22");
        resp.addIntHeader("a",123);
        resp.addDateHeader("dateA",88888888L);
        PrintWriter out = resp.getWriter();
        //浏览器中会显示一个d
        out.write(100);
        //显示100
        out.print(100);
    }
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐