程序员的知识教程库

网站首页 > 教程分享 正文

Servlet总结十:HttpServlet(程序包javax.servlet.http不存在)

henian88 2024-08-15 21:56:20 教程分享 14 ℃ 0 评论

为了使前后端的请求方式相同,我们需要在后端获取请求方式,然后进行判断前端发送的请求是否为规定的请求方式,如果不是规定的请求方式,就会报错;

为了实现上述功能,此功能的代码需要在每一个Servlet类中都需要编写,怎么能封装一下,以后在每一个具体的Servlet类中不写这样的代码了,但是还是能够达到同样的效果?


1、自定义的HttpServlet类,解决判断前后端请求方式是否一致的问题

public class HttpServlet extends GenericServlet {
    /**
     *  此方法为原始service()方法,方法内将ServletRequest、ServletResponse强转为带有http的接口
     *  然后调用重载的service(HttpServletRequest, HttpServletResponse)方法
     *  所以此方法我们无需进行重写
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        service(request,response);
    }

    /**
     * 此方法获取请求方式后进行判断,
     * 如果是GET请求就执行doGet()
     * 如果是POST请求就执行doPost()
     * 此方法没有理由重写,只需要将业务代码写在doGet()或doPost()方法中即可
     */
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String method = request.getMethod();
        if("POST".equals(method)) {
            doPost(request, response);
        } else if("GET".equals(method)) {
            doGet(request, response);
        }
    }

    /**
     * 我们需要什么请求时,子类继承此父类就应当重写对应的doGet()或者doPost()方法之一
     * 在doGet()或者doPost()方法内写业务代码,即将原来的service()内的业务代码写到doXXX()中
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("应当发送GET请求");
        throw new RuntimeException("应当发送GET请求");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("应当发送POST请求");
        throw new RuntimeException("应当发送POST请求");
    }
}

当有了HttpServlet类之后,写一个login类(Servlet)来继承HttpServlet类试试

public class login extends cn.test.HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("登陆成功!");
    }
}

当Tomcat服务器启动并且通过浏览器访问此Servlet对应的页面时,Tomcat会执行login类,假设login类需要的是POST请求,所以我们将继承自父类的doPost()重写为我们需要的业务代码,执行顺序为:

  • 假设前端发送的是POST请求

1、service(ServletRequest, ServletResponse) 将两个参数强转为带有Http的接口,之后执行

2、service(HttpServletRequest, HttpServletResponse)获取请求方式POST并通过判断执行重写的doPost()方法doPost(HttpServletRequest, HttpServletResponse) 执行业务代码

  • 假设前端发送的是GET请求

1、service(ServletRequest, ServletResponse) 将两个参数强转为带有Http的接口,之后执行

2、service(HttpServletRequest, HttpServletResponse)获取请求方式GET并通过判断执行未被重写的doGet()方法

3、doGet() 报错,将错误信息输出到控制台和前端页面

所以,我们的Servlet继承HttpServlet后,后端需要的是什么请求,那么我们就重写对应的doPost()/doGet()方法,方法内是我们的业务代码,并不需要重写service()方法


官方的HttpServlet

实际上SUN公司为我们提供了一个类来解决判断前后端请求方式是否一致的类javax.servlet.http.HttpServlet

此类和我们自定义的HttpServlet类的使用方法和原理类似,所以总结如下的使用方法和注意

  1. 我们的Servlet继承HttpServlet后,后端需要的是什么请求,那么我们就重写对应的doPost()/doGet()方法
  2. doPost()/doGet()方法内就是我们的业务代码,doXXX()可以看作main()方法
  3. 代码不在service()内编写了,不需要重写service()方法
  4. HttpServlet中重载的两个service()方法并不需要也没有理由去重写这两个方法
  5. 当浏览器发送的请求方式和后台处理方式不同时,会出现一个错误,代号:405

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表