您现在的位置是:首页 > 技术教程 正文

【JavaWeb】Servlet API详解

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

目录

HttpServlet类

核心方法

init方法

destroy方法

doGet方法

doPost方法等其他方法

Servlet的生命周期

小结

HttpServletRequest类

核心方法

前端给后端传参的方法

get中的query string

​编辑post中的form

post中的json(使用Postman)

HttpServletRespond类

核心方法


HttpServlet类

当写Servlet代码的时候,首先就是要创建类,然后继承这个HttpServlet这个类,重写里面的方法。

核心方法

方法说明
init()在HttpServlet实例化之后首先会调用这个方法。(HttpServlet只是在在程序启动时实例化一次,不是每次收到请求就创建实例。而且不是一实例化就会调用,而是收到了相关请求后才开始调用
destroy()只有主动关闭才可以调用这个方法。如果是杀进程就可能执行不到。
service()收到HTTP请求的时候调用
doGet()收到get请求的时候调用(由service方法调用)
doPost()收到post请求的时候调用(由service方法调用)
其他方法收到其他方法请求的时候调用(由service方法调用)

init方法

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/TestHttpServlet")
  8. public class TestHttpServlet extends HttpServlet {
  9. @Override
  10. public void init() throws ServletException {
  11. // 当这个类被实例化,会先执行 init方法
  12. System.out.println("init 方法执行");
  13. }
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. System.out.println("doGet 方法被执行");
  17. }
  18. }

destroy方法

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/TestHttpServlet")
  8. public class TestHttpServlet extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. System.out.println("doGet 方法被执行");
  12. }
  13. @Override
  14. public void destroy() {
  15. System.out.println("destroy 方法被执行");
  16. }
  17. }

doGet方法

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/TestHttpServlet")
  8. public class TestHttpServlet extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. System.out.println("doGet 方法被执行");
  12. // 中文响应如果不设置字符,就会出现乱码
  13. resp.setContentType("text/html; charset=utf-8");
  14. resp.getWriter().write("这是服务器给你浏览器的响应!");
  15. }
  16. }

doPost方法等其他方法

使用Postman构造浏览器请求

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/TestHttpServlet")
  8. public class TestHttpServlet extends HttpServlet {
  9. @Override
  10. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. System.out.println("doPost 方法被执行");
  12. }
  13. @Override
  14. protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15. System.out.println("doDelete 方法被执行");
  16. }
  17. @Override
  18. protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  19. System.out.println("doPut 方法被执行");
  20. }
  21. }

使用ajax构造浏览器请求

①建文件

②引入依赖

 ③构造请求代码

  1. html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ajax构造请求title>
  6. head>
  7. <body>
  8. <script src="https://code.jquery.com/jquery-3.6.4.min.js">script>
  9. <script>
  10. $.ajax(
  11. {
  12. // 改变type类型即可
  13. type: 'put',
  14. url: 'http://localhost:9000/J-20230316-TestHttpServlet/TestHttpServlet'
  15. }
  16. )
  17. script>
  18. body>
  19. html>


Servlet的生命周期

Servlet程序的生命周期和它上面的方法息息相关。

Servlet程序启动的时候使用一次init方法

Servlet程序运行过程中会多次使用service方法

Servlet程序销毁前会使用一次destroy方法。


小结


HttpServletRequest类

该类是通过Tomcat解析构造后表示的HTTP请求。

核心方法

方法描述
String getProtocol()返回请求协议的名称和版本
String getMethod()返回请求的HTTP方法的名称
String getRequestURL()

返回从协议名称到HTTP请求的得一行查询字符串

String getContextPath()返回指示请求上下文的请求URL部分
String getQueryString()返回在路径后的URL查询字符串
Enumeration getParamenterNames()返回一个String对象的枚举,是该请求中包含参数的名称
String getParameter(String name)返回请求参数的值,不存在就返回null
String[] getParameterValues(String name)返回一个字符串对象的数组,包含所有给定的
Enumeration getHeaderNames()返回一个枚举,是请求中报头的所有名字(Key)
String getHeader(String name)返回指定请求报头中对应name的值(Value)
String getCharacterEncoding()返回请求的字符编码的名称
String getContentType()返回请求主题的MIME(请求消息的类型),不知道类型就返回null
int getContentLength()返回请求主题的长度(单位:字节)长度未知返回 -1
InputStream getInputStream()用于读取请求的正文内容,返回一个InputStream对象

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.util.Enumeration;
  8. @WebServlet("/TestRequest")
  9. public class TestHttpServletRequest extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. StringBuilder stringBuilder = new StringBuilder();
  13. stringBuilder.append(req.getProtocol());
  14. stringBuilder.append("
    "
    );
  15. stringBuilder.append(req.getMethod());
  16. stringBuilder.append("
    "
    );
  17. stringBuilder.append(req.getRequestURI());
  18. stringBuilder.append("
    "
    );
  19. stringBuilder.append(req.getContextPath());
  20. stringBuilder.append("
    "
    );
  21. stringBuilder.append(req.getQueryString());
  22. stringBuilder.append("
    "
    );
  23. stringBuilder.append("
    "
    );
  24. stringBuilder.append("
    "
    );
  25. stringBuilder.append("
    "
    );
  26. stringBuilder.append("
    "
    );
  27. // 请求报头
  28. Enumeration headerKeys = req.getHeaderNames();
  29. while (headerKeys.hasMoreElements()) {
  30. String headKey = headerKeys.nextElement();
  31. String headerValue = req.getHeader(headKey);
  32. stringBuilder.append(headKey + ": " + headerValue);
  33. stringBuilder.append("
    "
    );
  34. }
  35. // 把响应中的Content-Type设置一下,告诉浏览器是什么格式的数据
  36. resp.setContentType("text/html");
  37. resp.getWriter().write(stringBuilder.toString());
  38. }
  39. }

前端给后端传参的方法

get中的query string

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/getParameter")
  8. public class TestGetParameter extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. // 通过query string 来给后端传参
  12. // 这里 服务器确定了query string中的 Key,浏览器发一个 /getParameter?studentId=1&classId=2 的请求
  13. // 服务器通过 getParameter方法就可以拿到结果
  14. String sId = req.getParameter("studentId");
  15. String cId = req.getParameter("classId");
  16. // 拿到数据可以做其他事情,这里原封不动的返回
  17. resp.setContentType("text/html");
  18. resp.getWriter().write("studentId = " + sId + " classId = " + cId);
  19. }
  20. }

post中的form

WEB-INF目录写一下前端代码

  1. html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>通过form表单构造请求title>
  6. head>
  7. <body>
  8. <form action="postParameter" method="post">
  9. <input type="text" name="studentId">
  10. <input type="text" name="classId">
  11. <input type="submit" value="提交">
  12. form>
  13. body>
  14. html>

Java代码

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/postParameter")
  8. public class TestPostParameter extends HttpServlet {
  9. @Override
  10. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. // 通过form 表单提交数据给服务器
  12. String sId = req.getParameter("studentId");
  13. String cId = req.getParameter("classId");
  14. // 把数据返回去
  15. resp.setContentType("text.html");
  16. resp.getWriter().write("studentId = " + sId + " classId = " + cId);
  17. }
  18. }

 浏览器发送请求

使用Fiddler抓包查看报文

post中的json(使用Postman)

Java后端代码

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. @WebServlet("/postParameter2")
  9. public class TestPostParameter2 extends HttpServlet {
  10. @Override
  11. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. // 获取请求的长度
  13. int len = req.getContentLength();
  14. // 使用buffer数据来存储req的数据
  15. byte[] buffer = new byte[len];
  16. // 通过该方法获取body中的数据
  17. InputStream inputStream = req.getInputStream();
  18. // 把获取的数据填入buffer数据中
  19. inputStream.read(buffer);
  20. String body = new String(buffer);
  21. System.out.println(body);
  22. }
  23. }

Postman构造的前端请求 

通过上面的方法,我们只是获取到了全部的数据,并没有解析出键值对

此时需要通过maven引入第三方库——Jackson

Maven Repository: com.fasterxml.jackson.core » jackson-databind » 2.14.2 (mvnrepository.com)

  

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.coregroupId>
  3. <artifactId>jackson-databindartifactId>
  4. <version>2.14.1version>
  5. dependency>

pom.xml文件下粘贴进去

创建出对应的的类 (最开始的时候前端和后端约定好的)

  1. // 这个类和前端的json要匹配
  2. class Student {
  3. // 这里的成员要么用public修饰
  4. // 如果用其他修饰符修饰,就必须提供对应的getter和setter方法
  5. // 否则jackson就无法获取到成员,也就无法给其解析赋值
  6. public String studentId;
  7. public String classId;
  8. }

完整代码

  1. import com.fasterxml.jackson.databind.ObjectMapper;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. // 这个类和前端的json要匹配
  9. class Student {
  10. // 这里的成员要么用public修饰
  11. // 如果用其他修饰符修饰,就必须提供对应的getter和setter方法
  12. // 否则jackson就无法获取到成员,也就无法给其解析赋值
  13. public String studentId;
  14. public String classId;
  15. }
  16. @WebServlet("/postParameter2")
  17. public class TestPostParameter2 extends HttpServlet {
  18. @Override
  19. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  20. // 该类是使用jackson的核心类
  21. ObjectMapper objectMapper = new ObjectMapper();
  22. // 这个readValue是把请求流中解析然后变成指定的Java类
  23. Student student = objectMapper.readValue(req.getInputStream(), Student.class);
  24. // 在服务器这里打印日志
  25. System.out.println("studentId: " + student.studentId + " studentClass: " + student.classId);
  26. }
  27. }

 抓包结果

服务器

 


HttpServletRespond类

上面的代码中或多或少已经使用到了这个类,这个类就是服务器给客户端返回响应用的。

核心方法

方法说明
void setStatus(int sc)设置响应状态码
void setHeader(String name, String value)设置名称为name值为value的头部,如果name已经存在,覆盖旧的,添加新的键值对
void addHeader(String name, String value)添加名称为name值为value的头部,如果name已经存在,不覆盖旧的,添加成新的键值对
void setContentType(String type)设置响应内容的格式(同时也可以设置字符编码集,在type字符串中,使用分号和前面的格式字符串隔开)
void setCharacterEncoding(String charset) 设置字符编码集。如果不设置,浏览器则会随机选一个编码集,这样可能出现乱码
void sendRedirect(String location) 发送重定向的URL到浏览器
PrintWriter getWriter() 往正文中写文本格式数据
OutputStream getOutputStream()往正文中写二进制格式数据

①状态码和响应头的位置要放到 getWriter和getOutputStream方法前面,否则可能会失效。

②setContentType 和setCharacterEncoding 要也要放到前面,否则会不生效。

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/testRespond")
  8. public class TestHttpServletRespond extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. // 使用query string 来给后端传参数
  12. String sId = req.getParameter("studentId");
  13. String cId = req.getParameter("classId");
  14. // 如果成功 默认是200,不设置也可以
  15. resp.setStatus(200);
  16. // 这里设置响应内容的格式 同时也设置了字符集
  17. resp.setContentType("text/html; charset = utf8");
  18. // 给浏览器返回正文响应
  19. StringBuilder stringBuilder = new StringBuilder();
  20. stringBuilder.append("学生ID:" + sId + "
    "
    + "学生班级:" + cId);
  21. resp.getWriter().write(stringBuilder.toString());
  22. }
  23. }

测试重定向

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet("/ReDirect")
  8. public class TestReDirect extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. // 重定向状态码是 302
  12. resp.setStatus(302);
  13. // 转到bing
  14. resp.sendRedirect("https://cn.bing.com");
  15. }
  16. }

 

 


有什么错误评论区指出。希望可以帮到你。 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索