当前位置: 首页 > news >正文

Servlet核心API

目录

HttpServlet

init

destory

service

实例:处理get、post、put、delete请求 

1.通过postman得到请求

2.通过ajax得到请求

HttpServletRequest

常见方法

前端给后端传参

1.GET,query string

2.POST,form

3.POST,json

HttpSeverletResponse

setStatus


HttpServlet

核心方法

init

init:首次收到和该类相关联的请求的时候调用一次,后面再次出现该请求不再重复。

destory

HttpServlet实例不再使用的时候调用一次。

停止服务器的方法不同,可能会对destroy的使用有影响,因此一般不推荐使用destroy。

service

收到HTTP请求就会触发,doGet在service中调用。

扩充:servlet的生命周期

1.开始的时候,执行init

2.每次收到请求执行service

3.销毁之前,执行destroy

实例:处理get、post、put、delete请求 

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/method")
public class MethodServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");resp.getWriter().write("doGet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");resp.getWriter().write("doPost");}@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPut");resp.getWriter().write("doPut");}@Overrideprotected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doDelete");resp.getWriter().write("doDelete");}
}

在浏览器只能得到第一个get请求的内容。在postman中可以选择得到不同的请求结果。

1.通过postman得到请求

2.通过ajax得到请求

注意:test.html放在webapp下

编写HTML代码:

修改Ajax中的type的值,就可以得到不同的请求。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=<device-width>, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 使用这个界面来构造ajax请求 --><!-- 引入jQuery --><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script>$.ajax({type:'get',// 相对路径的写法// url:'method',// 绝对路径的写法url:'/hello_servlet2/method',success:function(body,status){console.log(body);}});</script>
</body>
</html>

HttpServletRequest

这个对象是tomcat自动构造的,tomcat会实现监听窗口,接受连接,读取请求,解析请求,构造请求对象等一系列工作。

常见方法

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/showRequest")
public class ShowRequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//响应里的数据格式是什么样的resp.setContentType("text/html");StringBuilder stringBuilder=new StringBuilder();stringBuilder.append(req.getProtocol());stringBuilder.append("<br>");stringBuilder.append(req.getMethod());stringBuilder.append("<br>");stringBuilder.append(req.getRequestURL());stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");resp.getWriter().write(stringBuilder.toString());}
}

 //获取header中的所有键值对Enumeration<String> headerNames=req.getHeaderNames();while (headerNames.hasMoreElements()){String headerName=headerNames.nextElement();stringBuilder.append(headerName+":"+req.getHeader(headerName));stringBuilder.append("<br>");}resp.getWriter().write(stringBuilder.toString());

前端给后端传参

1.GET,query string

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//预期浏览器会发送一个形如/getParameter?studentId=10&classId=20的请求//getParameter得到的是String类型的结果String studentId= req.getParameter("studentId");String classId=req.getParameter("classId");resp.setContentType("text/html");resp.getWriter().write("studentId="+studentId+" classId="+classId);}
}

?后的内容是手打的,之后按下回车才会有以下的显示。

2.POST,form

对于前端是form表单这样格式的数据,后端也用getParameter来获取。使用getParameter既可以获取到query string中的键指对,也可以获取到form表单构造的body中的键值对。

前端

前端提交后只能得到404,具体的进程通过fiddler来查看。

后端代码完成后可以在浏览器页面显示出来

前后端交互过程:前端通过form表单提交值到tomcat服务器,然后tomcat构造req和resp对象,值存在req对象中,然后通过req的方法调用其中的值,通过resp编写响应,写回到tomcat,tomcat发送响应给浏览器显示。

3.POST,json

postman构造出一个post请求,body就是json数据。请求到达tomcat,tomcat解析成request对象,在服务器的servlet代码中,req.getInputStream读取body的内容,再把body内容构造成一个响应的结果返回给浏览器。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过这个方法处理json格式的数据//直接把req对象里body完整的读取出来//getInputStream//在这个流对象中读多少个字节取决于Content-lengthint length= req.getContentLength();byte[] buffer=new byte[length];InputStream inputStream=req.getInputStream();inputStream.read(buffer);//把这个字节数组构造成String,打印出来String body= new String(buffer,0,length,"utf8");System.out.println("body="+body);resp.getWriter().write(body);}
}

通过json传递数据,只能得到body的值,但没有按照键值对的方式来处理,而form表单是可以的。这时候json方式处理可以使用第三方库Jackson。

通过maven引入第三方库

将Jackson代码引入到pom.xml依赖中

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.1</version>
</dependency>

代码:

import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;class Student{public int studentId;public int classId;
}
@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//使用Jackson使用到的核心对象ObjectMapper objectMapper=new ObjectMapper();//readValue的功能就是把一个json格式的字符串转换成Java对象Student student=objectMapper.readValue(req.getInputStream(),Student.class);System.out.println(student.studentId+","+student.classId);}
}

小结:

1GET,参数通过query string传递,服务器使用req.getParameter方法

2.POST,参数通过body(form表单的格式传递),服务器使用req.getParameter的方法

3.POST,参数通过(json),服务器通过getInputStream读取到body的值(此处可以使用第三方库,完成json格式的解析,此处使用Jackson,核心是使用ObjectMapper这个对象,使用readValue把json格式的字符串转换成Java对象)

HttpSeverletResponse

setStatus

响应设置状态码:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置响应的状态码resp.setStatus(404);resp.setContentType("text/html;charset=utf8");//设置响应的内容resp.getWriter().write("<h1>404没找到!<h1>");}
}

resp.sendError()返回tomcat自带的错误页面

http://www.lryc.cn/news/210842.html

相关文章:

  • crs 维护模式 exclusive mode
  • 【OpenCV实现平滑图像形态学变化】
  • Ubuntu服务器中java -jar 后台运行Spring Boot项目
  • 微服务parent工程和子工程pom文件配置注意
  • STM32G030F6P6点灯闪烁
  • K8s开发人员也需要了解的相关知识
  • 创建并启动华为HarmonyOS本地与远程模拟器及远程真机
  • 责任链模式应用案例
  • 给你一个整数 num ,返回 num 中能整除 num 的数位的数目
  • Java后端开发——房贷计算器(Ajax版、Json版、等额本息+等额本金)
  • 2023.10.28 关于 synchronized 原理
  • 力扣 27. 移除元素
  • redis爆满导致数据丢失
  • Android14 WMS启动流程
  • 磁盘管理(初始化,引导块,坏块管理,固态硬盘)
  • mysql冷拷贝大表
  • 苍穹外卖-01
  • GAMP源码阅读(中)伪距单点定位 SPP
  • Epinoia-有状态网络的意图验证模块,略读
  • 14.力扣c++刷题-->有效括号
  • scrapy-redis分布式爬虫(分布式爬虫简述+分布式爬虫实战)
  • 单目深度估计之图像重构原理解析
  • 【爬虫】charles手机抓包环境设置(设置系统证书)
  • 【flink sql table api】时间属性的指定与使用注意事项
  • 评价模型:CRITIC客观赋权法
  • 两个Tomcat插件配置不同端口,session冲突,同时登录被挤下线问题的解决
  • Mybatis中执行Sql的执行过程
  • IEEE Standard for SystemVerilog—Chapter 25.7 Tasks and functions in interfaces
  • 一台服务器最大能支持多少条 TCP 连接
  • Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022