为什么我需要servlet的Map或注解,而不是jsp?

eyh26e7m  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(392)

为了向servlet发出请求,我需要在xml文件中使用Map,或者为给定的servlet添加注解。但是为什么不要求我对jsp文件也这样做呢?我将举例说明。
这是怎么回事?
索引.html:

<html><body>

    <form action="result.jsp">
        <button>go</button>
    </form>

</body></html>

result.jsp:

<html><body>
hello
</body></html>

注意,我不必使用任何xmlMap或注解。它只是“找到”了它。
但这怎么行不通呢?
索引.html:

<html><body>

    <form action="com.example.MyServlet">
        <button>go</button>
    </form>

</body></html>

com.example.myservlet公司:

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter pw = resp.getWriter();
        resp.setContentType("text/html");

        pw.println("hello");

    }
}

在这里,我得到一个错误:请求的资源[/testproject/com.example.myservlet]不可用。怎样?为什么我不需要使用xml,也不需要为jsp使用注解,而需要为servlet使用注解呢?当jsp最终变成servlet时,它们不应该以同样的方式工作吗。那么为什么会有不同的行为呢?我知道我错过了什么,我只是不知道。。。

ou6hu8tu

ou6hu8tu1#

为什么我需要servlet的Map或注解,而不是jsp?
正如上面@sotiriosdelimanolis的评论所指出的,这并不是实际发生的事情。jsp最终会变成一个servlet,其行为类似于您自己定义的任何其他servlet。当您定义一个servlet时,您还需要添加一个urlMap,以便将url路径解析为一个servlet,该servlet可以响应对该url的请求。
唯一的区别是,对于jsp文件,这个Map是由servlet容器隐式完成的。对于您定义的servlet,显然需要定义自己的Map,因为服务器不知道您想在自己的应用程序中使用servlet做什么。
规格说明如下(重点):
web组件可以是servlet或jsp页面。web.xml部署描述符中的servlet元素用于描述这两种类型的web组件。jsp页面组件通过使用implicit.jsp扩展Map在部署描述符中隐式定义,或者通过使用jsp组元素显式定义。

[…]jsp页翻译成一个实现类加上部署信息。部署信息指示所需的支持类以及到jsp页面的原始url路径与该页面的jsp页面实现类的url之间的Map。
因此,基本上,您的jsp被翻译成一个servlet,并创建一个从原始jsp页面位置路径到由此生成的servlet的Map。
jsp实际上没有执行。执行的是从jsp生成的servlet。您必须意识到jsp是为了方便而提供的。如果你想从一个servlet生成html,你必须做一大堆的工作 out.write("<html>"); out.write("\r\n"); 以此类推,用于整个html页面。它不仅非常容易出错,而且这样做会让你发疯。因此,可以选择提供一个jsp,并结合在幕后完成的事情,以使其能够正常工作。

相关问题