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

8

我能否在不使用HTML表单的情况下从JSP文件调用Servlet?

例如,在页面加载期间在HTML表格中显示数据库结果。

4个回答

11
你可以使用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是Web应用程序的部署上下文路径,/products是Servlet的URL模式。 如果您在其中有任何HTML <form>,则只需让其POST到当前URL,如下所示:<form method="post">并向相同的servlet添加doPost()以执行后处理作业。 有关更多具体示例,请继续以下链接。

另请参阅


3
问题是如何从JSP调用Servlet,您之前回答的是如何从Servlet调用JSP。 - YoK
1
这是OP所考虑的功能要求的正常做法。 - BalusC
你怎么能如此确定 OP 在想什么呢? - Ladlestein
1
"不使用HTML表单",因此他想要预处理请求而不是后处理它。 - BalusC

9
你需要使用RequestDispatcher的forward/include方法,具体取决于您的需求来实现相同的功能。
在JSP中,您需要使用以下标签: jsp:include

该元素允许您在JSP文件中包含静态或动态文件。包含静态和动态文件的结果非常不同。如果文件是静态的,则其内容包含在调用JSP文件中。如果文件是动态的,则它会对请求进行操作,并发送回包含在JSP页面中的结果。当包含操作完成后,JSP容器将继续处理剩余的JSP文件。

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

jsp:forward

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


0
如果您想调用特定的servlet方法,您还可以使用表达式语言。例如,您可以这样做:
Servlet
ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);

JSP

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

注意,你的回答有点误导性,它暗示了 ForexTest 需要是一个 servlet,但实际上它完全不需要成为一个 servlet。通常的做法是将其作为一个 Javabean,并且那些 get 方法应该仅仅被调用来访问属性,而不是执行业务逻辑。 - BalusC

0
当然可以,只需将其包含在表单的“action”中即可。但是您必须编写正确的“doPost”或“doGet”来处理请求!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接