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>
SearchStudentServlet.java:Control,控制分发客户端发过来的请求,调用Model(StudentManager.java),然后将数据移交给View(student_list.jsp)去显示。
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,理解可能会有偏颇,欢迎大家斧正!