【问题标题】:Calling a servlet from JSP file on page load在页面加载时从 JSP 文件调用 servlet
【发布时间】:2021-01-27 06:18:23
【问题描述】:

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

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

【问题讨论】:

    标签: java jsp servlets onload


    【解决方案1】:

    您可以使用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 &lt;form&gt;,那么只需让它像 &lt;form method="post"&gt; 一样将其 POST 到当前 URL,并将 doPost() 添加到同一个 servlet 以执行后处理工作。继续下面的链接以获取更多具体示例。

    另见

    【讨论】:

    • 问题是从 JSP 调用 Servlet。您已回答从 servlet 调用 JSP。
    • ...这是 OP 所考虑的功能要求的正常做法。
    • 你怎么能如此确定 OP 的想法?
    • “不使用 HTML 表单”,所以他想对请求进行预处理而不是后处理。
    【解决方案2】:

    您将需要根据您的要求使用 RequestDispatcher 的方法转发/包含来实现相同的目标。

    在 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        Servlet

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

        JSP

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

        【讨论】:

        • 请注意,您的回答有点误导,这暗示ForexTest 需要是一个servlet,但它根本不需要是一个servlet。通常的做法是,它是一个 Javabean,那些get 方法应该被调用来访问属性,而不是执行业务逻辑。
        猜你喜欢
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多