天天看点

理解MVC—从实例出发:基于MVC模式的简易算术计算器

MVC模式:MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
  • (控制器Controller)- 负责转发请求,对请求进行处理。
  • (视图View) - 界面设计人员进行图形界面设计。
  • (模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据   库设计(可以实现具体的功能)。
理解MVC—从实例出发:基于MVC模式的简易算术计算器

Java

Java 平台企业版 (J2EE)

和其他的各种框架不一样,J2EE为模型对象(Model Objects)定义了一个规范。

视图(View):在J2EE应用程序中,视图(View)可能由Java Server Page(JSP)承担。生成视图的代码则可能是一个servlet的一部分,特别是在客户端服务端交互的时候。

控制器(Controller):J2EE应用中,控制器可能是一个servlet,现在一般用Struts2/Spring Framework实现。

模型(Model):模型则是由一个实体Bean来实现。

           (以上内容摘录自维基百科对MVC模式概念的部分解析)

MVC框架模式在java开发过程中也比较常用,下面通过一个简易计算器的实例去理解一下MVC这个方便而强大的东东。每个人的思路步骤可能会略有不同,我这里只分享我自己的思路“殊途同归”吧,呵呵。

这个简易计算器进行对两个数字的运算,选择(+、-、*、/)结算符,最后计算出结果。大概的界面设计如下所示:

理解MVC—从实例出发:基于MVC模式的简易算术计算器

大概可分为下面几个步骤:

1.Model由实体Bean来实现:编写一个bean,用来封装计算器的数字,结果及操作运算符

package com.lixiyu.bean;
public class CalculatorBean
 {
    double numberOne,numberTwo,result;//数字1、数字2、结果
                                                                                                                                                                                                                                        
    String operator="+";//操作
 //setxxx和getxxx
    public void setNumberOne(double n)
 {
      numberOne=n;
 }
                                                                                                                                                                                                                                       
    public double getNumberOne()
   {  return numberOne;
   }
                                                                                                                                                                                                                                       
    public void setNumberTwo(double n)
   {  numberTwo=n;
   }
                                                                                                                                                                                                                                       
    public double getNumberTwo()
   {  return numberTwo;
   }
                                                                                                                                                                                                                                       
    public void setOperator(String s)
   {  operator=s.trim();;
   }
                                                                                                                                                                                                                                       
    public String getOperator()
   {  return operator;
   }
                                                                                                                                                                                                                                       
    public void setResult(double r)
   {  result=r;
   }
                                                                                                                                                                                                                                       
    public double getResult()
   {  return result;
   }
}      

2.编写控制器CalculatorServlet,用于转发请求,对请求进行处理。下面给出Servlet中doPost()的关键代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        CalculatorBean dataBean = null;
        HttpSession session = request.getSession(true);
        try {
            dataBean = (CalculatorBean) session.getAttribute("ok");
            if (dataBean == null) {
                dataBean = new CalculatorBean(); // 创建Javabean对象
                session.setAttribute("ok", dataBean);// 将dataBean存储到session对象中
            }
        } catch (Exception exp) {
            dataBean = new CalculatorBean(); // 创建Javabean对象
            session.setAttribute("ok", dataBean);// 将dataBean存储到session对象中
        }
        double numberOne = Double
                .parseDouble(request.getParameter("numberOne"));
        double numberTwo = Double
                .parseDouble(request.getParameter("numberTwo"));
        String operator = request.getParameter("operator");
        double result = 0;
        if (operator.equals("+")) {
            result = numberOne + numberTwo;
        } else if (operator.equals("-")) {
            result = numberOne - numberTwo;
        } else if (operator.equals("*")) {
            result = numberOne * numberTwo;
        } else if (operator.equals("/")) {
            result = numberOne / numberTwo;
        }
        dataBean.setNumberOne(numberOne); // 将数据存储在dataBean中
        dataBean.setNumberTwo(numberTwo);
        dataBean.setOperator(operator);
        dataBean.setResult(result);
        RequestDispatcher dispatcher = request
                .getRequestDispatcher("showResult.jsp");
        dispatcher.forward(request, response);// 请求showResult.jsp显示dataBean中的数据
    }      

在web.xml中注册servlet及实现映射:

<servlet>
    <servlet-name>CalculatorServlet</servlet-name>
    <servlet-class>com.lixiyu.servlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CalculatorServlet</servlet-name>
    <url-pattern>/calculator</url-pattern>
  </servlet-mapping>      

3.编写视图(view),主要通过输入操作和显示结果的两个JSP来实现

 inputNumber.jsp(主要代码):

<form  id="form1" action="calculator" method="post" name="form1">
   <table>
                                                                                
   <tr><td> <b>输入任意两个数:</b></td>
       <td> <Input type=text name="numberOne" value=0 size=6></td>
     <td> <Input type=text name="numberTwo" value=0 size=6></td>
   </tr>
   <tr><td><b>选择算术运算符号:</b></td>
       <td> <Select name="operator">
              <Option value="+">+(加)
              <Option value="-">-(减)
              <Option value="*">*(乘)
              <Option value="/">/(除)
            </Select>
       </td>
       <td> <INPUT TYPE="submit" value="提交选择" name="submit"></td>
   </tr>
                                                                               
   </table>
      </form>      
理解MVC—从实例出发:基于MVC模式的简易算术计算器
<jsp:useBean id="ok" type="com.lixiyu.bean.CalculatorBean" scope="session"/>
   运算结果:
  <jsp:getProperty name="ok" property="numberOne"/>
  <jsp:getProperty name="ok" property="operator"/>
  <jsp:getProperty name="ok" property="numberTwo"/> =
  <jsp:getProperty name="ok" property="result"/>