Servlet【方法使用】
Servlet【方法使用】
- 🍎一.HttpServlet
- 🍉1.1HttpServlet方法
- 🍉1.2HttpServlet 代码示例: 处理 POST 请求
- 🍎二. HttpServletResquest
- 🍉2.1 HttpServletResquest方法
- 🍉2.2获取GET请求信息
- 🍉2.3获取POST响应信息
- 🍎三. HttpServletRespont
- 🍉3.1 HttpServletRespont方法
- 🍉3.2响应的构造
🍎一.HttpServlet
Servlet是属于上层建筑,它处在应用层,它的下层有传输层,网络层,数据链路层,硬件,属于“经济基础”,毕竟下层经济基础决定上层建筑。前面说过,Servlet是一组操作HTTP的API,Tomcat可作为HTTP服务器来处理请求,这个处理请求的关键就是调用Servlet来操作HTTP给客户端做出响应

🍉1.1HttpServlet方法
| 方法名称 | 调用时机 |
|---|---|
| init | HttpServlet 实例化之后被调用一次 |
| destory | HttpServlet 实例化之后被调用一次 |
| service | 收到 HTTP 请求的时候调用 |
| doGet | 收到 GET 请求的时候调用(由 service 方法调用) |
| doPost | 收到 POST 请求的时候调用(由 service 方法调用) |
| doPut/doDelete/doOptions/… | 收到其他请求的时候调用(由 service 方法调用) |
我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service .

注意: 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 {@Overrideprotected 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 响应");}
}

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

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

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

Fiddler抓包

🍉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 {@Overrideprotected 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);}
}

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

🍎三. 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 {@Overrideprotected 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 + "状态码的响应内容!");}
}

代码示例:二. 自动刷新
@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {@Overrideprotected 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());}
}

代码示例:三. 重定向
@WebServlet("/redirect")public class RedirectServlet extends HttpServlet {@Overrideprotected 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");}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
