簡體   English   中英

HttpServlet 和 JSP 集成

[英]HttpServlet and JSP integration

我想知道是否可以將自定義 servlet 邏輯與.jsp 模板視圖集成。 例如,我有以下 servlet:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      String name = "Mark";        
  }
}

我想將name變量放在 jsp 文件(new.jsp)中,例如:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>New</title>
    </head>
    <body>
         <%= name %>

    </body>
</html>

我的 web.xml:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <jsp-file>/new.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/new</url-pattern>
</servlet-mapping>

我不想在請求中輸入name

有什么幫助嗎?


更新

非常感謝,但我仍然遇到問題。 首先,我更新了我的 servlet:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      String name = "Mark";
      request.setAttribute("name", name);
      request.getRequestDispatcher("/WEB-INF/new.jsp").forward(request, response);       
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      String name = "Mark";
      request.setAttribute("name", name);
      request.getRequestDispatcher("/WEB-INF/new.jsp").forward(request, response);       
  }
}

我也改變了看法:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>New</title>
    </head>
    <body>
         ${name}

    </body>
</html>

但是當我使用${name}時沒有顯示任何內容。 我認為我應該導入任何 jstl,但不幸的是,如果我使用<%= request.getAttribute("name") %>我會得到null


UPDATE 2 終於解決了,是我的錯,我忘記設置了

<servlet>
   <servlet-name>MyServlet</servlet-name>
   <servlet-class>com.example.MyServlet</servlet-class>
</servlet>

您需要改為實現doGet()方法。 普通的 HTTP 請求(單擊鏈接、書簽或直接在瀏覽器地址欄中輸入 URL)默認為GET方法。

為了使對象在預處理 servlet 中的 JSP 中可用,您需要將其設置為請求中的屬性,session 或應用程序 scope。 最后,您需要將請求/響應轉發到 JSP 以便顯示。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name = "Mark";
    request.setAttribute("name", name);
    request.getRequestDispatcher("/WEB-INF/new.jsp").forward(request, response);
}

如果您修復 servlet 映射如下

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/new</url-pattern>
</servlet-mapping>

然后你可以通過http://localhost:8080/contextname/new調用 servlet。 在轉發的 JSP 中,您可以僅通過 EL 訪問name

${name}

請注意,JSP 放置在/WEB-INF文件夾中,以避免直接訪問而無需通過在瀏覽器地址欄中輸入 JSP ZE6B391A8D2C4D45902A23A8B6585703 來調用預處理 servlet。

也可以看看:

您可以將name設置為請求屬性並在 JSP 中獲取它。

例如,在您的 servlet 中,您可以執行以下操作:

request.setAttribute("name", name);

並使用:

<%= request.getAttribute("name") %>

或者更好的是,使用 EL:

${requestScope.name}

如果您不想在請求中添加“名稱”,那么唯一的方法是在 JSP 代碼中使用 scriptlet。 不過,這不是一個干凈的或基於標准的解決方案。

重復 ## 這不是一個干凈的解決方案 ## 使用請求來存儲其他人指出的名稱。

所以例如

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>New</title>
    </head>
    <body>
    <% String name = "Mark" %> <%-- PUT THE name IN HERE --%>
         <%= name %>

    </body>
</html>

但是您不想在請求中輸入名稱的原因是什么? 這就是 servlets 存在的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM