【发布时间】:2021-01-27 06:18:23
【问题描述】:
我可以在不使用 HTML 表单的情况下从 JSP 文件调用 servlet 吗?
例如,在页面加载期间在 HTML 表格中显示来自数据库的结果。
【问题讨论】:
我可以在不使用 HTML 表单的情况下从 JSP 文件调用 servlet 吗?
例如,在页面加载期间在 HTML 表格中显示来自数据库的结果。
【问题讨论】:
您可以使用servlet 的doGet() 方法预处理 请求并将请求转发给JSP。然后只需在链接和浏览器地址栏中指向 servlet URL 而不是 JSP URL。
例如
@WebServlet("/products")
public class ProductsServlet extends HttpServlet {
@EJB
private ProductService productService;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Product> products = productService.list();
request.setAttribute("products", products);
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
}
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td>${product.description}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>
请注意,JSP 文件放在/WEB-INF 文件夹中,以防止用户在不调用 servlet 的情况下直接访问它。
另请注意,@WebServlet 仅在 Servlet 3.0(Tomcat 7 等)之后才可用,另请参阅@WebServlet annotation with Tomcat 7。如果您无法升级,或者由于某种原因需要使用与 Servlet 3.0 不兼容的 web.xml,那么您需要在 web.xml 中手动注册 servlet,如下所示,而不是使用注释:
<servlet>
<servlet-name>productsServlet</servlet-name>
<servlet-class>com.example.ProductsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>productsServlet</servlet-name>
<url-pattern>/products</url-pattern>
</servlet-mapping>
一旦通过注解或 XML 正确注册了 servlet,现在您可以通过 http://localhost:8080/context/products 打开它,其中 /context 是 webapp 的部署上下文路径,/products 是 servlet 的 URL 模式.如果您碰巧在其中包含任何 HTML <form>,那么只需让它像 <form method="post"> 一样将其 POST 到当前 URL,并将 doPost() 添加到同一个 servlet 以执行后处理工作。继续下面的链接以获取更多具体示例。
【讨论】:
您将需要根据您的要求使用 RequestDispatcher 的方法转发/包含来实现相同的目标。
在 JSP 中你需要使用以下标签:
该元素允许您 包括静态或动态 JSP 文件中的文件。结果 包括静态和动态文件是 很不一样。如果文件是 静态的,其内容包含在 调用 JSP 文件。如果文件是 动态的,它根据请求和 发回包含的结果 在 JSP 页面中。当包括 动作完成,JSP容器 继续处理剩余的 JSP 文件。
例如
<jsp:include page="/HandlerServlet" flush="true">
元素转发 包含客户端的请求对象 从一个 JSP 文件请求信息 到另一个文件。目标文件可以 是 HTML 文件、另一个 JSP 文件或 一个 servlet,只要它在 相同的应用程序上下文 转发 JSP 文件。中的线条 源 JSP 文件后 元素不是 已处理。
例如
<jsp:forward page="/servlet/ServletCallingJsp" />
检查高级 JSP 示例:JSP-Servlet 通信:
http://www.oracle.com/technology/sample_code/tech/java/jsps/ojsp/jspservlet.html
【讨论】:
当然可以,只需将其包含在 action 中的 form 中即可。但是你必须写正确的doPost 或doGet 来处理请求!
【讨论】:
如果你想调用一个特定的 servlet 方法,那么你也可以使用表达式语言。例如,您可以执行以下操作:
Servlet
ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);
JSP
<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>
【讨论】:
ForexTest 需要是一个servlet,但它根本不需要是一个servlet。通常的做法是,它是一个 Javabean,那些get 方法应该只被调用来访问属性,而不是执行业务逻辑。