zoukankan      html  css  js  c++  java
  • MVC设计模式

    Java Web开发中MVC设计模式简介

     

    一、有关Java Web与MVC设计模式

         学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里。

         Java是一门应用设计模式比较广泛的语言。目前主流提出的23种设计模式均可在Java语言编写的程序中所应用。目前主流在Java Web应用中应用的最广泛的设计模式便是MVC模式,目前的主流Web框架大多也是基于MVC设计模式所编写的。

    二、MVC在Java Web应用中的具体应用

    所谓MVC,即Model-View-Controller。

    (1)Model层:Model指模型部分,一般在应用中Model层包括业务处理层和数据访问层。数据访问层主要是对数据库的一些操作的封装。业务处理层应用JavaBean构建,  JavaBean主要是用作将从View层获取的数据和数据库的数据进行桥接。除却JavaBean以外,若想构建分布式应用系统,可以应用EJB组件进行业务逻辑层的构建。

    (2)Controller层:Controller指控制部分,一般是对View层提交的请求为其设置对应的Servlet进行特定功能的处理,这里的进行特定功能的处理一般是编写在Model中的业务处理层中的。Controller一般只是在Web应用中充当一个中介者的作用。

    (3)View层:View指视图部分,这一部分的内容是展示给用户实际进行交互的,通常使用JSP和HTML进行构建(个人比较喜欢以HTML嵌入JSP的方式来构建网页)。

    综上来说,一个小型完整的基于MVC设计模式的Web应用程序的处理流程应该如下:

          由上面的图中我们可以看出,用户在客户端(Web应用的客户端即为浏览器)中发出请求的时候,请求首先由View层的JSP/HTML将HTTP请求传给控制器中对应的Servlet,然后由Servlet负责调用Model层中的业务逻辑处理部分进行要求的处理,处理期间如果设计数据库的操作,则与数据库进行操作,最后全部操作结束之后,由业务逻辑层将结果发给控制层,控制层以HTTP响应的形式将结果发送回客户端。

    三、一个MVC设计模式的小例子

    我们的这个例子是运用MVC技术和基本的Java Web技术进行一个用户注册和信息查询的Web应用的制作。项目工程文件夹目录如下:

    1.View层的编写

    在这里我们模仿制作一个用户进行的注册界面,并在表单中指定接受请求并处理该页面的Servlet。View层主要是由jsp、HTML编写而成。

    其中的一个jsp示例文件如下:

    复制代码
     1 <%@ page language="java" import="java.util.*" contentType="text/html"; charset="utf-8" pageEncoding="utf-8"%>
     2 <%
     3 String path = request.getContextPath();
     4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     5 %>
     6 
     7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     8 <html>
     9   <head>
    10     <base href="<%=basePath%>">
    11     
    12     <title>用户注册界面</title>
    13     
    14     <meta http-equiv="pragma" content="no-cache">
    15     <meta http-equiv="cache-control" content="no-cache">
    16     <meta http-equiv="expires" content="0">    
    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    18     <meta http-equiv="description" content="This is my page">
    19     <!--
    20     <link rel="stylesheet" type="text/css" href="styles.css">
    21     -->
    22 
    23   </head>
    24   <body style="text-align=:center">
    25       <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
    26         <table width="60%" border="1">
    27                 <tr>
    28                     <td>用户名</td>
    29                     <td>
    30                         
    31                         <input type="text" name="userName">
    32                     </td>
    33                 </tr>
    34                 <tr>
    35                     <td>密码</td>
    36                     <td>
    37                         <input type="password" name="passWord">
    38                     </td>
    39                 </tr>
    40                 
    41                 <tr>
    42                     <td>你出生的城市是哪里</td>
    43                     <td>
    44                         <input type="text" name="answer">
    45                     </td>
    46                 </tr>
    47                 <tr>
    48                     <td>
    49                         <input type="reset" value="清空">
    50                     </td>
    51                     <td>
    52                         <input type="submit" value="注册">
    53                     </td>
    54                 </tr>
    55             </table>
    56         </form>
    57   </body>
    58 </html>
    复制代码

    在jsp文件中我们指定了接受该页面并进行处理的表单。表单在Web应用中是十分重要的,目前Web应用的前后端传输数据的时候多数都要用到表单。

    2.Controller层的编写

    Controller层主要编写接受View层请求的Servlet。示例Servlet如下:

    复制代码
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.gaodongyan.bean.UserBean;
    import com.gaodongyan.service.ResigerInfo;
    
    
    @WebServlet("/ResigerServlet")
    public class ResigerServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
            public ResigerServlet() {
                 super();
            
        }
    
        /*UserBean:userName,passWord,answer
         * 在doGet()方法中,我们利用HttpServletRequest类中封装的方法进行对页面元素的调用
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            UserBean user = new UserBean();
            user.set_userName(request.getParameter("userName"));
            user.set_passWord(request.getParameter("passWord"));
            user.set_answer(request.getParameter("answer"));
            String sql = "INSERT INTO USERINFO ([username],[password],[answer]) values (" + user.get_userName() + "," + user.get_passWord() + "," +user.get_answer() + ")";
            ResigerInfo resigerInfo = new ResigerInfo();
            resigerInfo.interToDb(sql);
            
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    复制代码

    3.Model层的编写

    Model层在具体的编写中包括dao层和bean层还有service层。

    (1)bean层:bean层中编写数据模型类。

    示例Bean如下:

    复制代码
     1 public class UserBean {
     2     private String userName;
     3     private String passWord;
     4     private String answer;
     5     public void set_userName(String userName) {
     6         this.userName = userName;
     7     }
     8     public void set_passWord(String passWord) {
     9         this.passWord = passWord;
    10     }
    11     public void set_answer(String answer) {
    12         this.answer = answer;
    13     }
    14     public String get_userName() {
    15         return userName;
    16     }
    17     public String get_passWord() {
    18         return passWord;
    19     }
    20     public String get_answer() {
    21         return answer;
    22     }
    23 }
    复制代码

    (2)dao层负责与数据库进行交互。

    示例dao层如下:其中GetConnection类返回一个数据库连接,UpdateDb类负责通过调用GetConnection来获得一个连接对象,再进行具体的数据库操作。

    复制代码
     1 class GetConnection {
     2     
     3     private String url;
     4     private String userName;
     5     private String password;
     6     Connection conn ; 
     7     public Connection getConnection() {
     8         try {
     9             Class.forName("com.mysql.jdbc.Driver");
    10         }catch(ClassNotFoundException e) {
    11             
    12         }
    13         try {
    14             conn = DriverManager.getConnection(url, userName, password);
    15         } catch (SQLException e) {
    16             // TODO Auto-generated catch block
    17             e.printStackTrace();
    18         }
    19         return conn;
    20         
    21     }
    22 }
    复制代码

    注:在此处略去了数据库连接所需要的url、username、password。在具体操作的时候则需要指定这三项。

    复制代码
     1 public class UpdateDb {
     2     Connection conn;
     3     Statement stmt;
     4     ResultSet result;
     5     public void doUpdate(String sql) {
     6         GetConnection getedConnection = new GetConnection();
     7         conn = getedConnection.getConnection();
     8         try {
     9             stmt = conn.createStatement();
    10             stmt.executeQuery(sql);
    11             
    12         } catch (SQLException e) {
    13             e.printStackTrace();
    14         }
    15         
    16     }
    17 }
    复制代码

    (3)service层:service层负责编写具体的业务逻辑,由于我们的示例中的业务逻辑比较简单,故此处编写的代码较少。对于大型项目来说,业务逻辑层一般需要进行很多的业务处理。

    示例如下:

    复制代码
    1 public class ResigerInfo {
    2     //We can set a unique sql in this place.
    3     public void interToDb(String sql) {
    4         UpdateDb updateDb = new UpdateDb();
    5         updateDb.doUpdate(sql);
    6     }
    7 }
    复制代码

    4.Demo总结

          博文中贴出的代码是用户注册时需要的步骤。由于多个类和层间存在调用关系,所以大家在看贴出的源码时可能会有理解的问题。所有类都已经在最开始的项目结构图中体现了,相信对比着项目结构图大家都会很容易明白MVC设计模式的基本调用历程。

    四、总结

    由于时间仓促,导致示例Demo没有全部完成,待这几天完成后会上传到github并共享。相信有了这篇博文,大家应该对MVC设计模式在Java Web中的基本应用有了简单的了解。后期博主还会对目前主流的Java Web框架进行介绍。本博客纯属个人学习总结,如有不足请各位批评指正。

  • 相关阅读:
    Google androd性能优化经典
    java Linkedhashmap源码分析
    android smali代码注入 实战一
    开源库ActiveAndroid + gson使用
    android开源项目:图片下载缓存库picasso
    第四次博客作业-结对项目
    第九次作业
    第八次作业
    软件工程第三次作业——关于软件质量保障初探
    第七次作业
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5496841.html
Copyright © 2011-2022 走看看