【发布时间】:2010-09-07 18:07:11
【问题描述】:
我是 servlet 和 JSP 的新手。我正在尝试从 jsp 调用记录器 servlet。要求是 servlet 将控制权返回给 jsp(在记录事件之后)。 servlet 需要是透明的,即根据性能可能会关闭日志记录功能。
JSP:INCLUDE 是唯一的方法吗?还有其他方法吗?
谢谢,
温斯顿。
【问题讨论】:
-
这个 logger servlet 会做什么?
我是 servlet 和 JSP 的新手。我正在尝试从 jsp 调用记录器 servlet。要求是 servlet 将控制权返回给 jsp(在记录事件之后)。 servlet 需要是透明的,即根据性能可能会关闭日志记录功能。
JSP:INCLUDE 是唯一的方法吗?还有其他方法吗?
谢谢,
温斯顿。
【问题讨论】:
您不能直接从 JSP 调用 servlet。但是,您可以发送redirect。这将告诉浏览器它应该在另一个位置寻找资源。
来自 JSP
<%
String destination ="/jsp/destination.jsp";
response.sendRedirect(response.encodeRedirectURL(destination));
%>
来自 Serlet
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String destination ="/jsp/destination.jsp";
response.sendRedirect(response.encodeRedirectURL(destination));
}
}
如果您的目的是“记录”,您应该使用Filter。 Filter 就像一个轻量级 servlet,它不会生成自己的内容,而是插入到请求处理过程中,并在正常的页面处理之外执行。
强烈建议以MVC 模式的方式使用Servlet/JSP。它将应用程序的数据、用户界面和控制逻辑分成三个独立的实体。该请求由 Servlet(控制器)处理,该 Servlet 将初始化满足用户请求所需的任何 JavaBean(模型)。然后,Servlet(控制器)会将包含 JavaBean(模型)的请求转发到仅包含 HTML 和 JSTL 语法的 JSP(视图)页面。
【讨论】:
<jsp:include>,正如 OP 已经提到的那样。另一种(更多的前端控制器模式)方法是首先调用 servlet 而不是 JSP,然后在 doGet() 方法中对 JSP 执行 RequestDispatcher#forward(),正如您后面提到的那样。但毕竟,OP 在这里肯定需要Filter :)