Servelt api

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);


    }
}

 

猜你喜欢

转载自blog.csdn.net/m0_70386582/article/details/129817944
API