目录
7.1 MVC模式介绍
模型-视图-控制器(Model-View-Controller),简称为MVC。MVC已经成为软件设计者必须熟练使用的开发模式。本章必须理解、掌握在JSP程序设计中怎样具体体现MVC开发模式(其他语言的程序设计是非常类似的,仅仅是具体使用的API不同而已)。 MVC是一种通过三部分构造一个软件或组件的理想办法。
模型(model) 用于存储数据的对象。
视图(view) 向控制器提交所需数据、显示模型中的数据。
控制器(controller) 负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出(商业)处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。
7.2 JSP中的MVC模式
模型(Model) 一个或多个Javabean对象,用于存储数据。
视图(View) 一个或多个JSP页面,其作用是向控制器提交必要的数据和显示数据。JSP页面可以使用HTML标记、Javabean标记以及Java程序片或Java表达式来显示数据。视图的主要工作就是显示数据,对数据的逻辑操作由控制器负责。
控制器(Controller) 一个或多个servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到Javabean中,然后servlet使用转发或重定向的方式请求视图中的某个JSP页面显示数据。比如让某个JSP页面通过使用Javabean标记、Java程序片或Java表达式显示控制器存储在Javabean中的数据。
在JSP中,MVC模式的实现如下图所示。
7.3 模型的生命周期与视图更新
使用MVC模式和前面学习的JSP+JavaBean模式有很大不同。在JSP+JaveBean模式中,由JSP页面通过使用useBean标记:
< jsp:useBean id="名字" class="创建Bean的类" scope="生命周期"/>
创建Bean。而在MVC模式中,由控制器servlet创建Bean,并将有关数据存储到所创建的bean中,热servlet请求某个JSP页面使用getProperty动作标记:
< jsp:getProperty name="名字" property ="bean的属性”/>
7.3.1 request bean
① bean的创建
servlet创建request bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到HttpServletRequest对象request中,并制定查找该bean的id:
request.setAttribute("keyWord",bean);
②视图更新
servlet所请求的JSP页面可以使用相应的标记显示该request bean中的数据。该JSP页面对请求做出响应之后,request bean所占有的内存被释放,结束自己的生命。
RequestDispatcher dispatcher= request.getRequestDispatcher("show.jsp");
dispatcher.forward(request,response);
servlet所请求的JSP页面,比如show.jsp页面可以使用如下标记获得servlet所创建的
request bean: <jsp:useBean id="keyWord" class="save.data.BeanClass" scope="request"/>
该标记中的id是servlet所创建的bean的id。 然后JSP页面可以使用相应的标记或程序片显示该request bean中的数据。
7.3.2 session bean
①bean的创建
servlet创建session bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到HttpServletSession对象session中,并制定查找该bean的id:
HttpSession session=request.getSession(true);
session.setAttribute("keyWord",bean);
②视图更新
Web服务目录的各个JSP都可以使用
<jsp:useBean id="keyWord" class="save.data.BeanClass" scope="session"/>
标记获得servlet所创建的session bean,然后使用相应的标记或程序片显示该request bean中的数据。 如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象转发到该页面,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)定向到该页面。
7.3.3 application bean
①bean的创建
servlet创建session bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)servlet使用getServlet() 方法返回服务器的Servlet Context内置对象的引用,将所创建的bean对象存放到服务器这个ServletContext内置对象中,并制定查找该bean的关键字。
HttpSession session=request.getSession(true);
session.setAttribute("keyWord",bean);
②视图更新
servlet建bean的第(2)步骤决定了bean为application bean。 用户在访问Web服务目录的各个JSP中都可以使用
<jsp:useBean id="keyWord" class="save.data.BeanClass" scope="application"/>
标记获得servlet所创建的application bean,然后使用相应的标记或程序片显示该application bean中的数据,例如,使用
<jsp:getProperty name="keyWord" property="bean的变量"/>
标记显示该application bean中的数据。 如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。
7.4 MVC模式的简单实例
MVC模式的简单实例有很多,在这里只举其中一个来体现MVC三个部分的设计与实现。
JSP页面example7_1.jsp提供一个表单,用户可以通过表单输入两个数、选择运算符号提交给servlet控制器。 bean负责存储运算数、运算符号和运算结果,servlet控制器负责运算,将结果存储在request bean中,并负责请求JSP页面example7_1.jsp显示request bean中的数据。
1.bean(模型):Example7_1_Bean.java:
package save.data;
public class Example7_1_Bean {
double numberOne,numberTwo,result;
String operator="+";
public void setNumberOne(double n){
numberOne=n;
}
public double getNumberOne(){
return numberOne;
}
public void setNumberTwo(double n){
numberTwo=n;
}
public double getNumberTwo(){
return numberTwo;
}
public void setOperator(String s){
operator=s.trim();;
}
public String getOperator(){
return operator;
}
public void setResult(double r){
result=r;
}
public double getResult(){
return result;
}
}
2.JSP页面(视图)example7_1.jsp:
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<jsp:useBean id="digitBean" class ="save.data.Example7_1_Bean" scope="request"/>
<style>
#tom{
font-family:宋体;font-size:26;color:blue
}
</style>
<HTML><body bgcolor=#ffccff>
<form action="computer" id =tom method=post>
<table>
<tr><td id =tom> 输入两个数:</td>
<td id =tom>
<input type=text name="numberOne"
value=<%= digitBean.getNumberOne() %> id =tom size=6/></td>
<td><input type=text name="numberTwo"
value=<%=digitBean.getNumberTwo()%> id =tom size=6/></td>
</tr>
<tr><td id =tom>选择运算符号:</td>
<td id =tom>
<select id =tom name="operator">
<option value="+">+(加)
<option value="-">-(减)
<option value="*">*(乘)
<option value="/">/(除)
</select>
</td>
<td><input type="submit" id =tom value="提交" name="sub"/></td>
</tr>
</table></form>
<p id=tom>
运算结果:
<jsp:getProperty name="digitBean" property="numberOne"/>
<jsp:getProperty name="digitBean" property="operator"/>
<jsp:getProperty name="digitBean" property="numberTwo"/> =
<jsp:getProperty name="digitBean" property="result"/>
</p></body></HTML>
3.servlet(控制器)Example7_1_Servlet.java:
package handle.data;
import save.data.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example7_1_Servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
Example7_1_Bean digitBean = null;
digitBean = new Example7_1_Bean(); //创建Javabean对象.
//digitBean 是request bean:
request.setAttribute("digitBean",digitBean);
String str1 = request.getParameter("numberOne");
String str2 = request.getParameter("numberTwo");
if(str1==null||str2==null)
return;
if(str1.length()==0||str2.length()==0)
return;
double numberOne = Double.parseDouble(str1);
double numberTwo = Double.parseDouble(str2);
String operator = request.getParameter("operator");
double result=0;
if(operator.equals("+"))
result = numberOne+numberTwo;
else if(operator.equals("-"))
result = numberOne-numberTwo;
else if(operator.equals("*"))
result = numberOne*numberTwo;
else if(operator.equals("/"))
result = numberOne/numberTwo;
digitBean.setNumberOne(numberOne); //将数据存储在digitBean中
digitBean.setNumberTwo(numberTwo);
digitBean.setOperator(operator);
digitBean.setResult(result);
//请求example7_1.jsp显示digitBean中的数据:
RequestDispatcher dispatcher= request.getRequestDispatcher("example7_1.jsp");
dispatcher.forward(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doPost(request,response);
}
}
运行结果:
小结
➢MVC模式的核心思想是有效地组合“视图”“模型”和“控制器”。在JSP技术中,视图是一个或多个JSP页面,其作用主要是向控制器提交必要的数据和为模型提供数据显示;模型是一个或多个JavaBean对象,用于存储数据;控制器是一个或多个servlet 对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到JavaBean中,然后servlet使用重定向方式请求视图中的某个JSP页面更新显示。
➢在MVC模式中,模型也可以由控制器负责创建和初始化。