1.HttpServlet(1)常用的方法
(2)Servlet生命周期
2.HttpServletRequest
(1)常用方法
(2)前后端传叁的各种形式
我们最常用的三个类:HttpServlet、HttpServletRequest、HttpServletResponse
一.HttpServlet
@WebServlet("/hello")
public class Hello_servlet2 extends HttpServlet {
public void init()
{
System.out.println("初始化");
}
public void destroy()
{
System.out.println("destroy");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("hello");
resp.getWriter().write("helloWorld");
}
}
当我们在地址栏输入127.0.0.1:8080/hello_servlet2/hello,这时tomcat就会调用HttpServlet,就会实例化HttpServlet,然后调用init()方法,进行初始化。
当我们再刷新一次页面重新发送这个样的请求,就不会再调用init() 方法了,init()方法只会执行一次
service方法每次收到请求都会调用这个方法,然后根据请求类型再去 调用不同的方法。
destory方法:在服务器终止的时候会被调用,这里的destory能不能被执行到,如果直接通过smart tomcat停止按钮,这个操作本质上是通过tomcat的8005端口,主动停止,能够触发destory(),如果是直接杀进程,此时可能来不及执行destory()。
Servlet的生命周期
1.当我们发送一个http请求的时候,tomcat就会实例化HttpServlet,并调用init()方法,init()方法只执行一次
2.然后调用service()方法,根据请求类型转发给不同的方法处理,如doGet()方法,doPost()方法等
3.最后服务器终止的时候调用destory()方法,进行清理操作,该方法只调用一次,随后JVM回收资源。
二.HttpServletRequest类
HttpServletRequest这个类的对象,表示的是Http请求,这个对象是Tomcat自动构造的,tomcat会实现监听端口,解析请求,构造请求
下面我们一起来看一下HttpServletRequest这个类提供的方法
@WebServlet("/show")
public class Showservlet extends HttpServlet {
@Override
protected 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.getRequestURI());
stringBuilder.append("<br>");
stringBuilder.append(req.getContextPath());
stringBuilder.append("<br>");
stringBuilder.append(req.getQueryString());
stringBuilder.append("<br>");
//获取首行当中所有的键对值
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());
}
}
当我们发送一个这样的请求的时候
这是抓包时其请求报文
下面我们再来看一下我们最终返回给浏览器的内容
下面我们重点讲一下前段给后端传叁的三种形式
第一种形式:GET,通过query string
第二种形式:post ,然后通过form表单的形式
第三种形式:post.通过json的形式
我们先来看第一种:
@WebServlet("/paramter")
public class getParamter extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String aa=req.getParameter("aa");
String bb=req.getParameter("bb");
resp.setContentType("text/html");
resp.getWriter().write("aa="+aa+" "+"bb="+bb);
}
}
在这里我们是通过getParameter()的方法可以获取到query string中的键值对,也可以获取到form表单构造的body中的键值对
第二种:form表单的形式
:
@WebServlet("/pat")
public class pare extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String aa=req.getParameter("aa");
String bb=req.getParameter("bb");
resp.setContentType("text/html");
resp.getWriter().write("aa="+aa+" "+"bb="+bb);
}
}
下面我们来看一下他们之间的对应关系
第三种:json格式
我们用postman来发送一个post请求
后端代码:
@WebServlet("/json")
public class jsonServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int length= req.getContentLength();
byte[]arr=new byte[length];
InputStream inputStream=req.getInputStream();
inputStream.read(arr);
String result=new String(arr,0,length);
System.out.println(result);
resp.setContentType("application/json;charset=utf8");
resp.getWriter().write(result);
}
}
观察这里的后端代码我们可以知道,当前通过json传输数据 ,但是服务器这边是把整个body读出来,没有按照键值对的方式来处理(还不能根据key获取value),form表单是可以根据key来获取value,为了可以用键值对的方式来处理,我们使用第三方库,jackson,spring mvc,支持json格式的数据,内置了jackson这个库来解析json格式。我们通过maven来引入第三方库,在pom.xml把这段依赖给加上
class Geshi{
public int aa;
public int bb;
}
@WebServlet("/json")
public class pare extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//json涉及到的核心对象
ObjectMapper objectMapper=new ObjectMapper();
//readValue把json格式的字符串转换成java对象
Geshi result=objectMapper.readValue(req.getInputStream(),Geshi.class);
System.out.println(result.aa+","+result.bb);
}
}