Java HttpServlet与JSP集成

Java HttpServlet与JSP集成,java,jsp,servlets,Java,Jsp,Servlets,我想知道是否可以将自定义servlet逻辑与.jsp模板视图集成。例如,我有以下servlet: public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = "Mark"

我想知道是否可以将自定义servlet逻辑与.jsp模板视图集成。例如,我有以下servlet:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      String name = "Mark";        
  }
}
我想在jsp文件(new.jsp)中放置
name
变量,如:

我也改变了我的观点:

<%@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
设置为请求属性,并在JSP中获取它

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

request.setAttribute("name", name);
并通过以下方式获取:

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

您需要实现
doGet()
方法。正常的HTTP请求(单击链接、书签或直接在浏览器地址栏中输入URL)默认为
GET
method

为了使对象在预处理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映射


MyServlet
com.example.MyServlet
MyServlet
/新的
然后您就可以通过调用servlet了。在转发的JSP中,您可以通过EL访问
名称

${name}
请注意,JSP被放置在
/WEB-INF
文件夹中,以避免在不调用预处理servlet的情况下直接访问,而是在浏览器地址栏中输入JSP URL

另见:
如果您不想在请求中添加“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>

新的

但您不想在请求中输入名称的原因是什么?这就是为什么servlet会出现。

为什么您不能简单地在JSP中使用
标记作为代码?@Kyte:根据JSP 2.0编码约定,这是不鼓励的。有趣。很高兴知道。(我承认我学过JSP/servlets caveman风格)
${name}
,而不是
${requestScope.name}
?@ryan:如果页面范围中没有具有相同属性名称的内容,您可以省略显式范围声明。
JspContext#findAttribute()
扫描页面、请求、会话和应用范围。另请参见答案底部链接的EL wiki页面。
<%= request.getAttribute("name") %>
${requestScope.name}
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);
}
${name}
<%@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>