MVC模式(一)
MVC:模型-视图-控制器(Model-View-Controller)
MVC是一种通过3个不同的部分构造一个软件或组件的的理想方法:
①模型(Model)---用于存储数据的对象
②视图(View)---为模型提供数据显示的对象
③控制器(Controller)---负责具体的业务逻辑操作,即控制器根据视图提出的要求对数
据作出处理,并将有关结果存储到模型中,同时负责让模型和视图进行必要的交互,当模
型中的数据变化时,让视图更新显示。
从面向对象的角度看,MVC接口可以使得程序更具有对象化特性,也更容易维护。在设计程
序时候,可以将摸个对象看做“模型”,然后为“模型”提供欠当的显示组件,即“视图
”。在MVC模式中,“视图”、“模型”和“控制器”之间是松耦合结构,便于显示系统的
维护和扩展。
在JSP技术中,“视图”、“模型”、“控制器”的具体实现如下:
*模型(Model):一个或多个JavaBean对象,用于存储数据,JavaBean主要提供简单的
setXXX()方法和getXXX()方法,在这些方法中不涉及对数据的具体处理细节。
*视图(View):一个或多个JSP页面,为模型提供数据显示,JSP页面主要使用HTML标记和
JavaBean标记来显示数据。
*控制器(Controller):一个或多个Servlet对象,根据视图提交的要求进行数据处理操
作,并将有关的结果存储到JavaBean中,然后servlet使用重定向方式请求视图中的摸个
JSP页面更新显示,即让JSP页面通过使用JavaBean标记显示控制器存储在J avaBean中的数
据。
在MVC模式中,servlet创建的javabean也涉及到生命周期,生命周期分为request、session、application。
下面的是一个计算三角形面积的例子
现在设计一个web应用,该web应用提供了2个JSP页面,一个页面使得用户可以输入三角形三条边的长度;另一个页面可以显示三角形的三条边的长度和面积。web应用提供了一个servlet,负责处理三角形三条边数据,并根据三条边计算三角形的面积,然后将有关数据保存到javabean中;web应用提供的javabean负责刻画三角形模型,提供简单的获取数据和修改数据的方法。
另外,需要改写web.xml文件,
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>handle</servlet-name> <servlet-class>rain.snow.HandleData</servlet-class> </servlet> <servlet-mapping> <servlet-name>handle</servlet-name> <url-pattern>/handleData</url-pattern> </servlet-mapping> </web-app>
模型JavaBean
由于servlet类中要使用javabean,所以为了能顺利编译servlet类和javabean类,可以将Trangle.java存放在一个包中,方便识别
Trangle.java---在flower.grass包中
package flower.grass; public class Triangle { double sideA,sideB,sideC; double area; boolean isTriangle; public double getSideA() { return sideA; } public void setSideA(double sideA) { this.sideA = sideA; } public double getSideB() { return sideB; } public void setSideB(double sideB) { this.sideB = sideB; } public double getSideC() { return sideC; } public void setSideC(double sideC) { this.sideC = sideC; } public double getArea() { return area; } public void setArea(double area) { this.area = area; } public void SetIsTriangle(boolean boo) { isTriangle = boo; } public boolean getIsTriangle() { return isTriangle; } }
注意:在这个javabean中getArea()方法并没有参与面积的计算,只是简单的返回存储的数据area
视图(JSP)
input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <html> <body> <form action="handleData" method="post"> <p>输入三角形的三条边(提交给servlet去处理):</p> <br/>边A:<input type=text name="sideA" value=0 size=4> 边B:<input type=text name="sideB" value=0 size=4> 边C:<input type=text name="sideC" value=0 size=4> <input type=submit value="提交"> </form> </body> </html>
show.jsp
<%@ page language="java" import="flower.grass.Triangle" pageEncoding="GB18030"%> <jsp:useBean id="triangle" type="flower.grass.Triangle" scope="request"></jsp:useBean> <html> <body> <font size=2> <p>三角形的三条边是: <br>边A:<jsp:getProperty property="sideA" name="triangle"/> 边B:<jsp:getProperty property="sideB" name="triangle"/> 边C:<jsp:getProperty property="sideC" name="triangle"/> <br/>这三条边能构成一个三角形吗? <jsp:getProperty name="triangle" property="isTriangle"/> 面积是: <jsp:getProperty property="area" name="triangle"/> </font> </body> </html>
控制器(Servlet)
HandleData.java---在rain.snow包中
package rain.snow; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import flower.grass.Triangle; public class HandleData extends HttpServlet { public void init(ServletConfig config)throws ServletException { super.init(config); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { Triangle tri = new Triangle();//创建JavaBean对象 request.setAttribute("triangle", tri);//将tri存储到HttpServletRequest对象中 double a = Double.parseDouble(request.getParameter("sideA")); double b = Double.parseDouble(request.getParameter("sideB")); double c = Double.parseDouble(request.getParameter("sideC")); double p = (a + b + c)/2.0; double area = Math.sqrt(p*(p-a)*(p-b)*(p-c)); //将数据存储到tri中 tri.setSideA(a); tri.setSideB(b); tri.setSideC(c); tri.setArea(area); if (a+b>c&a+c>b&b+c>a) tri.SetIsTriangle(true); else tri.SetIsTriangle(false); RequestDispatcher dispatcher = request.getRequestDispatcher("/show.jsp"); dispatcher.forward(request, response);//清酒show.jsp显示tri中的数据 } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { doPost(request,response); } }
运行结果如下: