zoukankan      html  css  js  c++  java
  • 程序开发:MVC设计模式与应用

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

    下面讲解简单的登录操作:

    程序流程图:

    在本程序中用户输入的登陆信息提交给Servlet进行接收,Servlet接收到请求内容后首先对其合法性进行检验(例如:输入的内容是否为空或者长度是否满足要求等),如果验证失败,则将错误信息传递给登陆页显示,如果数据合法,则调用DAO层完成数据库的验证,根据验证的结构跳转到“登陆成功”或登陆失败的页面,在本程序中,为了操作便捷,将登陆成功或失败的显示页都统一设置成登陆页。
    MVC登陆程序清单:

    No.

    页面名称

    文件类型

    描述

    1

    User

    JavaBean

    用户登陆的VO操作类

    2

    DatabaseConnection

    JavaBean

    负责数据库的连接和关闭操作

    3

    IUserDAO

    JavaBean

    定义登陆操作的DAO接口

    4

    UserDAOImpl

    JavaBean

    DAO接口的真实实现类,完成具体的登陆验证

    5

    UserDAOProxy

    JavaBean

    定义代理操作,负责数据库的打开和关闭并且调用真实主题

    6

    DAOFactory

    JavaBean

    工厂类,取得DAO接口的实例

    7

    LoginServlet

    Servlet

    接收请求参数,进行参数验证,调用DAO完成具体的登陆验证,并根据DAO的验证结果返回登陆信息

    8

    login.jsp

    JSP

    提供用户输入的表单、可以显示用户登陆成功或失败的信息

    用户登陆表结构:

    JSP的功能

    通过本道MVC程序,读者可以清楚的感觉到,与最初的JSP开发(例如:JSP + JDBC或者是JSP + DAO)相比,现在的JSP页面中的代码已经减少了很多,只是简单的完成了输出,实际上在开发中,读者一定要记住JSP中最好只包含以下三种类型的代码:
    接收属性:接收从Servlet传递过来的属性;
    判断语句:判断传递到JSP中的属性是否存在;
    输出内容:使用迭代或者是VO进行输出。
    一定要记住一点,在JSP页面中唯一允许导入的包只能是java.util包,只要能把握住这一点,就可以开发出一个简洁、清晰的JSP页面。 
    理解了以上信息下面开始操作源代码
     User.java文件
    package com.mvc.oumyye.vo ;
    /**
     * 
     * @author 偶my耶
     *    实体类
     */
    public class User {
        private String userid ;
        private String name ;
        private String password ;
    
        public void setUserid(String userid){
            this.userid = userid ;
        }
        public void setName(String name){
            this.name = name ;
        }
        public void setPassword(String password){
            this.password = password ;
        }
        public String getUserid(){
            return this.userid ;
        }
        public String getName(){
            return this.name ;
        }
        public String getPassword(){
            return this.password ;
        }
    }
    DatabaseConnection.java
    package com.mvc.oumyye.dbc ;
    import java.sql.* ;
    /**
     * 
     * @author 偶my耶
     *    数据库连接
     */
    public class DatabaseConnection {
        private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
         private static final String DBURL = "jdbc:mysql://localhost:3306/mytest" ;
        private static final String DBUSER = "root" ;
        private static final String DBPASSWORD = "root" ;
        private Connection conn = null ;
        public DatabaseConnection() throws Exception{
            try{
                Class.forName(DBDRIVER) ;
                this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
            }catch(Exception e){
                throw e ;
            }
        }
        public Connection getConnection(){
            return this.conn ;
        }
        public void close() throws Exception{
            if(this.conn != null){
                try{
                    this.conn.close() ;
                }catch(Exception e){
                    throw e ;
                }
            }
        }
    
    }
    package com.mvc.oumyye.dao ;
    import com.mvc.oumyye.vo.User;
    public interface IUserDAO {
        
        public boolean findLogin(User user) throws Exception ;
    } 
    package com.mvc.oumyye.dao.impl ;
    
    import com.mvc.oumyye.dao.*;
    import com.mvc.oumyye.vo.User;
    import java.sql.* ;
    /**
     * 
     * @author 偶my耶
     *    Dao实现类
     */
    public class UserDAOImpl implements IUserDAO {
        private Connection conn = null ;
        private PreparedStatement pstmt = null ;
        public UserDAOImpl(Connection conn){
            this.conn = conn ;
        }
        public boolean findLogin(User user) throws Exception{
            boolean flag = false ;
            String sql = "SELECT name FROM user WHERE userid=? AND password=?" ;
            this.pstmt = this.conn.prepareStatement(sql) ;
            this.pstmt.setString(1,user.getUserid()) ;
            this.pstmt.setString(2,user.getPassword()) ;
            ResultSet rs = this.pstmt.executeQuery() ;
            if(rs.next()){
                user.setName(rs.getString(1)) ;    
                flag = true ;
            }
            this.pstmt.close() ;
            return flag ;
        }
    } 
    DAOFactory.java
    package com.mvc.oumyye.factory ;
    import com.mvc.oumyye.dao.*;
    import com.mvc.oumyye.dao.proxy.*;
    /**
     * 
     * @author 偶my耶
     *    工厂接口
     */
    public class DAOFactory {
        public static IUserDAO getIUserDAOInstance(){
            return new UserDAOProxy() ;
        }
    }
    UserDAOProxy.java
    package com.mvc.oumyye.dao.proxy ;
    import com.mvc.oumyye.dbc.DatabaseConnection;
    import com.mvc.oumyye.dao.IUserDAO;
    import com.mvc.oumyye.dao.impl.UserDAOImpl;
    import com.mvc.oumyye.vo.User;
    /**
     * 
     * @author 偶my耶
     *    工厂类 实现业务操作
     */
    public class UserDAOProxy implements IUserDAO {
        private DatabaseConnection dbc = null ;
        private IUserDAO dao = null ;
        public UserDAOProxy(){
            try{
                this.dbc = new DatabaseConnection() ;
            }catch(Exception e){
                e.printStackTrace() ;
            }
            this.dao = new UserDAOImpl(dbc.getConnection()) ;
        }
        public boolean findLogin(User user) throws Exception{
            boolean flag = false ;
            try{
                flag = this.dao.findLogin(user) ;    
            }catch(Exception e){
                throw e ;
            }finally{
                this.dbc.close() ;
            }
            return flag ;
        }
    } 
    LoginServlet.java
    package com.mvc.oumyye.servlet ;
    import java.io.* ;
    import java.util.* ;
    import javax.servlet.* ;
    import javax.servlet.http.* ;
    
    import com.mvc.oumyye.factory.DAOFactory;
    import com.mvc.oumyye.vo.User;
    /**
     * 
     * @author 偶my耶
     *    Servlet
     */
    public class LoginServlet extends HttpServlet {
        
        private static final long serialVersionUID = 1L;
        public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
    
            String path = "login.jsp" ;
            String userid = req.getParameter("userid") ;
            String userpass = req.getParameter("userpass") ;
            System.out.println(userid);
            System.out.println(userpass);
            List<String> info = new ArrayList<String>() ;    
            if(userid==null || "".equals(userid)){
                info.add("用户名不能为空!!!") ;
            }
            if(userpass==null || "".equals(userpass)){
                info.add("密码不能为空!!") ;
            }
            if(info.size()==0){    
                User user = new User() ;
                user.setUserid(userid) ;
                user.setPassword(userpass) ;
                try{
                    if(DAOFactory.getIUserDAOInstance().findLogin(user)){
                        info.add("欢迎" + user.getName() + "登陆") ;
                    } else {
                        info.add("请重新登录") ;
                    }
                }catch(Exception e){
                    e.printStackTrace() ;
                }
            }
            req.setAttribute("info",info) ;
            req.getRequestDispatcher(path).forward(req,resp) ;
        }
        public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
            this.doGet(req,resp) ;
        }
    
    
    }

    web.xml文件

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       version="2.5">
    
      <display-name>Welcome to Tomcat</display-name>
      <description>
         Welcome to Tomcat
      </description>
        <servlet>
            <servlet-name>login</servlet-name>
            <servlet-class>
                com.mvc.oumyye.servlet.LoginServlet
            </servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>login</servlet-name>
            <url-pattern>/LoginServlet</url-pattern>
        </servlet-mapping>
    </web-app>

    login.jsp文件

    <%@ page contentType="text/html" pageEncoding="GBK"%>
    <%@ page import="java.util.*"%>
    <html>
    <head><title></title></head>
    <body>
    <script language="javascript">
        function validate(f){
            if(!(/^w{5,15}$/.test(f.userid.value))){
                alert("用户ID必须是5~15位!") ;
                f.userid.focus() ;
                return false ;
            }
            if(!(/^w{5,15}$/.test(f.userpass.value))){
                alert("密码必须是5~15位!") ;
                f.userpass.focus() ;
                return false ;
            }
        }
    </script>
    <%
        request.setCharacterEncoding("GBK") ;
    %>
    <%
        List<String> info = (List<String>) request.getAttribute("info") ;
        if(info != null){    // 有信息返回
            Iterator<String> iter = info.iterator() ;
            while(iter.hasNext()){
    %>
                <h4><%=iter.next()%></h4>
    <%
            }
        }
    %>
    <form action="LoginServlet" method="post" onSubmit="return validate(this)">
        用户ID:<input type="text" name="userid"><br>&nbsp;&nbsp;码:<input type="password" name="userpass"><br>
        <input type="submit" value="登陆">
        <input type="reset" value="重置">
    </form>
    </body>
    </html>

    数据库文件.sql

    /*======================= 创建user数据表 =======================*/
    CREATE TABLE user(
        userid            VARCHAR(30)        PRIMARY KEY ,
        name            VARCHAR(30)        NOT NULL ,
        password        VARCHAR(32)        NOT NULL
    ) ;
    /*======================= 插入测试数据 =======================*/
    INSERT INTO user (userid,name,password) VALUES ('admin','administrator','admin') ;

    效果图:

    MVC设计模式的好处:

    JSP只负责显示
    DAO负责数据层操作
    Servlet连接JSP和DAO,并根据JavaBean的操作结果进行跳转
  • 相关阅读:
    集合类
    ajax技术
    Java中的Runnable、Callable、Future、FutureTask的区别与示例
    python 检测文件编码等
    android发送/接收Json包含中文的处理
    android 获取 imei号码 及相关信息
    RelativeLayout常用属性介绍
    Android之读取 AndroidManifest.xml 中的数据
    Java中int与Integer
    Handler sendMessage 与 obtainMessage (sendToTarget)
  • 原文地址:https://www.cnblogs.com/oumyye/p/4245111.html
Copyright © 2011-2022 走看看