繁体   English   中英

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

[英]Calling a servlet from JSP file on page load

我可以在不使用 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 文件的剩余部分。

例如

<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

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

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

小服务程序

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

JSP

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM