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对象中获取的数据就是请求报文中的请求行、请求头和请求体

获取请求行信息的方法:

返回值方法名说明
StringgetMethod()获取请求的方式(get/post)
StringgetRequestURL()获取请求路径和参数
StringgetQueryString()获取请求中的参数
StringgetContextPath()获取web应用程序的名称

获取请求头信息的方法:

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

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

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

返回值方法名说明
StringgetParameter(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容器创建和管理的

设置响应行的方法:

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

设置响应头的方法:

返回值方法名说明
voidaddHeader(String key,String value)添加一个响应头,值为String类型
voidaddIntHeader(String key,int value)添加一个响应头,值为int类型
voidaddDateHeader(String key,long i)添加一个响应头,值为日期类型
voidsetHeader(String key,String value)设置一个响应头,值为String类型
voidsetIntHeader(String key,int value)设置一个响应头,值为int类型
voidsetDateHeader(String key,long i)设置一个响应头,值为日期类型

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

设置响应体的方法:

返回值方法名说明
PrintWritergetWriter()返回一个打印流,写出数据到浏览器
  • 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联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐