为什么我需要Servlet的映射或注释,而不需要JSP



要向Servlet发出请求,我需要在XML文件中使用映射,或者为给定的Servlet添加注释。但是,为什么我不需要对JSP文件也执行同样的操作呢?我将举例说明。

这是如何工作的

index.html:

<html><body>

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

</body></html>

result.jsp:

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

请注意,我不必使用任何XML映射或注释。它只是";发现";

但这怎么不起作用

index.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时,它们不应该以同样的方式工作吗。那么,为什么会有不同的行为呢?我知道我错过了什么,我只是不知道。。。

为什么我需要Servlet的映射或注释,而不需要JSP?

正如@SotiriosDelimanolis在上面的评论中所指出的,这并不是实际发生的事情。JSP最终会变成servlet,其行为与您自己定义的任何其他servlet类似。定义servlet时,还需要添加一个URL映射,以便将URL路径解析为一个servlet,该servlet可以响应对该URL的请求。

唯一的区别是,对于JSP文件,这种映射是由servlet容器隐式完成的。对于您定义的servlet,您显然需要定义自己的映射,因为服务器不知道您想在自己的应用程序中对servlet做什么。

规范说明如下(强调矿(:

web组件是servlet或JSP页面。web.xml部署描述符中的servlet元素用于描述这两种类型的web组件JSP页面组件通过使用隐式.JSP扩展映射在部署描述符中隐式定义,或者通过使用JSP组元素显式定义。

〔…〕JSP页面被翻译成一个实现类和部署信息。部署信息指示所需的支持类,以及指向JSP页面的原始URL路径和该页面的JSP页面实现的URL之间的映射类。

因此,基本上,您的JSP被翻译成servlet,并创建从原始JSP页面位置路径到由此生成的servlet的映射。

JSP实际上并没有被执行。执行的是从JSP生成的servlet。您必须意识到,提供JSP是为了方便。如果你想从servlet生成HTML,你必须为你的整个HTML页面做一大堆out.write("<html>"); out.write("rn");等等。它不仅非常容易出错,而且这样做会让你发疯。

最新更新