Web開發模式【實例篇】MVC--邁向標準開發

 實例: 用一個用戶登陸驗證明例講解MVC設計模式html

   登陸程序以前已經學過,是使用JSP+JDBC完成的開發操做,可是以前的登陸程序開發中能夠發現有不少的問題,就是一個JSP文件中代碼過多了,即使是使用了JSP+javaBean的開發模式,其自己也存在JSP中代碼過多的問題。 java

   如今咱們就能夠利用MVC設計模式來完全解決掉這些代碼過多的問題了mysql

    在本程序中,用戶輸入的登陸信息提交給Servlet進行接收,Servlet接收到請求內容後首先對其合法性進行檢驗(若是輸入的內容是否爲空或者長度是否知足要求等),若是驗證失敗,則將錯誤信息傳遞給登陸頁顯示;若是數據合法,則調用DAO層完成數據庫的驗證,根據驗證的結構跳轉到登陸成功或登陸失敗的頁面web

 須要開發的頁面橄欖以下:sql

首先創建數據庫   (咱們用的數據庫是MySqL,不會的同窗能夠到這兒                http://zhaoyuqiang.blog.51cto.com/6328846/1127226)學習數據庫

  建立數據庫,名字爲:  51ctomvctest  設計模式

  建立表  ,  名字爲:  usermvc

  設計表,以下:(注意紅色部分,不要忘記編碼,不然可能出現不能輸入中文現象app

   在表中填寫信息,以下圖所示:jsp

 開發工具部署(咱們用的是MyEclipse)

 部署以下圖所示:

      

 

 導入sql的jar包文件,這個不用我再說了吧。

  代碼編寫

 按照DAO的設計標準,首先應該定義出VO

  
  
  
  
  1. User.java 
  2. //vo中的屬性與數據庫表中的屬性對應 
  3. package mvc.vo; 
  4. public class User { 
  5.      private String userid; 
  6.      private String name; 
  7.      private String password; 
  8.      public String getUserid(){ 
  9.          return userid; 
  10.      } 
  11.      public void setUserid(String userid){ 
  12.          this.userid=userid; 
  13.      } 
  14.      public String getPassword(){ 
  15.          return password; 
  16.      } 
  17.      public void setPassword(String password){ 
  18.          this.password=password; 
  19.      } 
  20.      public String getName(){ 
  21.          return name; 
  22.      } 
  23.      public void setName(String name){ 
  24.          this.name=name; 
  25.      } 

 DAO中須要進行數據庫的鏈接操做,須要DatabaseConnection的類負責數據的操做

  
  
  
  
  1.  DatabaseConnection.java 
  2. //負責數據庫的打開與關閉操做 
  3. package mvc.dbc; 
  4. import java.sql.*; 
  5. public class DatabaseConnection { 
  6.     private static final String DBdriver="org.gjt.mm.mysql.Driver"
  7.     private static final String DBURL="jdbc:mysql://localhost:3306/51ctomvctest"
  8.     private static final String DBUSER="root"
  9.     private static final String DBPASS="425680992"
  10.     private Connection conn=null;  
  11.     public DatabaseConnection()throws Exception{   //在構造方法中進行數據庫鏈接 
  12.        try{ 
  13.            Class.forName(DBdriver);//加載驅動程序 
  14.             this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);//鏈接數據庫 
  15.        }catch(Exception e){ 
  16.             throw e; 
  17.        }     
  18.    } 
  19.     public Connection getConnection(){//取得數據庫鏈接 
  20.       return this.conn;//取得數據鏈接  
  21.     } 
  22.     public void close()throws Exception{//關閉數據庫操做 
  23.         if(this.conn!=null){//避免NullPointerException 
  24.             try{ 
  25.                 this.conn.close();//關閉數據庫 
  26.             }catch(Exception e){ 
  27.                 throw e; 
  28.             } 
  29.         } 
  30.     } 

  因爲本程序的核心功能是完成用戶登陸驗證,因此在定義DAO的時候,定義一個驗證方法

  
  
  
  
  1. IUserDAO.java 
  2. //定義一個登錄驗證的方法,這個方法爲執行查詢操做,而且採用了findXxx()的命名形式 
  3. package mvc.dao; 
  4. import mvc.vo.User; //引用mvc.vo包裏面的User類 
  5. public interface IUserDAO { 
  6.         /** 
  7.          * 用戶登陸驗證 
  8.          *@param user 傳入VO對象 
  9.          *@param 驗證的操做結果 
  10.          *@throw Exception 
  11.          */ 
  12.     public boolean findLogin(User user)throws Exception; 

 下面分別編寫實現類和代理類

  
  
  
  
  1. UserDAOImpl.java 
  2. //定義實現類,在此類中將經過輸入用戶ID和密碼進行驗證, 
  3. //若是驗證成功,則經過VO將用戶的真實姓名取出並返回 
  4. package mvc.dao; 
  5. import java.sql.*; 
  6. import mvc.dao.IUserDAO; 
  7. import mvc.vo.User; 
  8. public class UserDAOImpl implements IUserDAO{ 
  9.     private Connection conn=null;//定義數據庫鏈接對象 
  10.     private PreparedStatement pstmt=null;//定義數據庫鏈接對象 
  11.     public UserDAOImpl(Connection conn){//設置數據庫鏈接 
  12.         this.conn=conn;  
  13.     } 
  14.     public boolean findLogin(User user)throws Exception{ 
  15.         boolean flag=false
  16.         try{ 
  17.             String sql="select name from user where userid=? and password=?"
  18.             thisthis.pstmt=this.conn.prepareStatement(sql);//實例化操做 
  19.             this.pstmt.setString(1,user.getUserid());//設置id 
  20.             this.pstmt.setString(2,user.getPassword());//設置密碼 
  21.             ResultSet rs=this.pstmt.executeQuery();//取得查詢結果 
  22.             if(rs.next()){ 
  23.                 user.setName(rs.getString(1));//取得姓名 
  24.                 flag=true;//登陸成功 
  25.             } 
  26.         }catch(Exception e){ 
  27.             throw e; 
  28.         }finally{ 
  29.             if(this.pstmt!=null){ 
  30.                 try{ 
  31.                     this.pstmt.close();//關閉操做 
  32.                 }catch(Exception e){ 
  33.                     throw e; 
  34.                 } 
  35.             } 
  36.         } 
  37.         return flag; 
  38.     } 
  39.     } 

  
  
  
  
  1. UserDAOProxy.java 
  2. package mvc.dao; 
  3. import mvc.dao.*; 
  4. import mvc.dbc.*; 
  5. import mvc.vo.*; 
  6. public class UserDAOProxy implements IUserDAO{ 
  7.   private DatabaseConnection dbc=null;//定義數據庫鏈接 
  8.   private IUserDAO dao=null;//定義DAO接口 
  9.   public UserDAOProxy(){ 
  10.       try{ 
  11.          this.dbc=new DatabaseConnection();//實例化數據庫鏈接  
  12.       }catch(Exception e){ 
  13.           e.printStackTrace(); 
  14.       } 
  15.       this.dao=new UserDAOImpl(this.dbc.getConnection()); 
  16.   } 
  17.   public boolean findLogin(User user)throws Exception{ 
  18.       boolean flag=false
  19.       try{ 
  20.           flag=this.dao.findLogin(user);//調用真實主題 
  21.       }catch(Exception e){ 
  22.           throw e; 
  23.        }finally{ 
  24.            this.dbc.close(); 
  25.        } 
  26.        return flag; 
  27.   } 

  定義工廠類 取得DAO實例

  
  
  
  
  1. DAOFactory.java 
  2. package mvc.factory; 
  3. import mvc.dao.*; 
  4. public class DAOFactory { 
  5.     public static IUserDAO getIUserDAOInstance(){//取得DAO實例 
  6.          return new UserDAOProxy();//返回代理實例  
  7.     } 
  8.     } 

 DAO的操做完成只是數據層的操做,下面須要編寫Servlet

  
  
  
  
  1.  LoginServlet.java 
  2. //定義Servlet,在Servlet中要接受客戶端發來的輸入數據 
  3. //同時要調用DAO,而且要根據DAO的結果返回響應的信息 
  4. //在Servlet中,首先定義對接受的userid和userpass兩個參數進行驗證,若是沒有輸入參數//或者是輸入的參數爲空,則會在info對象中增長相應的錯誤信息。 
  5. //當驗證經過後,程序將調用DAO進行數據層的驗證,並根據DAO的返回結果來決定返回//給客戶端的信息 
  6. package mvc.servlet; 
  7. import java.io.*; 
  8. import java.util.*; 
  9. import javax.servlet.*; 
  10. import javax.servlet.http.*; 
  11. import mvc.factory.*; 
  12. import mvc.vo.*; 
  13. public class LoginServlet extends HttpServlet{ 
  14.       public void doGet(HttpServletRequest req,HttpServletResponse resp) 
  15.               throws ServletException,IOException{ 
  16.           String path="login.jsp"
  17.           String userid=req.getParameter("userid");//接受userid內容 
  18.           String userpass=req.getParameter("userpass");//接受password內容 
  19.           List<String>info=new ArrayList<String>();//保存全部返回信息 
  20.           if(userid == null||"".equals(userid)){ 
  21.               info.add("用麼id不能爲空!"); 
  22.           } 
  23.           if(userpass==null||"".equals(userpass)){ 
  24.               info.add("密碼不能爲空!"); 
  25.           } 
  26.           if(info.size()==0){//用戶名和密碼驗證經過 
  27.             User user=new User();//實例化VO 
  28.             user.setUserid(userid);//設置userid 
  29.             user.setPassword(userpass);//設置password 
  30.             try{ 
  31.                 if(DAOFactory.getIUserDAOInstance().findLogin(user)){//驗證經過 
  32.                     info.add("用戶登陸成功,歡迎"+user.getName()+"光臨!"); 
  33.                 }else{ 
  34.                     info.add("用戶登陸失敗,錯誤的用戶名和密碼!"); 
  35.                 } 
  36.             }catch(Exception e){ 
  37.                 e.printStackTrace(); 
  38.             } 
  39.           } 
  40.           req.setAttribute("info",info);//保存錯誤信息 
  41.           req.getRequestDispatcher(path).forward(req, resp);//跳轉 
  42.         } 
  43.       public void doPost(HttpServletRequest req,HttpServletResponse resp) 
  44.                throws ServletException,IOException{ 
  45.           this.doGet(req, resp);//調用doGet()操做 
  46.       } 

 編寫前臺顯示登陸頁login.jsp

  
  
  
  
  1. login.jsp 
  2. <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> 
  3. <%@ page import="java.util.*"%> 
  4. <html> 
  5. <head> 
  6. <title>登陸頁面</title> 
  7. <script language="javaScript"> 
  8.      function validate(f){ 
  9.          if(!(/^\w{5,15}$/.test(f.userid.value))){   
  10.              alert("用戶ID必須是5~15位!"); 
  11.              f.userid.focus(); 
  12.              return false; 
  13.          } 
  14.          if(!(/^\w{5,15}$/.test(f.userpass.value))){ 
  15.              alert("密碼必須是5~15位!"); 
  16.              f.userid.focus(); 
  17.              return false; 
  18.          } 
  19.          return true 
  20.      } 
  21. </script> 
  22. </head> 
  23. <body> 
  24. <h2>用戶登陸程序</h2> 
  25. <
  26.     request.setCharacterEncoding("utf-8"); 
  27. %> 
  28. <
  29.     List<String>info=(List<String>)request.getAttribute("info");//取得屬性 
  30.     if(info!=null){   //判斷是否有內容 
  31.         Iterator<String>iter=info.iterator();//  實例化Iterator 
  32.         while(iter.hasNext()){ 
  33. %> 
  34.              <h4><%=iter.next()%></h4> 
  35. <%           
  36.         } 
  37.     } 
  38. %> 
  39. <form action="LoginServlet" method="post" onSubmit="return validate(this)"> 
  40.        用戶ID:<input type="text" name="userid"><br> 
  41.        密&nbsp;&nbsp;碼:      <input type="password" name="userpass"><br> 
  42.        <input type="submit" value="登陸"> 
  43.        <input type="reset" value="重置"> 
  44. </form> 
  45. </body> 
  46. </html> 

 不要忘記Servletweb.xml中的配置

  
  
  
  
  1. <servlet> 
  2.        <servlet-name>MVCLogin</servlet-name> 
  3.        <servlet-class>mvc.servlet.LoginServlet</servlet-class> 
  4.   </servlet> 
  5.   <servlet-mapping> 
  6.        <servlet-name>MVCLogin</servlet-name> 
  7.        <url-pattern>/jsp/LoginServlet</url-pattern> 
  8.   </servlet-mapping> 

注意:關於web.xml配置路徑不會的同窗能夠到這兒去學習http://zhaoyuqiang.blog.51cto.com/6328846/1148434 

 寫完全部的程序後來執行一下:效果以下下圖所示:

 從這道程序中,能夠發現這樣一個問題,之前的JSP頁面中的代碼實在太多 ,可是如今的代碼明顯比之前少不少了,實際上對於一個JSP頁面應該只包含以下的代碼:

 一個好的JSP頁面應該不導入任何一個開發包,固然,這要等到咱們後面的學習了。

  明白了MVC的開發以後,咱們來講一下他們之間的關係:

   MVC的實際開發做用,DAO只是負責數據的操做,JSP只是負責顯示,Servlet只是負責接收參數,調用javaBean,並進行跳轉功能。

相關文章
相關標籤/搜索