我能否在不使用HTML表单的情况下从JSP文件调用Servlet?
例如,在页面加载期间在HTML表格中显示数据库结果。
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
是Web应用程序的部署上下文路径,/products
是Servlet的URL模式。 如果您在其中有任何HTML <form>
,则只需让其POST到当前URL,如下所示:<form method="post">
并向相同的servlet添加doPost()
以执行后处理作业。 有关更多具体示例,请继续以下链接。
例如:该元素允许您在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
ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);
JSP
<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>
ForexTest
需要是一个 servlet,但实际上它完全不需要成为一个 servlet。通常的做法是将其作为一个 Javabean,并且那些 get
方法应该仅仅被调用来访问属性,而不是执行业务逻辑。 - BalusC