HttpServlet和JSP集成

时间:2011-06-28 21:54:25

标签: java jsp servlets

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

3 个答案:

答案 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在那里的原因。