【问题标题】:MVC2 Pattern using Java EE 6使用 Java EE 6 的 MVC2 模式
【发布时间】:2011-05-24 04:18:34
【问题描述】:

我正在尝试学习如何使用 Java EE 6 构建 Web 应用程序,但我很难理解在典型 MVC2 设计的组件之间传递信息的最佳方式。

按照我的理解,使用 Java EE 的 MVC2 模式是:数据是模型,控制器是 servlet,视图是 JSP。当然这只是一个例子。

所以我已经编写了以下三个部分,并且我知道如何将它们安装在我正在使用的服务器(Tomcat 7)中,入口点将是下面的 html 文件。我正在努力解决 servlet 如何将其响应转发给 JSP,以及如何将该 JSP 发送回客户端浏览器。

HTML 文件(demo.html):

<html> 
  <head>
    <title>MVC2 Demo</title>
  </head>
  <body>
    <form method='post' action='/mvc2-demo/DemoServlet'>
      <h1>   MVC2 Demo   </h1>

      Name: <input type='text' name='input_name' size='50'>
      <br><br>
      Age:  <input type='text' name='input_age' size='10'>
      <br><br>

      <input type='submit' value='SUBMIT INFO'>
    </form>
  </body>
</html>

servlet (DemoServlet.java):

import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DemoServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        response.setContentType("text/html");

        try {

            PrintWriter pw = response.getWriter();

            String name = request.getParameter("input_name");
            String age = request.getParameter("input_age");

            pw.println("Information received by Servlet: " + name + " : " + age);

            // forward this response to Demo.jsp...

            pw.close();

        } catch (Exception e) {

            System.out.println("Cannot get writer: " + e);
        }
    }
}

JSP(Demo.jsp):

<html>

  <head><title> JSP Demo </title></head>

  <body>

    <h1>JSP Demo</h1>

      <ul>

         <%= get response forwarded from servlet.. %>

      </ul>
  </body>

</html>

入口点是一个 HTML 页面,它显示一个带有两个输入字段(一个用于某人的姓名,另一个用于其年龄)和一个提交按钮的简单表单。当用户点击提交时,表单将其数据发送到 DemoServlet。然后,servlet 从 HTTP 请求负载中提取数据并将其保存在一些本地字符串变量中。我注释掉的部分是我想以某种方式将此信息转发给 JSP。一旦我这样做了,JSP 会自动发送到客户端吗?是什么触发的?

感谢您的帮助。

【问题讨论】:

    标签: java html jsp servlets


    【解决方案1】:

    在 MVC 中,servlet 应该只控制请求/响应。它不应该在响应中打印任何内容。这就是视图的责任。所以 servlet 中的以下几行违反了 MVC 原则:

    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
    pw.println("Information received by Servlet: " + name + " : " + age);
    

    把他们都干掉。

    您需要将希望在 JSP 中显示的信息存储在请求范围内,然后将请求/响应转发给 JSP。由于${param} 已经可以使用这些参数,因此在这种特殊情况下您不需要存储任何内容。只需转发到 JSP 就足够了。出于演示目的,我将在请求中添加另一个属性:

    request.setAttribute("message", "Information successfully processed");
    request.getRequestDispatcher("/WEB-INF/Demo.jsp").forward(request, response);
    

    属性值可通过EL (Expression Language) 中的属性名称作为${message} 获得。

    然后是JSP,它基本上是HTTP响应的一部分。当 servlet 方法完成并发生forward() 时,servlet 容器将执行 JSP 代码。 JSP 提供了一个模板,可以按照您希望将其发送到客户端(网络浏览器)的方式编写 HTML/CSS/JS。但是,不鼓励使用 Scriptlets &lt;% %&gt;,因为它允许您以违反 MVC 原则的方式编写代码。您应该只使用 EL ${}

    所以,替换

    <%= get response forwarded from servlet.. %>
    

    通过

    <p>Those parameters are submitted: ${param.input_name} : ${param.input_age}</p>
    <p>Information received by Servlet: ${message}</p>
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2013-03-08
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多