首页 > 解决方案 > 为什么不使用 service() 而不是 doPost() 和 doGet()?

问题描述

我对 Java 很陌生。我有一个运行良好的脚本,但我想了解它背后的逻辑。

如果用户输入他的用户名,我想输出相同的。

我在用

protected void service(HttpServletRequest req, HttpServletResponse resp)

但从我看到的许多教程中

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

doGet()我想我理解和之间的区别doPost()。他们都将被方法调用service()。那么,如果我可以简单地使用,我为什么要使用doGet()and呢?doPost()service()

我的整个代码如下所示:

package ch.yourclick.zt;

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.PrintWriter;

@WebServlet("/login")
public class Login extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        out.print(req.getParameter("username"));
    }
}

标签: javajsp

解决方案


如果您覆盖service您的 servlet 将处理所有请求方法 ( GET, POST, ...)。这些请求方法具有不同的含义,并且期望以不同的方式运行,请参阅HTTP 请求方法

因此,您的 servlet 将无法为其中一些返回正确的响应,并且您的 servlet 的用户可能会感到困惑,例如,为什么 a 的DELETE行为方式与 a 相同GET,并且实际上并未修改源代码。

此外,根据您的 servlet 所做的事情,它可能会引入安全漏洞,例如当您的 servlet(它也处理GET)修改数据库时。


推荐阅读