我想知道可以将自定义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
。
更新2 终于解决了!这是我的错,我忘了设置
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
答案 0 :(得分:5)
您需要实现doGet()
方法。普通的HTTP请求(单击链接,书签或直接在浏览器地址栏中输入URL)默认为GET
方法。
为了在预处理servlet中使JSP中的对象可用,您需要将其设置为请求,会话或应用程序范围中的属性。最后,您需要将请求/响应转发给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 URL来调用预处理servlet。
答案 1 :(得分:1)
您可以将name
设置为请求属性并在JSP中获取。
例如,在您的servlet中,您可以执行以下操作:
request.setAttribute("name", name);
并使用:
<%= request.getAttribute("name") %>
或更好,使用EL:
${requestScope.name}
答案 2 :(得分:0)
如果您不想在请求中添加“name”,那么唯一的方法是在JSP代码中使用scriptlet。但这不是一个干净或基于标准的解决方案。
REPEAT ##这不是一个干净的解决方案##使用其他人指出的存储名称的请求。
所以例如
<%@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>
但是为什么你不想把名字放在请求中呢?这就是为什么servlet在那里的原因。