浅谈MVC架构模式
MVC英文即Model-View-Controller,就是把一个应用分为三个层:视图层、模型层、控制层。
模型层(M)用于封装业务逻辑。
视图层(V)也叫表示层,就是与用户实现交互的界面,通常实现数据的输入和输出功能。
控制层(C)起到控制整个业务流程的作用。简单的说就是调用业务逻辑,然后把得到的数据转发给视图显示给用户。
为了熟悉MVC架构模式,特意将学生查询改成了MVC模式的。
1.首先建立客户端页面(student.jsp):
1 <%@ page language="java" contentType="text/html;charset=GB2312" %> 2 3 <html> 4 <head> 5 <title>学生信息</title> 6 </head> 7 <body> 8 <form action="SearchStudentServlet" method="GET"> 9 出生日期:<input type="text" name="begindate">至<input type="text" name="enddate"> 10 <input type="submit" value="查询"> 11 </form> 12 </body> 13 </html>
2.建立控制层,也就是一个Servlet(SearchStudentServlet.java)
1 import java.io.*; 2 import java.util.*; 3 import java.sql.Timestamp; 4 import java.text.*; 5 import com.pojo.*; 6 import com.services.*; 7 import javax.servlet.*; 8 import javax.servlet.http.*; 9 public class SearchStudentServlet extends HttpServlet{ 10 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ 11 doPost(request,response); //如果是GET提交就调用doPost()来执行 12 } 13 public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ 14 String sBeginDate = request.getParameter("begindate"); 15 String sEndDate = request.getParameter("enddate"); 16 //将字符串转换为Timestamp 17 Timestamp beginDate = Timestamp.valueOf("1900-1-1 00:00:00"); 18 Timestamp endDate = Timestamp.valueOf("1900-1-1 00:00:00"); 19 try{ 20 beginDate = Timestamp.valueOf(sBeginDate+" 0:0:0"); 21 endDate = Timestamp.valueOf(sEndDate+" 0:0:0"); 22 }catch(Exception e){ 23 e.printStackTrace(); 24 } 25 StudentService ss = new StudentService(); 26 //从数据库中查询结果 27 List<Student> l = ss.getStudentByDate(beginDate,endDate); 28 29 //将列表放到request里面去 30 request.setAttribute("student_list",l); 31 //转发 32 request.getRequestDispatcher("/student_list.jsp").forward(request,response); 33 34 } 35 }
然后将其编译,放到classes目录下。
3.建立视图层,也就是用于显示查询结果的JSP(student_list.jsp)
1 <%@ page language="java" contentType="text/html;charset=GB2312" %> 2 <%@ page import="java.sql.Timestamp"%> 3 <%@ page import="java.text.*"%> 4 <%@ page import="java.util.*"%> 5 <%@ page import="com.pojo.*"%> 6 <%@ page import="com.services.*"%> 7 <html> 8 <head> 9 <title>学生信息</title> 10 </head> 11 <body> 12 <table border="1"> 13 <tr> 14 <td>学号</td> 15 <td>姓名</td> 16 <td>出生日期</td> 17 <td>性别</td> 18 <td>家庭住址</td> 19 </tr> 20 <% 21 List<Student> l = (List)request.getAttribute("student_list"); 22 for(Iterator<Student> iter=l.iterator();iter.hasNext();){ 23 Student s = iter.next(); 24 %> 25 <tr> 26 <td><%=s.getSId()%></td> 27 <td><%=s.getSName()%></td> 28 <td><%=new SimpleDateFormat("yyyy-MM-dd").format(s.getSDate())%></td> 29 <td><%=s.getSSex()%></td> 30 <td><%=s.getSAddr()%></td> 31 </tr> 32 <%}%> 33 </table> 34 </body> 35 </html>
4.建立模型层,把先前弄好的业务逻辑exam.jar和数据库驱动拷贝到lib目录下。
这样,基于MVC架构的学生查询已经做好。因为这是一个小小的功能,用这种架构显得页面有点多,如果项目大一点的话就会显得层次分明,MVC的优点就能够明显的体现出来。
现在来分析一下以上功能:
首先用户将数据提交给控制层,即SearchStudentServlet,SearchStudentServlet调用业务逻辑将结果查询出来放到一个列表里,然后再将数据发给表示层去显示给客户端。将数据从控制层交给表示层有两种方式,一种是转发,一种是重定向。
以上就是用转发的方式实现的,转发是在服务器端,客户端是不知道的,直接通过request.setAttribute("student_list",l)函数将结果放到request里面,然后再通过request.getRequestDispatcher("/student_list.jsp").forward(request,response)转发给表现层,这样在表现层student_list.jsp里面就可以直接通过request的getAttribute()函数取得结果值,再将其显示出来就可以了。
用重定向的方式也可以实现,重定向是不共享request的,客户端提交数据给SearchStudentServlet,然后又返回给客户端,这个request就作废了。通过下面方式可以将结果集放到session里面, HttpSession session = request.getSession();session.setAttribute("student_list",l);然后再通过response.sendRedirect(request.getContextPath() + "/student_list.jsp");将结果以重定向的方式发送给表示层student_list.jsp去显示。用这种方式的话客户端是可以看到的,因为客户端的URL会改变。