在页面加载时从JSP文件调用一个servlet

我可以从JSP文件中调用一个servlet而不使用HTML表单吗?

例如,在页面加载期间显示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等)之后才可用,另请参阅使用Tomcat 7进行的@WebServlet注释 。 如果你不能升级,或者由于某种原因需要使用与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部署的上下文path, /products是servlet的URL模式。 如果你碰巧在里面有任何HTML <form> ,那么只要让它POST到当前的URL,像<form method="post">然后把doPost()添加到同一个servlet来执行后处理工作。 继续下面的链接,以获得更具体的例子。

也可以看看

  • 我们的Servlets wiki页面
  • doGet和doPost在Servlets中
  • 如何避免JSP中的Java代码
  • 开始和中间的JSP / Servlet教程

您将需要使用RequestDispatcher的方法forward / include根据您的要求来实现相同。

在JSP中,您需要使用以下标签:

jsp:include :

该元素允许您在JSP文件中包含静态或dynamic文件。 包含静态和dynamic文件的结果是完全不同的。 如果该文件是静态的,则其内容将包含在调用JSP文件中。 如果该文件是dynamic的,则它将作用于请求并返回包含在JSP页面中的结果。 当include操作完成时,JSP容器继续处理JSP文件的其余部分。

例如

 <jsp:include page="/HandlerServlet" flush="true"> 

jsp:转发 :

元素将包含客户端请求信息的请求对象从一个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

当然可以,只需将其包含在formaction中即可。 但是您必须编写正确的doPostdoGet来处理请求!

如果你想调用一个特定的servlet方法,也可以使用expression式语言。 例如,您可以执行如下操作:

Servlet的

 ForexTest forexObject = new ForexTest(); request.setAttribute("forex", forexObject); 

JSP

 <body bgcolor="#D2E9FF"> Current date : ${forex.rate} </body>