【问题标题】:How to call servlet on jsp page load [duplicate]如何在jsp页面加载时调用servlet [重复]
【发布时间】:2014-07-26 19:28:00
【问题描述】:

我想在加载index.jsp 页面时调用一个servlet latest_products。这个servlet 在List 中有记录。我想将此List<products> 传递给index.jsp。但我不想在 url 中显示 servlet 的名称。有什么办法可以做到这一点。

【问题讨论】:

  • 您可以使用 Ajax。
  • @developerwjk 这不是一个好主意,它会向服务器发出两个请求:1)对页面的 GET 请求,2)对 servlet 的 GET 请求。
  • 这里介绍了您的问题的解决方案:StackOverflow Servlets wiki,Hello World #2(预处理请求)部分。

标签: java jsp jakarta-ee servlets


【解决方案1】:

解决方案 1

要遵循的步骤:

  • 使用jsp:include从JSP调用Servlet,它将在运行时将Servlet的响应包含在JSP中
  • 在Servlet中设置请求中的属性,然后在JSP中简单读取

示例代码:

JSP:

<body>
    <jsp:include page="/latest_products.jsp" />
    <c:out value="${message }"></c:out>
</body>

小服务程序:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {            
    request.setAttribute("message", "hello");
}

编辑

但我不想在 url 中显示 servlet 的名称。

只需在web.xml 中为Servlet 定义一个不同且有意义的url-pattern,如下所示,它看起来像一个JSP 页面,但在内部它是一个Servlet。

web.xml:

<servlet>
    <servlet-name>LatestProductsServlet</servlet-name>
    <servlet-class>com.x.y.LatestProductsServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LatestProductsServlet</servlet-name>
    <url-pattern>/latest_products.jsp</url-pattern>
</servlet-mapping>

解决方案 2

要遵循的步骤:

  • 第一次调用 Servlet
  • 加工最新产品
  • 在请求属性中设置列表
  • 将请求转发到 JSP,在 JSP 中可以使用 JSTL 轻松访问它

示例代码:

小服务程序:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {            
    request.setAttribute("message", "hello");
    RequestDispatcher view=request.getRequestDispatcher("index.jsp");
    view.forward(request,response);
}

index.jsp:

<body>      
    <c:out value="${message }"></c:out>
</body>

点击 URL:scheme://domain:port/latest_products.jsp,它将调用 Servlet 的 doGet() 方法。

【讨论】:

  • 我将展示如何在不使用 URL 中的 servlet 名称的情况下执行此操作。
  • @LuiggiMendoza 现在我明白了,谢谢。
  • @LuiggiMendoza 顺便说一句,使用 serlvet 名称的问题在哪里。我们可以将它定义为&lt;url-pattern&gt;/latest_products.jsp&lt;/url-pattern&gt;,看起来就像是在访问一个jsp页面。
  • 是的,我期待您的编辑。但你没有。相反,您继续使用 2 GET 请求方法,我仍然认为这是一种不好的方法。
  • @LuiggiMendoza 我在上一份声明中提出了建议。我从来没有这样想过。 +1为您的答案。我喜欢它。
【解决方案2】:

(...) 但我不想在 url 中显示 servlet 的名称。

在访问 Servlet 时,您根本不需要使用 Servlet 名称。事实上,您可以通过定义正确的 URL 模式来创建指向所需 URL 的 servlet:

@WebServlet("/index.jsp")
public class LatestProductServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        List<Product> productList = ...
        //all the necessary code to obtain the list of products
        //store it as request attribute
        request.setAttribute("productList", productLlist);
        //forward to the desired view
        //this is the real JSP that has the content to display to user
        request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
    }
}

然后,您将拥有这样的文件夹结构

- <root folder>
  - WEB-INF
    + index.jsp
    + web.xml

在 WEB-INF/index.jsp 中:

<!DOCTYPE html>
<html lang="es">
    <body>
        <!--
            Display the data accordingly.
            Basic quick start example
        -->
        <c:forEach items="${productList}" var="product">
            ${product.name} <br />
        </c:forEach>
    </body>
</html>

请注意,您的客户将访问http://&lt;yourWebServer&gt;:&lt;port&gt;/&lt;yourApplication&gt;/index.jsp 并获得所需的内容。而且您不需要触发两个 GET 请求来检索特定页面的内容。

请注意,您可以使用这种方法走得更远:由于该模式现在在 servlet 中定义,您可以选择不为您的客户端使用 index.jsp,而是使用 index.html 来访问您的页面。只需更改 Servlet 中的 URL 模式:

@WebServlet("/index.html")
public class LatestProductServlet extends HttpServlet {
     //implementation...
}

并且客户端将访问http://&lt;yourWebServer&gt;:&lt;port&gt;/&lt;yourApplication&gt;/index.html,这将在WEB-INF/index.jsp 中显示结果。现在您和您的客户都会很高兴:客户将获得他们的数据,而您不会在您的 URL 中显示那个丑陋的 servlet 名称。


附加

如果您将 index.jsp 作为 web.xml 中的欢迎页面,则此方法将不起作用,因为应用程序 servlet 期望存在一个真实文件 index.jsp。要解决这个问题,只需创建一个名为 index.jsp 的空文件:

- <root folder>
  - index.jsp  <-- fake empty file to trick the application server
  - WEB-INF
    + index.jsp
    + web.xml

当访问http://&lt;yourWebServer&gt;:&lt;port&gt;/&lt;yourApplication&gt;/时,会如上图那样工作。

【讨论】:

    【解决方案3】:

    感谢+Braj,我能够使用表达式语言做出回答。显然,这应该比 jsp 脚本/标签更好。

    Servlet -

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    public class ProductList extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
    
        public ProductList() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            List<String> products = new ArrayList<String>();
            products.add("Car");
            products.add("Gun");
            products.add("Shades");
    
            request.setAttribute("productsList", products);
        }
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
    }
    

    JSP -

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    
    <c:import url="/ProductList" />
    
    <c:set var="myProducts" value="${requestScope.productsList}" />
    
    <h1>List of products from servlet</h1>
    <c:forEach var="product" items= "${myProducts}" varStatus="i">
    ${product}<br>
    </c:forEach>
    
    </body>
    </html>
    

    【讨论】:

    • &lt;c:import url="/ProductList" /&gt;&lt;jsp:include page="/latest_products" /&gt;有什么区别?
    • @Braj - 我看不出有什么区别。但是,一个论坛他们说最好使用 EL 而不是旧的 jsp 标签和脚本。我不知道为什么。
    • 因为 JSTL 易于使用且不易出错。有时很难找出代码中的左大括号和右大括号。阅读更多关于JavaServer Pages Standard Tag Library
    • @Braj 这不是看谁更了解 Java Web 开发的竞赛。
    • 因为问题发布的方式看起来像你为什么要这样做?同时等待你的答案稍后证明你错了并发布一个精彩 评论揭示答案。如果你有/需要说些什么来帮助你展示当前的知识,那就直说吧,不要和这样的人玩。
    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多