MVC是一种很常用的Web模式,我们有必要理解它、应用它,现在就让我们用一个小小的例子来帮助大家认识MVC吧:我们尝试用一个提供啤酒建议的Web应用向大家说明。MVC的工作原理如下图:
构建应用的步骤:
1、构建和测试用户最初请求的HTML表单。
2、构建控制器Servlet的第一个版本
3、为专家(模型)类构建一个测试类
4、升级Servlet到第二版本
5、构建JSP(视图),并把Servlet升级到第三版
HTML表单:
<form action="SelectBeer.do" method="post">
<p>Select beer characteristics</p>
<h3>Color:</h3>
<select name="color" size="1">
<option value="light">light</option>
<option value="amber">amber</option>
<option value="brown">brown</option>
<option value="dark">dark</option>
</select>
<br/><br/>
<center>
<input type="submit" value="提交" />
</center>
</form>
第一版本Servlet:
package com.example.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.example.model.BeerExpert;
public class BeerSelect extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,HttpServletResponse response){
respose.setContentType("text/html");
PrintWriter out =response.getWriter();
out.println("Beer Selection Advoce:");
String c=request.getParameter("color");
out.print("<br/>Try "+c);
}
}
在这里, 如果要让 表单和Servlet能正常工作,需要添加Servlet部署文件,如下:
<servlet>
<servlet-name>Select</servlet-name>
<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Select</servlet-name>
<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping>
通过部署文件我们也能知道在Web.xml中,Servlet的名字是Select,类名是 com.example.web.BeerSelect; 对外的公共ID是Select.do , 也就是在表单中填写的action。
通过代码我们也知道,第一版本的Servlet仅仅实现的是接受表单数据,然后输出,并没有实现提供建议的功能;下面我们来建立模型类,为用户提供建议。在MVC中,模型是指应用的 “后台” 。大多数情况下,这只是普通的Java代码,它不知道自己会被那个Servlet调用。还有,我们不能把模型限制为只能由一个Web应用使用,所以它应当放在另一个工具包中。下面给出这个应用的Model,他根据用户选择给出建议:
package com.example.model;
import java.util.ArrayList;
import java.util.List;
public class BeerExpert {
public List getBrands(String color){
List brands = new ArrayList();
if(color.equals("amber")){
brands.add("Jack Amber");
brands.add("Red Mosse");
}else{
brands.add("Jail Pale Ale");
brands.add("Gout Stout");
}
return brands;
}
}
有了模型,我们就要改进我们的Servlet,让它来调用模型来得到真正的建议:
package com.example.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.example.model.BeerExpert;
public class BeerSelect extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,HttpServletResponse response){
String c=request.getParameter("color");
BeerExpert be=new BeerExpert();
List result=be.getBrands(c);
respose.setContentType("text/html");
PrintWriter out =response.getWriter();
out.println("Beer Selection Advoce:");
Iterator it=result.iterator();
while(it.hasNext()){
out.println("<br/> Try "+it.next());
} }}
到这里,我们完成了下图的步骤:![](https://img-blog.csdn.net/20170605093647924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VkdW96aGlfMTk5Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170605093703520?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VkdW96aGlfMTk5Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
接着,创建提供建议的JSP “视图”:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Beer Recommendations JSP</title>
</head>
<body>
<%
List styles = (List)resquest.getAttribute("styles");
Iterator it=styles.iterator();
while(it.hasNext()){
out.println("<br/> Try "+it.next());
}
%>
</body>
</html>
最后,我们需要修改 Servlet让其调用JSP来生成输出 (视图)。容器提供了一种称为“请求分派”的机制,允许容器管理的一个组件调用另一个组件。我们使用的就是这种机制,Servlet从模型得到信息,把它保存在请求对象中,然后把请求分派给JSP,让其输出。这也体现了MVC的思想,做到三者的分工。
package com.example.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.example.model.BeerExpert;
public class BeerSelect extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,HttpServletResponse response){
String c=request.getParameter("color");
BeerExpert be=new BeerExpert();
List result=be.getBrands(c);
String s="Select.do";
System.out.print(s);
request.setAttribute("styles",s);
RequestDispatcher view=request.getRequestDispatcher("result.jsp");
try {
view.forward(request, response);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
到这里,我们的工作就完成啦。我相信通过这个简单的例子,我们大家都能体会到 控制器(controller)--模型(model)-视图(view) 各自的作用了。在这里总结一下,控制器是接收用户请求,然后调用模型来完成请求所需要完成的工作,模型把结果返回给控制器,控制器接着把结果分发给视图,让视图输出结果。可以这么说,控制器就像一个中间人,模型是帮控制器跑腿的,视图就像公关,对外工作的。