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做出简单更改外没有区别。
0 条评论