有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaHttpServlet与JSP集成

我想知道是否可以将自定义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>

我的网络。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>

共 (3) 个答案

  1. # 1 楼答案

    您可以将name设置为请求属性,并在JSP中获取它

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

    request.setAttribute("name", name);
    

    并通过以下方式获取:

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

    或者更好地使用EL:

    ${requestScope.name}
    
  2. # 2 楼答案

    如果您不想在请求中添加“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会出现在那里

  3. # 3 楼答案

    您需要实现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文件夹中,以避免在不调用预处理servlet的情况下直接访问,而是在浏览器地址栏中输入JSP URL

    另请参见: