MVC:Model、Control、View结合J2EE可以简单的理解是:jsp(V)+servlet(C)+javabean(M)。jsp,主要负责界面显示,是html和java代码的混合,servlet主要负责对请求的控制,javabean可以理解成业务逻辑层的类,负责业务处理。
需要注意的是:MVC也是分层的思想的体现,但它有别于.net中的三层,也有别于设计模式。具体区别,不做深究。
下面是一个根据起止日期查询学生信息的mvc的概要实现:
web客户端( query_condention.jsp)是查询界面;SearchStudentServlet.java负责控制;student_list.jsp负责查询结果的显示(View);StudentManager.java是Model,负责具体的业务逻辑,执行查询的动作。
query_condention.jsp:和asp类似,也是由页面指令和大量的HTML代码组成。
<%@ page language="java" contentType="text/html"; charset="GBK"%>
<html>
<head>
<title>学生信息查询</title>
</head>
<body>
<form action ="query_student.jsp" method ="post">
出生日期:<input type ="text" name ="beginDate" >至<input type ="text" name ="endDate" >
<input type ="submit" value ="查询学生">
</body>
</html>
import java.util.*;
import java.io.*;
import javax.servlet.http.*;
import javx.servlet.*;
import com.bjpowernode.exam.model.*;
import com.bjpowernode.exam.model.*;
public class SearchStudentServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String sBeginDate = request.getParameter("beginDate");
String sEndDate = request.getParameter("endDate");
Date beginDate = new Date();
Date endDate = new Date();
try {
beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(sBeginDate);
endDate = new SimpleDateFormat("yyyy-MM-dd").parse(sEndDate);
}catch(Exception e) {
e.printStackTrace();
}
StudentManager studentManager = new StudentManagerImpl();
List<Student> studentList = studentManager.findStudnetList(beginDate,endDate);
//将学生列表设置到request范围中
request.setAttribute("student_list",studentList);
//转发:在服务端转发,客户端是不知道的
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
//将studentList放到session中
//HttpSession session =request.getSession();
//session.setAttribute("student_list",studentList);
//重定向,不会共享request,request.getContextPath()用于获取当前目录到跟目录的路径
//response.sendRedict(request.getContextPath()+"/student_list.jsp");
//以下写法错误,/代表8080端口,或者可以理解成跟目录
//response.sendRedict("/studentList.jsp");
}
student_list.jsp:接收数据,显示在界面上。
<%@ page language="java" contentType="text/html"; charset="GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import ="com.bjpowernode.exam.model.*"%>
<%@ page import ="com.bjpowernode.exam.manager.*"%>
<html>
<head>
<title>学生信息查询</title>
<style type ="text/css">
table {
border:1px solid black;
border-collapse:collapse;
}
td{
border:1px solid black;
border-collapse:collapse;
}
</style>
</head>
<body>
<table border ="1">
<tr>
<td>学生代码</td>
<td>姓名</td>
<td>性别</td>
<td>出生日期</td>
<td>联系电话</td>
<td>家庭住址</td>
<td>班级名称</td>
<td>年龄</td>
</tr>
<%
List <Student> studentList =(List) request.getAttribute("student_list");
//如果servlet使用的是session,那么这里就要对应成session
//List <Student> studentList =(List) session.getAttribute("student_list");
for (Iterator<Student> iter = studentList.iterator();iter.hasNext();){
Student student = iter.next();
}
%>
<tr>
<td><%=student.getStudentId()%></td>
<td><%=student.getStudentName()%></td>
<td><%=student.getSex()%></td>
<td><%=new SimpleDateFormat("yyyy-MM-dd").format(student.getBirthDay())%></td>
<td><%=student.ContextTel()%></td>
<td><%=student.getAddress()%></td>
<td><%=student.getClasses().getClassesName()%></td>
<%
long b =1000L*60L*24L*365L;
long a =System.currentTimeMillis()-student.getBirthDay().getTime();
%>
<td><%= a/b%></td>
</tr>
</table>
</body>
</html>
我们可以看到,在View的jsp中是大量的html和java代码的混合,在查询条件界面query_condention.jsp主要是html,因为不涉及后台数据的交互,所以,java代码就少一些,这些页面的头部都需要java的指令,说明页面的编码方式等。
在负责显示的jsp页面中,需要遵循一定的语法规范,如:<% %>作为局部变量出现;<!% %>作为全局变量出现;<%= %>=后面必须是字符串变量或者可以被转换成字串的表达式,不需要以分号结束,只有一行;<% //.....%> <% --.......--%> <% /*.....*/%>用于jsp的注释。
这里补充一点:<% %>作为局部变量出现,不能用于定义方法。因为jsp脚本相当于方法,不能在方法里定义方法。如:
<%!public void helloworld(){}%> //可以声明方法
<% public void helloworld(){}%> //编译出错;脚本不能定义方法
StudentManager.java:就是一个纯java类,相当于三层中的B层,没有其他特别的地方,就不再列代码。
总结:
上面的 query_condention.jsp(查询条件)+SearchStudentServlet.java(请求控制Control部分)+student_list.jsp(界面显示)的组合相当于三层中的U层,都与界面的显示相关,而StudentManager.java才是进入业务处理。故,我们可以简单理解成,MVC就是java基于U层的又一个细化,将界面显示和请求处理做了进一步细化分工。
初识MVC,理解可能会有偏颇,欢迎大家斧正!