当前位置: 代码迷 >> HTML/CSS >> 7.2 使用案例 html
  详细解决方案

7.2 使用案例 html

热度:257   发布时间:2012-09-27 11:11:17.0
7.2 应用案例 html

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" %>
	<HTML>
	 <BODY BGCOLOR=cyan><FONT Size=5>
	<%=(String)request.getAttribute("result") %>
	</BODY>
	</HTML>
	trisucess.jsp
	<%@page contentType="text/html;charset=GB2312" %>
	<%@page  import="modle.*"%>
	<HTML>
	 <BODY BGCOLOR=cyan><FONT Size=5>
		<% Triangle tri=new Triangle();
		tri=(Triangle)request.getAttribute("result"); %>
	<P> 您输入的三边是:
		<BR><%=tri.getEdge1()%>
        <BR><%=tri.getEdge2()%>
        <BR><%=tri.getEdge3()%>
		<P>三角形面积是:<%=tri.calArea()%>
		</BODY> 
	 </HTML>
	主页面trimvc.jsp
	<%@page contentType="text/html;charset=GB2312" %><HTML>
	<BODY BGCOLOR=cyan><FONT Size=5>
	<P>&nbsp; 请输入三角形的三个边的长度,输入的数字用逗号分割: 
	<BR>
	<FORM action="TriangleMVC" method=post name=form>
	<INPUT type="text" name="boy"> 
	<INPUT TYPE="submit" value="送出" name=submit>
	</FORM>  
	</BODY>
	</HTML>
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" %>
	<html> 
	<body>
	<p>网上书斋
	<table border>
     <tr>
     	<td>序号</td><td>书名</td><td>价格</td>
     	<td>简介</td><td>订购</td>
     </tr>
	<tr>
    <td>1</td><td>computer</td>
    <td>12</td><td><a href="in1.jsp">简介</a></td>
    <td>
    <form action="OrderServlet" method=post name="form" onSubmit="return confirm()"  >
     	<input type="hidden" name="goods" value="1#computer#12">
     	<input type=submit value=订购 >
     	</form>
    </td></tr>
	<tr>
     <td>2</td><td>Cprogram</td><td>20</td>
     <td><a href="in2.jsp">简介</a></td>
     <td> 
		<form action="OrderServlet" method=post name="form" onSubmit="return confirm()">
     	<input type="hidden" name="goods" value="2#Cprogram#20">
     	<input type=submit value=订购>
     	</form>
     </td>
</tr>
	<tr>
     <td>3</td><td>database</td>
     <td>30</td><td><a href="in3.jsp">简介</a></td>
     <td>
     <form action="OrderServlet" method=post name="form"onSubmit="return confirm()">
     	<input type="hidden" name="goods" value="3#database#30">
     	<input type=submit value=订购>
     	</form>
     	</td>
	</tr>
     </table>
    <br>
     <SCRIPT language="JavaScript">
     funtion confirm(){
		if(confirm(" ","确认订购")==true)return true;
		return false;
	</SCRIPT>
    <a href="lookmvc.jsp">购物详单</a> 
</body>
</html>
	主页面基本保持原有设计风格。但提交目的地由原来的JSP页面改为servlet (OrderServlet),另外,应用了一个JS技术,其目的让用户购买商品时多一次提醒和确认。
	lookmvc.jsp页面基本保持原有设计风格。同样,提交目的地由原来的JSP页面改为servlet(ModifyServlet)。代码如下。
	<%@ page contentType="text/html;charset=GB2312" %>
	<%@ page import="shop.*"%>
	<%@page import="java.util.*" %>
  	<html>
  	<body>
  	 <% car car1=(car)session.getAttribute("shop");
  	 if(car1==null){car1=new car();}//第一次;
   	Vector v=car1.getV();%>
	<Form action="ModifyMVC" method=get>
		<Table Border>
		<TR>
			<TH width=100>序号
			<TH width=50>书名
			<TH width=50>价格
			<TH width=50>数量
			<TH width=50>删除
		</TR>   		
 	<% for(int i=0;i<v.size();i++)
		{   Book book=(Book)v.get(i);
			out.println("<TR>");
			out.println("<TD >"+book.getBooknum()+"</TD>"); 
			out.println("<TD >"+book.getBookname()+"</TD>");
			out.println("<TD >"+book.getPrice()+"</TD>"); 
			out.println("<TD >");
			out.println("<input type=text width=10 size=20 name="+book.getBooknum()+" 			value="+book.getNum()+">");
			out.println("</TD >");
			out.println("<TD >");
			String str=book.getBooknum();
			out.println("<input type=checkbox name=book value="+str+">");
			out.println("</TD >");
			}
		%>
	</Table>
	<input type=submit value=提交>
	</form>
	<p>
	<a href="goodsmvc.jsp">返回购物</a>
	</body>
	</html>
	对于控制层(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;i<str.length;i++)
				car1.delete(str[i]);
		  	}
		String strbook=null;
		String booknum=null;
		for(int n=0;n<car1.length();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 项目结构图
?

  相关解决方案