Servlet【方法使用】

简介: Servlet【方法使用】

🍎一.HttpServlet


Servlet是属于上层建筑,它处在应用层,它的下层有传输层,网络层,数据链路层,硬件,属于“经济基础”,毕竟下层经济基础决定上层建筑。前面说过,Servlet是一组操作HTTP的API,Tomcat可作为HTTP服务器来处理请求,这个处理请求的关键就是调用Servlet来操作HTTP给客户端做出响应

16afee36698340389eceae3c8c4fac3c.png

🍉1.1HttpServlet方法



方法名称 调用时机
init HttpServlet 实例化之后被调用一次
destory HttpServlet 实例化之后被调用一次
service 收到 HTTP 请求的时候调用
doGet 收到 GET 请求的时候调用(由 service 方法调用)
doPost 收到 POST 请求的时候调用(由 service 方法调用)
doPut/doDelete/doOptions/… 收到其他请求的时候调用(由 service 方法调用)



我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service .


af7f4992cd7045e7817e32077d2a4b01.png

注意: HttpServlet 的实例只是在程序启动时创建一次. 而不是每次收到 HTTP 请求都重新创建实例.


🍉1.2HttpServlet 代码示例: 处理 POST 请求


webapp目录下创建一个HTML文件,用来构造POST请求,首先我们先的引入jquery依赖,你可以如果网络地址:jquery依赖地址导入依赖,或者直接复制https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js,然后调用ajax构造请求

@WebServlet("/Servlet")
public class MethodServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //引入resp.setContentType("text/html; charset=utf-8")后浏览器就会遵循utf-8就不会出现乱码了
       // resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("POST 响应");
    }
}

ae28781be4494b92a7d815f14f5bbb38.png


我们发现与我们的预期不一致,我们处理请求的时候返回了POST请求,而这里显示了POST??,原因是发生了乱码,idea默认编码格式为utf-8,Windows默认的编码格式是gbk,那浏览器解析body的时候也是以gbk格式去进行解析,要想统一格式,就得先告诉浏览器响应数据的编码格式是什么,我们需要在Servlet程序里面设置字符格式,设置方法为调用HttpServletResponse对象的setContentType方法,传入参数text/html; charset=utf-8


404b6ddd62324875bc921fef917e61d3.png

我们也可以通过Fiddler抓包来看到Post方法响应

30b81791c33142adaf3af62e5fe1753a.png


🍎二. HttpServletResquest


🍉2.1 HttpServletResquest方法


核心方法



方法 描述
String getProtocol() 返回请求协议的名称和版本
String getProtocol() 返回请求协议的名称和版本。
String getMethod() 返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
String getRequestURI() 从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
String getContextPath() 返回指示请求上下文的请求 URI 部分。
String getQueryString() 返回包含在路径后的请求 URL 中的查询字符串。
Enumeration getParameterNames() 返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
String getParameter(Stringname) 以字符串形式返回请求参数的值,或者如果参数不存在则返回null。
String[] getParameterValues(Stringname) 返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
Enumerationget HeaderNames() 返回一个枚举,包含在该请求中包含的所有的头名。
String getHeader(Stringname) 以字符串形式返回指定的请求头的值。
String getCharacterEncoding() 返回请求主体中使用的字符编码的名称。
String getContentType() 返回请求主体的 MIME 类型,如果不知道类型则返回 null。
int getContentLength() 以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。
InputStream getInputStream() 用于读取请求的 body 内容. 返回一个 InputStream 对象.


🍉2.2获取GET请求信息

@WebServlet("/ShowServlet")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuilder stringBuilder = new StringBuilder();
        resp.setContentType("text/html; charset=utf-8");
        stringBuilder.append("<h3>首行</h3>");
        //1协议名称与版本
        stringBuilder.append("协议版本:");
        stringBuilder.append(req.getProtocol());
        stringBuilder.append("<br>");
        //2方法类型
        stringBuilder.append("方法:");
        stringBuilder.append(req.getMethod());
        stringBuilder.append("<br>");
        //3获取查URL路径
        stringBuilder.append("URL路径:");
        stringBuilder.append(req.getRequestURI());
        stringBuilder.append("<br>");
        //4URL(不包括查询字符串后面的部分)
        stringBuilder.append("URL(不包括查询字符串后面的部分):");
        stringBuilder.append(req.getRequestURL());
        stringBuilder.append("<br>");
        //5一级路径
        stringBuilder.append("一级路径:");
        stringBuilder.append(req.getContextPath());
        stringBuilder.append("<br>");
        //6查询字符串
        stringBuilder.append("查询字符串:");
        stringBuilder.append(req.getQueryString());
        stringBuilder.append("<br>");
        //7正文编码格式
        stringBuilder.append("正文编码格式:");
        stringBuilder.append(req.getCharacterEncoding());
        stringBuilder.append("<br>");
        //8mine
        stringBuilder.append("mine:");
        stringBuilder.append(req.getContentType());
        stringBuilder.append("<br>");
        //9正文长度
        stringBuilder.append("正文长度:");
        stringBuilder.append(req.getContentLength());
        stringBuilder.append("<br>");
        //10获得头部的键值
        stringBuilder.append("<h3>获得头部的键值:</h3>");
        Enumeration header = req.getHeaderNames();
        while(header.hasMoreElements()) {
            String key = (String)header.nextElement();
            stringBuilder.append(key);
            stringBuilder.append(":");
            stringBuilder.append(req.getHeader(key));
            stringBuilder.append("<br>");
        }
        resp.getWriter().write(stringBuilder.toString());
    }
}

b1698d084ba44a9f8dc363dc7b57a354.png


Fiddler抓包


900ea81e5a8b437a97cb55329d399059.png

🍉2.3获取POST响应信息


我们知道post请求的请求信息在http格式中的body部分当中,而body中的请求内容的格式是有很多种的,比如最常见的有:

x-www-form-urlencode格式,通过form表单或者postman构造。

json格式
form-data格式
x-www-form-urlencode格式:
k e y = v a l u e & k e y = v a l u e & . . . key=value\&key=value\&...key=value&key=value&...

form表单创建x-www-form-urlencode格式请求:


<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>post</title>
</head>
<body>
<form action="./PostParameter" method="post" accept-charset="utf-8">
    <span>userId</span>
    <input type="text" name="userId">
    <span>classId</span>
    <input type="text" name="classId">
    <input type="submit" value="提交">
</form>
</body>
</html>
class User{
    int classId;
    int userId;
}
@WebServlet("/PostParameter")
public class PostParameterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取post请求body请求中的参数
        //设置请求与响应编码格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset=utf8");
        String userId = req.getParameter("userId");
        String classId = req.getParameter("classId");
        //写会数据
        resp.getWriter().write("userId=" + userId + ", " + "classId=" + classId);
    }
}

90e21c2b065c4daca4a5191ad5479852.png


点击就会在POST方法的body得到输入的结果

bfcf78a4e03d40ae8bc329c6b3d93538.png


🍎三. HttpServletRespont


🍉3.1 HttpServletRespont方法


核心方法


方法 描述
void setStatus(int sc) 为该响应设置状态码
void setHeader(String name,String value) 设置一个带有给定的名称和值的 header. 如果 name 已经存在,则覆盖旧的值.
void addHeader(Stringname, String value) 添加一个带有给定的名称和值的 header. 如果 name 已经存在,不覆盖旧的值, 并列添加新的键值对
void setContentType(Stringtype) 设置被发送到客户端的响应的内容类型。
void setCharacterEncoding(Stringcharset) 设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
void sendRedirect(Stringlocation) 使用指定的重定向位置 URL 发送临时重定向响应到客户端。
PrintWriter getWriter() 用于往 body 中写入文本格式数据.
OutputStream getOutputStream() 用于往 body 中写入二进制格式数据.



注意: 响应对象是服务器要返回给浏览器的内容, 这里的重要信息都是程序猿设置的. 因此上面的方法都是 “写” 方法.
注意: 对于状态码/响应头的设置要放到 getWriter / getOutputStream 之前. 否则可能设置失效.


🍉3.2响应的构造


代码示例:一.设置状态码


@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //格式
        resp.setContentType("text/html; charset=utf8");
        //设置状态码
        int status = 200;
        resp.setStatus(status);
        resp.getWriter().write("这是" + status + "状态码的响应内容!");
    }
}

87de5de0a33e4b3c8008d7427a5c2e6b.png


代码示例:二. 自动刷新

@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //格式
        resp.setContentType("text/html; charset = utf8");
        //设置Refresh,第二个参数表示刷新频率,单位是秒
        resp.setHeader("Refresh", "1");
        //响应
        resp.getWriter().write("时间戳:" + System.currentTimeMillis());
    }
}

77fd2ef3d3124b309f2f841312271ce2.png


代码示例:三. 重定向

  @WebServlet("/redirect")
    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //格式
            resp.setContentType("text/html; charset = utf8");
            //设置状态码
            resp.setStatus(302);
            //设置重定向字段与地址,如跳转到我的码云
            resp.setHeader("Location", "https://gitee.com/panjiapeng");
        }
    }

ee8d9308947948629fa27f016a7ab375.png

相关文章
|
7月前
Servlet方法介绍及体系结构
Servlet方法介绍及体系结构
69 0
|
6月前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
|
7月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
79 2
|
7月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
130 2
|
缓存 Java
严重: Servlet[jsp]的Servlet.service()抛出异常 java.lang.IllegalStateException: 当前响应已经调用了方法getOutputStream()
严重: Servlet[jsp]的Servlet.service()抛出异常 java.lang.IllegalStateException: 当前响应已经调用了方法getOutputStream()
667 0
为什么不重写Servlet中的Service()方法
为什么不重写Servlet中的Service()方法
Servlet Cookie 方法
Servlet Cookie 方法
59 0
|
Java 容器
Servlet 过滤器方法
Servlet 过滤器方法
82 0
QGS
|
容器
浅谈Tomcat9之Servlet-request获取请求参数及常用方法
//获取Map集合中所有的key Enumeration<String> getParameterNames();
QGS
156 0