• 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框架进行介绍。本博客纯属个人学习总结,如有不足请各位批评指正。

  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5496841.html
Copyright © 2020-2023  润新知