浅谈MVC架构模式

摘要:
MVC英文名为Model-View-Controller,它将应用程序分为三层:视图层、模型层和控制层。控制层控制整个业务流程。为了熟悉MVC架构模式,将学生查询改为MVC模式。这样,基于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会改变

   

浅谈MVC架构模式第1张

浅谈MVC架构模式第2张

免责声明:文章转载自《浅谈MVC架构模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript中的鼠标事件如何将cocos、spine等骨骼文件转换成dragonbones的骨骼文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

常见的几种数据加密与应用场景

起因 最近被一个同事问到,在网络交互中,那部分数据需要被加密那一部分不需要被加密。我觉得这个问题有点太泛了,所以给他科普了一次常见的数据加密与应用场景的课。突然间觉得这个还挺有教育意义的。所以我还是吧这个记录一下吧。 啊,年轻犯下的错 当初我们给某个建站平台做手机客户端的时候就没有考虑这些事情,现在想想被攻击实在是太简单了。我们当初做的内容其实根本就没有...

Java:String和Date、Timestamp之间的转换

一、String与Date(java.util.Date)互转      1.1 String -> Date String dateStr = "2010/05/04 12:34:23";            Date date = new Date();            //注意format的格式要与日期String的格式相匹配  ...

DB2 日期时间函数

db2日期时间函数 (DATE(TRIM(CHAR(DT#11Y))||'-'||TRIM(CHAR(DT#11M))||'-'||TRIM(CHAR(DT#11D))) BETWEEN DATE('" & strDate1 & "') AND DATE('" & strDate2 & "')) (Y > y) OR...

mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据

转自: https://blog.csdn.net/tsxw24/article/details/44994835 我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题。但这两天缺遇到一个严重的问题,在按时间戳升序排列并用limit分批读取数据时,却发现在某些记录丢失了,表中明明有的记录确死活读取不到。研究了大半天终于发现了...

java 数据库查询Date类型字段 没有了时分秒 全为 00 的解决办法

数据库查询时间没有了时分秒的解决办法问题出处,公司一个项目中使用动态sql方式查询Oracle数据库,在展示时Date类型字段只展示日期,无时分秒。分析:1、众所周知Oralce的日期类型有很多种,Date ,Timestamp等。其中Date类型对用的是java.sql.Date类型,Timestamp对用的是java.sql.Timestamp类型。这...

.NET 搭建简单的通知服务

搭建简单的通知服务 Intro 很多情况下,我们都会遇到一些需要进行通知报警的场景,比如说服务器资源监控报警,抢到火车票后通知用户进行付款。 原来主要是用的钉钉群里的机器人来做的通知,周末看到原来做 【Server 酱】的大佬写了一个简单的基于企业微信的微信推送,代码是 PHP 的非常简单,可以参考:https://github.com/easychen/...