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

核心方法

Servlet核心API_第1张图片

init

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

Servlet核心API_第2张图片

destory

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

Servlet核心API_第3张图片

停止服务器的方法不同,可能会对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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        resp.getWriter().write("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        resp.getWriter().write("doPost");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPut");
        resp.getWriter().write("doPut");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doDelete");
        resp.getWriter().write("doDelete");

    }
}

Servlet核心API_第4张图片

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

1.通过postman得到请求

Servlet核心API_第5张图片

Servlet核心API_第6张图片

2.通过ajax得到请求

Servlet核心API_第7张图片注意:test.html放在webapp下

编写HTML代码:

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




    
    
    Document


    
    
    
    

HttpServletRequest

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

常见方法

Servlet核心API_第8张图片

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 {
    @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("
"); stringBuilder.append(req.getMethod()); stringBuilder.append("
"); stringBuilder.append(req.getRequestURL()); stringBuilder.append("
"); stringBuilder.append(req.getContextPath()); stringBuilder.append("
"); stringBuilder.append(req.getQueryString()); stringBuilder.append("
"); resp.getWriter().write(stringBuilder.toString()); } }

Servlet核心API_第9张图片

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

Servlet核心API_第10张图片

前端给后端传参

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 {
    @Override
    protected 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);
    }
}

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

Servlet核心API_第11张图片

2.POST,form

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

前端

Servlet核心API_第12张图片

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

Servlet核心API_第13张图片

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

Servlet核心API_第14张图片

前后端交互过程:前端通过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内容构造成一个响应的结果返回给浏览器。

Servlet核心API_第15张图片

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 {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过这个方法处理json格式的数据
        //直接把req对象里body完整的读取出来
        //getInputStream
        //在这个流对象中读多少个字节取决于Content-length
        int 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引入第三方库

Servlet核心API_第16张图片

Servlet核心API_第17张图片

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



    com.fasterxml.jackson.core
    jackson-databind
    2.14.1

代码:

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 {
    @Override
    protected 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);
  }
}

Servlet核心API_第18张图片

Servlet核心API_第19张图片

小结:

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

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

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

HttpSeverletResponse

Servlet核心API_第20张图片

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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应的状态码
        resp.setStatus(404);
        resp.setContentType("text/html;charset=utf8");
        //设置响应的内容
        resp.getWriter().write("

404没找到!

"); } }

Servlet核心API_第21张图片

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

Servlet核心API_第22张图片

你可能感兴趣的:(JavaEE,web,servlet)