MVC是一个核心设计模式,可以使整个程序的输入、处理和输出分开。MVC设计模式被分为三层,模型层、控制层和显示层。
显示层:负责接收Servlet传递的内容,调用JavaBean,将内容传递给用户。
控制层:负责所有的用户请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean并且将结果输送给显示层。
模型层:完成一个独立的业务操作组件,一般以Javabean或者EJB的形式进行定义。
在整个的MVC模式中,用户提交请求时,会交给Servlet进行处理,Servlet会调用JavaBean,JavaBean进行操作后会把结果通过RequestDispatcher接口传递到JSP页面。
这些要请求的内容只在一次请求中有效,所以一般使用request属性范围传递。
下面用一个用户登录的实例展示MVC模型。
主要的业务流程如图:
首先创建VO类:User
package com.zzh.lomvc.vo; public class User { private String name; private String id; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }然后定义一个数据库操作类:DatabaseConnection
package com.zzh.lomvc.dbc; import java.sql.Connection; import java.sql.DriverManager; public class DatabaseConnection { public static final String DBDRIVER = "com.mysql.jdbc.Driver"; public static final String DBURL = "jdbc:mysql://localhost:3306/test"; public static final String DBUSER = "root"; public static final String DBPASS = "zhengzehui"; private Connection conn = null; public DatabaseConnection() throws Exception { try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); } 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; } } } }定义DAO接口:IUserDAO
package com.zzh.lomvc.dao; import com.zzh.lomvc.vo.User; public interface IUserDAO { public boolean findLogin(User user) throws Exception; }定义DAO实现类:UserDAOImpl
package com.zzh.lomvc.dao.impl; import java.sql.ResultSet; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; import com.zzh.lomvc.dao.IUserDAO; import com.zzh.lomvc.vo.User; 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; try { String sql = "SELECT name FROM user WHERE id =? AND password =?"; this.pstmt = (PreparedStatement) this.conn.prepareStatement(sql); this.pstmt.setString(1, user.getId()); this.pstmt.setString(2, user.getPassword()); ResultSet rs = this.pstmt.executeQuery(); if (rs.next()) { user.setName(rs.getString(1)); flag = true; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { if (this.pstmt != null) { try { this.pstmt.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } } return flag; } }定义DAO代理操作类:UserDAProxy
package com.zzh.lomvc.dao.proxy ; import java.sql.* ; import com.mysql.jdbc.Connection; import com.zzh.lomvc.dao.IUserDAO; import com.zzh.lomvc.dao.impl.UserDAOImpl; import com.zzh.lomvc.dbc.DatabaseConnection; import com.zzh.lomvc.vo.User; 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((Connection) 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 ; } }定义工厂类取得DAO实例:DAOFactory
package com.zzh.lomvc.factory; import com.zzh.lomvc.dao.IUserDAO; import com.zzh.lomvc.dao.proxy.UserDAOProxy; public class DAOFactory { public static IUserDAO getIUserDAOInstance() { return new UserDAOProxy(); } }定义Servlet:LoginServlet
package com.zzh.lomvc.servlet ; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zzh.lomvc.factory.DAOFactory; import com.zzh.lomvc.vo.User; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ String path = "login.jsp" ; String id = req.getParameter("id") ; String userpass = req.getParameter("userpass") ; List<String> info = new ArrayList<String>() ; // 收集错误 if(id==null || "".equals(id)){ info.add("用户id不能为空!") ; } if(userpass==null || "".equals(userpass)){ info.add("密码不能为空!") ; } if(info.size()==0){ // 里面没有记录任何的错误 User user = new User() ; user.setId(id) ; 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) ; } }显示页面:login.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title>test</title></head> <body> <script language="javascript"> function validate(f){ if(!(/^\w{5,15}$/.test(f.id.value))){ alert("用户ID必须是5~15位!") ; f.id.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="id"><br> 密 码:<input type="password" name="userpass"><br> <input type="submit" value="登陆"> <input type="reset" value="重置"> </form> </body> </html>