我可以在不使用HTML表单的情况下从JSP文件调用servlet吗?
例如,要在页面加载期间显示HTML表格中的数据库结果。
答案 0 :(得分:9)
您可以使用servlet的doGet()
方法预处理请求并将请求转发给JSP。然后在链接和浏览器地址栏中指向servlet URL而不是JSP URL。
E.g。
@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到当前网址,并在同一个servlet中添加doPost()
来执行后处理工作。继续以下链接,了解更具体的例子。
答案 1 :(得分:8)
您需要根据您的要求使用RequestDispatcher的方法转发/包含。
在JSP中,您需要使用以下标记:
元素允许你 包括静态或动态 文件在JSP文件中。结果 包括静态和动态文件 很不一样。如果文件是 静态,其内容包含在 调用JSP文件。如果文件是 动态,它作用于请求和 发回包含的结果 在JSP页面中。当包括 动作完成后,JSP容器 继续处理剩余的 JSP文件。
e.g。
<jsp:include page="/HandlerServlet" flush="true">
该元素转发 请求包含客户端的对象 从一个JSP文件请求信息 到另一个文件。目标文件可以 是一个HTML文件,另一个JSP文件,或 一个servlet,只要它在 相同的应用程序上下文 转发JSP文件。中的线 源JSP文件之后 元素不是 处理。
e.g。
<jsp:forward page="/servlet/ServletCallingJsp" />
检查高级JSP示例:JSP-Servlet通信:
http://www.oracle.com/technology/sample_code/tech/java/jsps/ojsp/jspservlet.html
答案 2 :(得分:0)
当然,您可以将其添加到action
的{{1}}中。但是你必须写出正确的form
或doPost
来处理请求!
答案 3 :(得分:0)
如果要调用特定的servlet方法,也要使用表达式语言。例如,您可以执行以下操作:
<强>的Servlet 强>
ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);
<强> JSP 强>
<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>