一个应用MVC的小例子

     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());
  } }}

到这里,我们完成了下图的步骤:


接着,创建提供建议的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)  各自的作用了。在这里总结一下,控制器是接收用户请求,然后调用模型来完成请求所需要完成的工作,模型把结果返回给控制器,控制器接着把结果分发给视图,让视图输出结果。可以这么说,控制器就像一个中间人,模型是帮控制器跑腿的,视图就像公关,对外工作的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值