[英]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.