zoukankan      html  css  js  c++  java
  • mvc模式

    MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式。

    这样,一个JAVA WEB应用程序划分为表示层,控制层,业务逻辑层和数据持久层,形成了一个多层系统。对于大型,复杂的WEB应用程序,这样的是十分必要的!
    下面来构建一个简单的基于MVC模式的JAVA  WEB应用程序,我们按照MVC设计模式,用JSP,Servlet及Java Bean构建一个简单的登录系统。该系统要求当用户在登录页面上输入用户名和密码并提交后,系统将检查该用户中否已经注册,如果该用户已经注册,系统进入主页面,否则进入注册页面!
    我们将 按以下步骤构建这个系统:
    Step1:数据库的设计,使用MySQL作为数据库,构建数据表T_UserInfo;
    Step2:构建视图组件:登录页面login.jsp,主页面main.jsp,以及注册页面register.jsp;
    Step3:构建控制层组件,一个Servlet,;取名为LoginServlet.java;
    Step4:构建业务逻辑层组件(Model组件),一个JavaBean,取名为LoginHandler.java;
    Step5:构建数据访问层组件:珍上数据访问类,取名dbPool.java;
    Step6:编译,打包程序;
    Step7:部署该程序到Web服务器Tomcat中,然后运行!
    该系统的工作流程图如下:

    详细设计:
    A:用户登录涉及数据库操作的用例!我们在MySQL中 建立一个T_UserInfo表,DDL语句如下:

    create table T_UserInfo
    (
        ID bigint primary key auto_increment,
        userName varchar(20),
        userPwd varchar(20)
    )
    --并添加一条测试数据用户名及密码均为fengyan
    insert into T_UserInfo(userName,userPwd) values('fengyan','fengyan')

    B:构建视图组件,由前面的分析可知本例有三个视图组件,分别是登录页面login.jsp,主页面main.jsp,以及注册页面register.jsp.它们之间的关系是当用户在登录页面login.jsp上填入用户名及密码并提交后,系统将 检测该用户是琐已经注册,如果已经注册则进入main.jsp,否则进入注册页面!
    login.jsp代码如下:

    <%@ page language="java" pageEncoding="GBK"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html:html lang="true">
      <head>
        <html:base />    
        <title>login.jsp</title>
      </head>  
      <body>
      <form action="servlet/LoginServlet" method="post" >     
          <table border="0">
            <tr>
              <td>Login:</td>
              <td><input type="text" name="userName" /></td>
            </tr>
            <tr>
              <td>Password:</td>
              <td><input type="password" name="userPwd" /></td>
            </tr>
            <tr>
              <td colspan="2" align="center"><input type="submit" value="login"></td>
            </tr>
          </table>
    </form>
      </body>
    </html:html>

    当用户按下登录后就提交给叫做LoginServlet的Servlet,以做进一步处理!

    为方便起见,主页面main.jsp的内容设计的很简单。当用户登录成功后,系统转入main.jsp告诉用户已经登录成功,现已进入主页面。main.jsp代码如下:

    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding="GBK"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <title>Insert title here</title>
    </head>
    <body>
    <%=session.getAttribute("userName") %>,你成功登录,现已进入主页面!
    </body>
    </html>

    注册页面,register.jsp的内容也设计的很简单。当用户登录失败后,系统进入register.jsp,告诉用户登录失败,代码如下:

    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding="GBK"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <title>Insert title here</title>
    </head>
    <body>
    <%=session.getAttribute("userName") %>,你未能成功登录,现进入注册页面,请注册你的信息!
    </body>
    </html>


    C:构建数据访问组件,先创建一个属性文件db.properties用于设置库连接信息代码如下:

    DBDriver=com.mysql.jdbc.Driver
    Connection=jdbc:mysql://localhost:3306/study
    User=root
    Password=root

    本用例的数据访问组件是DbPool,代码如下:

    package data;
    /**
     * 数据访问组件
     * @author fengyan
     * @date 2007-01-06 03:25
     */
     */
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Properties;

    public class DbPool {

        private static DbPool instance = null;
        private DbPool()
        {
            super();
        }
        //取得连接
        public static synchronized Connection getConnection()
        {
            if(instance == null)
                instance = new DbPool();
            return instance._getConnection();
        }
        private Connection _getConnection()
        {
            try
            {
                String dBDriver = null;
                String connectionUrl = null;
                String user = null;
                String password = null;
                
                Properties p = new Properties();
                InputStream inStream = getClass().getResourceAsStream("db.properties");
                p.load(inStream);
                
                dBDriver =p.getProperty("DBDriver",dBDriver);
                connectionUrl = p.getProperty("Connection",connectionUrl);
                user = p.getProperty("User","");//默认值为空
                password = p.getProperty("Password","");
                
                //加载驱动
                Class.forName(dBDriver).newInstance();
                return DriverManager.getConnection(connectionUrl+"?user="+user+"&password="+password);
                
            }catch(Exception e)
            {
                System.out.println(e);
                return null;
            }
        }
        
        //释放资源
        public static void DBClose(Connection con ,PreparedStatement ps,ResultSet rs)
        {
            try
            {
                if(rs !=  null)
                    rs.close();
                if(ps != null)
                    ps.close();
                if(con != null)
                    con.close();
            }catch(Exception e)
            {
                System.out.println(e);
            }
        }
    }

    DbPool先从一个属性文件db.properties中获取数据库驱动程序名,URL,用户名和密码,然后利用这些信息连接数据库,取得连接!

    D:构建模型组件,本用例的模型组件(或称为业务逻辑组件)是LoginHandler,代码如下:

    package model;
    /**
     * 模型组件
     * @author fengyan
     * date 2007-01-06 03:27
     */
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;

    import data.DbPool;

    public class LoginHandler {

        Connection con;
        PreparedStatement ps;
        ResultSet rs;
        
        //检查是否已经注册
        public boolean checkLogin(ArrayList arr)
        {
            //从数据访问组件中取得连接
            con = DbPool.getConnection();
            //得到Controller传入的用户输入的用户名及密码
            String userName = (String)arr.get(0);
            String userPwd = (String)arr.get(1);
            
            String strSql = "select * from T_UserInfo where userName=? and userPwd=?";
            try
            {
                ps = con.prepareStatement(strSql);
                ps.setString(1,userName);
                ps.setString(2, userPwd);
                rs = ps.executeQuery();
                if(rs.next())
                {    
                    //释放资源
                    DbPool.DBClose(con, ps, rs);            
                    return true;
                }
                else
                {
                    //释放资源
                    DbPool.DBClose(con, ps, rs);
                    return false;
                }            
            }catch(Exception e)
            {
                System.out.println(e);
                return false;
            }
            
        }
    }


    E:本用例的控制组件是一个Servlet,叫做LoginServlet,代码如下

    package controller;
    /**
     * 控制器
     * @author fengyan
     * date 2007-01-06 03:29
     */
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import model.LoginHandler;

    public class LoginServlet extends HttpServlet {

        private static final String CONTENT_TYPE = "text/html;charset=GBK";

        public LoginServlet() {
            super();
        }

        public void destroy() {
            super.destroy(); // Just puts "destroy" string in log
            // Put your code here
        }

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            doPost(request,response);
        }

        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            //从请求中取出用户名和密码
            String userName = request.getParameter("userName");
            String userPwd = request.getParameter("userPwd");
            //生成一个ArrayList对象,并把用户名和密码的值存入该对象中
            ArrayList arr = new ArrayList();
            arr.add(userName);
            arr.add(userPwd);
            
            //生成一个Session对象
            HttpSession session = request.getSession(true);
            session.removeAttribute("userName");
            session.setAttribute("userName", userName);
            
            //调用模型组件
            LoginHandler login = new LoginHandler();
            boolean flag = login.checkLogin(arr);
            
            //如果已注册
            if(flag)
            {
                response.sendRedirect("/MVC/main.jsp");
            }
            else
            {
                response.sendRedirect("/MVC/register.jsp");
            }
        }

        public void init() throws ServletException {
            // Put your code here
        }

    }


    该组件先处理Http POST请求,然后调用模型组件或业务逻辑组件LoginHandler检查该用户是否已注册如注册,则转入main.jsp,否则转入register.jsp,另外,Servlet都要在web.xml中声明,

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     <welcome-file-list>
         <welcome-file>/login.jsp</welcome-file>
     </welcome-file-list>
      <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>controller.LoginServlet</servlet-class>
      </servlet>

      <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/LoginServlet</url-pattern>
      </servlet-mapping>
    </web-app>

    到此,整个系统完成设计!运行结果达到我们预期的的效果!

    总结:上面结合使用JSP,Servlet和JavaBean构建了一个简单的基于MVC模式的登录系统。但我们看到在用这种方式构建的Java Web 应用系统中,控制器LonginController中包含重定向页面的名称,如下:

    if(flag)
            {
                response.sendRedirect("/MVC/main.jsp");
            }
            else
            {
                response.sendRedirect("/MVC/register.jsp");
            }


    这样会使系统的视图组件与控制层组件耦合很紧密,不便于系统的扩展和维护。对于大型Java Web系统,这样的紧密耦合性会合系统的扩展和维护变的十分困难。为了解决这些问题,一些优秀的MVC框架出现了,而Struts就是其中应用最普遍的一个。

  • 相关阅读:
    [05] EL表达式
    [03-01] JSP自定义标签
    [04] JSP标准动作
    [03] JSP指令
    Fiddler抓包调试前端脚本代码
    《互联网协议入门》思维导图笔记
    Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
    Nodejs学习笔记(九)—与Redis的交互(mranney/node_redis)入门
    Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)
    Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例
  • 原文地址:https://www.cnblogs.com/steel-chen/p/6742621.html
Copyright © 2011-2022 走看看