7.2 应用案例 本节通过二个案例来说明MVC的基本思想,MVC的工作模式。 7.2.1 一个简单的例子 第五章介绍了把triangle.jsp改造成为JSP+JavaBean模式,本节,在此基础上,改造成为MVC即JSP+JavaBean+servlet模式。在这个案例中,M层(JavaBean)保持原有设计不变,即为类Triangle(用于三角形的面积计算等功能)和类Stringtonum(用于把输入字符串转成三角形的三条边值)。按照MVC模式,设计servlet为TriangleMVC,参考代码如下。 package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.Stringtonum; import model.Triangle; public class TriangleMVC extends HttpServlet { public TriangleMVC() {super();} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String str=request.getParameter("boy"); Stringtonum angle=new Stringtonum(); boolean flag=false; RequestDispatcher dispatcher = null; Triangle tri=null; if(!angle.strtonum(str)) request.setAttribute("result", "请输入数字"); else{ tri=new Triangle(angle.getNum1(),angle.getNum2(),angle.getNum3()); if(!tri.isTriangle()) request.setAttribute("result", "三边不能组成三角形"); else{ request.setAttribute("result", tri); flag=true; } } if (flag ==false) dispatcher= getServletContext().getRequestDispatcher( "/trierror.jsp"); else dispatcher=getServletContext().getRequestDispatcher( "/trisucess.jsp"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } 上面servlet设计中,其基本处理流程为: 1、获取页面提交的数据(规格化的字符串)。 2、调用业务类Stringtonum的功能,若字符串能转成三条边,则继续以下步骤;否则,进行页面跳转至trierror.jsp,并传值"请输入数字"。 3、调用业务类Triangle的功能,若三条边能组成一个三角形,则继续以下步骤;否则,进行页面跳转至trierror.jsp,并传值"三边不能组成三角形"。 4、进行页面跳转至trisucess.jsp,并把三角形实例(tri)传至该页面。 JSP文件的参考代码如下。 trierror.jsp <%@page contentType="text/html;charset=GB2312" %> <%=(String)request.getAttribute("result") %> trisucess.jsp <%@page contentType="text/html;charset=GB2312" %> <%@page import="modle.*"%> <% Triangle tri=new Triangle(); tri=(Triangle)request.getAttribute("result"); %> 您输入的三边是: <%=tri.getEdge1()%> <%=tri.getEdge2()%> <%=tri.getEdge3()%> 三角形面积是:<%=tri.calArea()%> 主页面trimvc.jsp <%@page contentType="text/html;charset=GB2312" %> 请输入三角形的三个边的长度,输入的数字用逗号分割: 送出" name=submit> 7.2.2 购物车MVC代码重构 第五章设计了购物车,本节进行MVC模式代码重构。显然M层(JavaBean)保持原有设计不变。另外,由于采用MVC模式,不建议在V层调用M层,所以把购物车(car)放在session中,这是主要的变动。另外,把V层(JSP)拆分成V层和C层,主要任务是设计servlet(即:OderServlet和ModifyMVC)。MVC模式下购物车的流程图如下所示。图7-2:MVC模式下购物车流程图。 先设计主页面goodsmvc.jsp,参考代码如下。 <%@ page contentType="text/html;charset=GB2312" %> 网上书斋 序号 书名 价格 简介 订购 1 computer 12 简介 > 订购 > 2 Cprogram 20 简介 订购> 3 database 30 简介 订购> 购物详单 主页面基本保持原有设计风格。但提交目的地由原来的JSP页面改为servlet (OrderServlet),另外,应用了一个JS技术,其目的让用户购买商品时多一次提醒和确认。 lookmvc.jsp页面基本保持原有设计风格。同样,提交目的地由原来的JSP页面改为servlet(ModifyServlet)。代码如下。 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="shop.*"%> <%@page import="java.util.*" %> trisucess.jsp <%@page contentType="text/html;charset=GB2312" %> <%@page import="modle.*"%> <% Triangle tri=new Triangle(); tri=(Triangle)request.getAttribute("result"); %> 您输入的三边是: <%=tri.getEdge1()%> <%=tri.getEdge2()%> <%=tri.getEdge3()%> 三角形面积是:<%=tri.calArea()%> 主页面trimvc.jsp <%@page contentType="text/html;charset=GB2312" %> 请输入三角形的三个边的长度,输入的数字用逗号分割: 送出" name=submit> 7.2.2 购物车MVC代码重构 第五章设计了购物车,本节进行MVC模式代码重构。显然M层(JavaBean)保持原有设计不变。另外,由于采用MVC模式,不建议在V层调用M层,所以把购物车(car)放在session中,这是主要的变动。另外,把V层(JSP)拆分成V层和C层,主要任务是设计servlet(即:OderServlet和ModifyMVC)。MVC模式下购物车的流程图如下所示。图7-2:MVC模式下购物车流程图。 先设计主页面goodsmvc.jsp,参考代码如下。 <%@ page contentType="text/html;charset=GB2312" %> 网上书斋 序号 书名 价格 简介 订购 1 computer 12 简介 > 订购 > 2 Cprogram 20 简介 订购> 3 database 30 简介 订购> 购物详单 主页面基本保持原有设计风格。但提交目的地由原来的JSP页面改为servlet (OrderServlet),另外,应用了一个JS技术,其目的让用户购买商品时多一次提醒和确认。 lookmvc.jsp页面基本保持原有设计风格。同样,提交目的地由原来的JSP页面改为servlet(ModifyServlet)。代码如下。 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="shop.*"%> <%@page import="java.util.*" %> <% car car1=(car)session.getAttribute("shop"); if(car1==null){car1=new car();}//第一次; Vector v=car1.getV();%> <% for(int i=0;i { Book book=(Book)v.get(i); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" "); } %> 序号 书名 价格 数量 删除 "+book.getBooknum()+" "+book.getBookname()+" "+book.getPrice()+" "); out.println(" value="+book.getNum()+">"); out.println(" "); String str=book.getBooknum(); out.println(""); out.println(" 提交> 返回购物 对于控制层(C层),主要设计二个servlet。分别是OrderServlet和ModifyMVC。其代码如下所示。 OrderServlet.java package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.* import shop.car; public class OrderServlet extends HttpServlet { public OrderServlet() {super();} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String goods=request.getParameter("goods"); HttpSession session=request.getSession(); car car1=(car)session.getAttribute("shop"); if(car1==null){ car1=new car();}//第一次; car1.add(car1.newgoods(goods)); session.setAttribute("shop",car1); RequestDispatcher dispatcher = null; dispatcher=getServletContext().getRequestDispatcher("/goodsmvc.jsp"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } 显然,OrderServlet完成了第五章解决方案中的success.jsp功能。 ModifyMVC,java package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.*; import shop.car; public class ModifyMVC extends HttpServlet { public ModifyMVC() {super();} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(); car car1=(car)session.getAttribute("shop"); String str[]= request.getParameterValues("book"); if(str!=null){ for(int i=0;ilength;i++) car1.delete(str[i]); } String strbook=null; String booknum=null; for(int n=0;n strbook=car1.getBook(n).getBooknum();//书的编号(购物中心); booknum=request.getParameter(strbook);//根据编号取出被修改的书的数量; if(booknum==null)booknum=""; int num=Integer.parseInt(booknum); car1.modify(strbook,num);//修改书的数量; } RequestDispatcher dispatcher = null; dispatcher=getServletContext().getRequestDispatcher( "/lookmvc.jsp"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } 显然,ModifyMVC完成了第五章解决方案中的modify.jsp功能。 7.2.3 项目结构图 前节例子的工程结构图如下所示。图7-3 项目结构图