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 条评论