使用Java EE 6的MVC2模式

dva*_*ria 2 html java jsp servlets

我正在尝试学习如何使用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>
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

JSP(Demo.jsp):

<html>

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

  <body>

    <h1>JSP Demo</h1>

      <ul>

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

      </ul>
  </body>

</html>
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助.

Bal*_*usC 6

在MVC中,servlet应该只控制请求/响应.它不应该在响应中打印任何内容.这是观点的责任.因此servlet中的以下行违反了MVC原则:

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

摆脱他们所有.

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

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

属性值是可用的由属性名称EL(表达式语言)${message}.

然后是JSP,它基本上是HTTP响应的一部分.当servlet方法完成并且forward()已经发生时,servletcontainer将执行JSP代码.JSP提供了一个模板来编写HTML/CSS/JS,就像你希望它被发送到客户端(webbrowser)一样.但是不鼓励使用Scriptlet, <% %>因为它允许您以违反MVC原则的方式编写代码.你应该只使用EL ${}.

所以,替换

<%= get response forwarded from servlet.. %>
Run Code Online (Sandbox Code Playgroud)

通过

<p>Those parameters are submitted: ${param.input_name} : ${param.input_age}</p>
<p>Information received by Servlet: ${message}</p>
Run Code Online (Sandbox Code Playgroud)

也可以看看: