MVC模式的核心思想是有效组合“模型(model)”、“视图(view)”、“控制器(controller)”。是一种先进的设计模式。
model:用于存储数据的对象。
view:向控制器提交所需数据、显示模型中的数据。
controller:负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。
从面向对象的角度看,MVC结构可以使程序更具有对象化特征,也更容易维护(低耦合)。
我们在上一章为了使大家更好的理解Servlet,我们已经说过了Servlet和bean之间的异同,下面这个图说明了JSP中MVC模式。

思考下面?:
example6_1.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=#FFBBFF>
<font size=2>
<form action="computeSum" method="post" >
   等差数列求和:
  <BR>输入首项:<input type=text name="firstItem" size=4>
      输入公差:<input type=text name="var" size=4>
      求和项数:<input type=text name="number" size=4>
  <input type=submit value="提交">
</form>
<form action="computeSum" Method="get" >
   等比数列求和:
  <BR>输入首项:<input type=text name="firstItem" size=4>
      输入公比:<input type=text name="var" size=4>
      求和项数:<input type=text name="number" size=4>
  <input type=submit value="提交">
</form>
</font></body></HTML>

 
example6_1_show.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="seriesData"
             type="mybean.data.Example6_1_Bean" scope="request"/>
<HTML><body bgcolor=#EEFF88>
  <table border=1>
   <tr>
    <th> 数列的首项</th>
    <th> <jsp:getProperty name="seriesData" property="name"/></th>
    <th> 所求项数</th>
    <th> 求和结果</th>
   </tr>
    <td><jsp:getProperty name="seriesData" property="firstItem"/></td>
    <td><jsp:getProperty name="seriesData" property="var"/></td>
    <td><jsp:getProperty name="seriesData" property="number"/></td>
    <td><jsp:getProperty name="seriesData" property="sum"/></td>
   </tr>
   </table>
</body></HTML>

 
example6_1_Servlet.java

package myservlet.control;
import mybean.data.Example6_1_Bean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example6_1_Servlet extends HttpServlet{
   public void init(ServletConfig config) throws ServletException{
      super.init(config);
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
                        throws ServletException,IOException{
      Example6_1_Bean seriesData=new Example6_1_Bean();  //创建Javabean对象
      request.setAttribute("seriesData",seriesData);//将seriesData存到request对象中
      double a=Double.parseDouble(request.getParameter("firstItem"));
      double d=Double.parseDouble(request.getParameter("var"));
      int n=Integer.parseInt(request.getParameter("number"));
      seriesData.setFirstItem(a);      //将数据存储在数据模型seriesData中
      seriesData.setVar(d);
      seriesData.setNumber(n);
      double sum=0,item=a;
      int i=1;
      seriesData.setName("等差数列的公差");
      while(i<=n){                     //计算等差数列的和
         sum=sum+item;
         i++;
         item=item+d;
      }
      seriesData.setSum(sum);
      //请求example6_1_show.jsp显示seriesData中的数据:
      RequestDispatcher dispatcher=
      request.getRequestDispatcher("example6_1_show.jsp");
      dispatcher.forward(request,response);
   }
   public  void  doGet(HttpServletRequest request,HttpServletResponse response)
                        throws ServletException,IOException{
      Example6_1_Bean seriesData=new Example6_1_Bean();
      request.setAttribute("seriesData",seriesData);
      double a=Double.parseDouble(request.getParameter("firstItem"));
      double d=Double.parseDouble(request.getParameter("var"));
      int n=Integer.parseInt(request.getParameter("number"));
      seriesData.setFirstItem(a);
      seriesData.setVar(d);
      seriesData.setNumber(n);
      double sum=0,item=a;
      int i=1;
      seriesData.setName("等比数列的公比");
      while(i<=n){                     //计算等比数列的和
          sum=sum+item;
          i++;
          item=item*d;
      }
      seriesData.setSum(sum);
      RequestDispatcher dispatcher=
      request.getRequestDispatcher("example6_1_show.jsp");
      dispatcher.forward(request,response);
    }
}

 
example6_1_Bean.java

package mybean.data;
public class Example6_1_Bean{
   double firstItem;  //数列首项
   double var;        //公差或公比
   int number;        //求和项数
   double sum;       //求和结果
   String name="";   //数列类别
   public void setFirstItem(double a){
      firstItem=a;
   }
   public double getFirstItem(){
      return firstItem;
   }
   public void setVar(double b){
      var=b;
   }
   public double getVar(){
      return var;
   }
   public void setNumber(int n){
      number=n;
   }
   public double getNumber(){
      return number;
   }
   public void setSum(double s){
      sum=s;
   }
   public double getSum(){
      return sum;
   }
   public void setName(String na){
      name=na;
   }
   public String getName(){
     return name;
   }
}

 
web.xml(添加)

<servlet>
    <servlet-name>compute</servlet-name>
    <servlet-class>myservlet.control.Example6_2_Servlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>compute</servlet-name>
   <url-pattern>/compute</url-pattern>
</servlet-mapping>

 
 
我们可以发现,example6_1.jsp负责将用户的输入打表并发送到Servlet,在Servlet中创建Bean对象,将example6_1.jsp发送来的表单中的数据经过响应操作最后存入Bean对象中,再将请求转发给example6_1_show.jsp中显示。这就是一个简单的MVC结构。
 

课后题:

1.在JSP中,MVC模式中的数据模型角色由谁担当?
·    JavaBean
2.在JSP中,MVC模式中的控制器角色由谁担当?
·    JavaServlet
3.在JSP中,MVC模式中的视图角色由谁担当?
·    JSP页面
4.MVC的好处是什么?
·    从面向对象的角度看,MVC结构可以使程序更具有对象化特征,也更容易维护。因为该模式可以使各个模块独立出来,不仅降低了耦合性,还增加了可维护性和复用性,有利于软件工程化管理。
5.参照栗子6_1设计一个Web应用。用户可以通过JSP页面输入三角形的三边给一个Servlet控制器,控制器负责计算三角形的面积,并将结果存储到数据模型中,然后请求JSP页面显示数据模型中的数据。
·   略,和6_1除了Servlet更改逻辑部分和JSP、bean做出简单更改外没有区别。

分类: JSP

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注