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

时间:2010-08-28 13:47:06

标签: java jsp servlets onload

我可以在不使用HTML表单的情况下从JSP文件调用servlet吗?

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

4 个答案:

答案 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:include

  

元素允许你   包括静态或动态   文件在JSP文件中。结果   包括静态和动态文件   很不一样。如果文件是   静态,其内容包含在   调用JSP文件。如果文件是   动态,它作用于请求和   发回包含的结果   在JSP页面中。当包括   动作完成后,JSP容器   继续处理剩余的   JSP文件。

e.g。

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

jsp:forward

  

该元素转发   请求包含客户端的对象   从一个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}}中。但是你必须写出正确的formdoPost来处理请求!

答案 3 :(得分:0)

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

<强>的Servlet

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

<强> JSP

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