为啥我不能“直接”从 HTML 调用 Servlet? [复制]

Posted

技术标签:

【中文标题】为啥我不能“直接”从 HTML 调用 Servlet? [复制]【英文标题】:Why I can't "directly" call Servlet from HTML? [duplicate]为什么我不能“直接”从 HTML 调用 Servlet? [复制] 【发布时间】:2021-03-24 04:05:22 【问题描述】:

作为 JSP 和 Servlet 的初学者,我学习了两种从 html 文件调用 Servlet 的方法。一种是使用servlet annotation,另一种是使用XML的映射配置。请原谅我的无知,但是为什么我不能在表单的 action attribute 中简单地写下 Servlet 的名称呢?迫使我们开发人员特别关注 Servlet 的“curton”背后发生了什么?不像 HTML 和 JSP 文件我们可以直接调用。

这就是我要说的。或者,为什么简单地这样做是不正确的:

index.html:

<html><body>
    <form action="MyServlet" method="POST">
        Enter name: <input type="text" name="name">
        <button>Submit name</button>
    </form>
</body></html>

MyServlet.java:

public class MyServlet extends HttpServlet 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        PrintWriter pw = resp.getWriter();
        String input = req.getParameter("name");
        pw.println("hello " + input);
    

我了解映射servlet 为我们提供了灵活性和安全性。但我的问题仍然存在。为什么“直接调用”Servlet 类文件不可用并给出404 error not found?为什么 server 找不到我的 servlet

【问题讨论】:

服务器需要知道哪个 URL 指向哪个 servlet。这就是为什么您需要通过添加 @WebServlet 注释或在 web.xml 中声明它的原因。否则如何知道它必须在哪个包中寻找 servlet ?如果在 2 个不同的包中有 2 个具有相同名称的类怎么办?这就是您需要映射的原因 这在上个世纪曾经是可能的,后来发现这是一个巨大的安全漏洞,所以不再可能了。见上面链接的副本。 【参考方案1】:

您的 HTML 页面正在用户的浏览器中呈现,并在一个进程中运行。您的 servlet 正在 servlet 引擎、JVM、不同的进程中运行,并且可能在不同的计算机上运行。

它们可以通信的唯一方式是通过从浏览器到 servlet 引擎的 HTTP 请求。

浏览器无法在JVM中查找类,只能盲目的向HTML中渲染的URL发送HTTP请求,希望servlet引擎响应。

可能会提供一个 servlet,它根据 HTTP 请求的参数中给出的类名发送 HTTP 请求,然后它会执行您的建议。

【讨论】:

以上是关于为啥我不能“直接”从 HTML 调用 Servlet? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数? [复制]

Javafx怎么播放flash,就是我用Java main函数执行,直接调用Javafx做好的页面,为啥不能播放flash

为啥我们不能从 sql 调用过程

为啥不能直接调用run()方法呢?

为啥我不能从内部调用一个类的 start 函数?

为啥我不能从保护模式调用 BIOS 中断?