一: MVC简介:
MVC模式
(Model-View-Controller)是
软件工程
中的一种
软件架构
模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式
的目的:实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:
-
(控制器Controller)- 负责转发请求,对请求进行处理。
-
(视图View) – 界面设计人员进行图形界面设计。
-
(模型Model) – 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
-
模型(Model)
用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。(比较:
观察者模式
(
软件设计模式
))
-
视图(View)
能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
-
控制器(Controller)
起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。
二: MVC登陆程序流程图:
三:MVC登陆程序清单
四:具体类的设计(DAO+MVC)
模型类:
4.1: User类:
<span style="font-size:18px;">package shiyeqiang.vo; //value object
public class User {
//本程序定义了雇员类,以及一序列的setter、getter方法,
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;
}
} </span>
4.2:DatabaseConnection类:
<span style="font-size:18px;">package shiyeqiang.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
// 该类主要是用于完成数据库的打开以及关闭操作
// 在构造方法完成打开,close()方法完成关闭,所有异常直接抛出,交给调用处 处理
private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; // 定义mysql中的数据库驱动程序
private static final String DBURL = "jdbc:mysql://localhost:3306/mldn"; // 定义数据库的连接地址,其中mldn为数据库的名称
private static final String DBUSER = "root"; // 定义数据库的连接用户名
private static final String DBPASS = "sqladmin"; // 定义数据库的连接密码
private Connection conn = null; // 数据库连接
public DatabaseConnection() throws Exception {
// 在构造方法内,进行数据库的连接操作
try {
Class.forName(DBDRIVER); // 加载驱动
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);// 试图建立到给定数据库
} catch (Exception e) { // 为了方便,直接抛出Exception异常
throw e;
}
}
public Connection getConnection() { // 取得数据库的连接
return this.conn;
}
public void close() throws SQLException {
if (this.conn != null) {
try {
this.conn.close();
} catch (SQLException e) {
throw e;
}
}
}
} </span>
4.3:IUserDAO类
<span style="font-size:18px;">package shiyeqiang.dao;
import java.util.List;
import shiyeqiang.vo.User; //导入雇员类所在的VO包
public interface IUserDAO { // 定义DAO操作的标准;
// findById:表示根据员工编号查询,返回的是Emp对象
public boolean findLogin(User user) throws Exception;
} </span>
4.4:UserDAOImpl类:
<span style="font-size:18px;">package shiyeqiang.dao.impl;
import java.sql.*;
import shiyeqiang.vo.User;
import shiyeqiang.dao.IUserDAO;
//为真实的实现类,完成具体的登录验证
public class UserDAOImpl implements IUserDAO
{
private Connection conn=null; //定义数据库的连接操作
private PreparedStatement ps=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 userid=? and password=?";
this.ps=this.conn.prepareStatement( sql);
this.ps.setString(1,user.getUserid());
this.ps.setString(2, user.getPassword());
ResultSet rs=this.ps.executeQuery();//执行查询操作
if(rs.next()){
flag=true;
user.setName(rs.getString(1)); //将结果集中的数据取出来保存在user中
}
}catch(Exception e){
throw e;
}finally{
if(this.ps!=null){
try{
this.ps.close();
}catch(Exception e){
throw e;
}
}
}
return flag;
}
}</span>
4.5:UserDAOProxy类:
<span style="font-size:18px;">package shiyeqiang.dao.proxy;
import shiyeqiang.dao.*;
import shiyeqiang.vo.*;
import shiyeqiang.dao.impl.*;
import shiyeqiang.dbc.*;
public class UserDAOProxy implements IUserDAO{
//为代理类,调用真实主题类,并且负责数据库的打开以及关闭的操作
//并且代理类,以及真实主题的实现类,均是实现了相同的
//代理类的数据成员中有真实主题类
private IUserDAO dao=null; //真实主题实现类
//构造函数打开,
//因为代理类还要负责数据库的打开以及关闭的操作
private DatabaseConnection dbc=null;
public UserDAOProxy(){
try{
this.dbc=new DatabaseConnection();
}catch(Exception e){
e.printStackTrace();
}
this.dao=new UserDAOImpl(this.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;
}
}
</span>
4.6: DAOFactory类:
<span style="font-size:18px;">package shiyeqiang.factory;
import shiyeqiang.dao.proxy.*;
import shiyeqiang.dao.*;
public class DAOFactory { // 取得DAO接口的实例化对象
public static IUserDAO getIUserDAOInstance() throws Exception {
return new UserDAOProxy(); // 取得代理类的实例
}
} </span>
4.7:LoginServlet类: 控制类,负责转发请求,对请求进行处理!!!
<span style="font-size:18px;">package shiyeqiang.servlet;
import java.util.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import shiyeqiang.vo.User;
import shiyeqiang.factory.*;
import shiyeqiang.dao.proxy.*;
public class LoginServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String path = "login.jsp" ;
String userid = req.getParameter("userid") ;
String userpass = req.getParameter("usepass") ;
List<String> info = new ArrayList<String>() ; // 收集错误
if(userid==null || "".equals(userid)){
info.add("用户id不能为空!") ;
}
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) ;
}
}</span>
LoginServlet类的配置:web.xml中配置如下:
<span style="font-size:18px;"><servlet>
<servlet-name>login</servlet-name>
<servlet-class>shiyeqiang.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login/LoginServlet</url-pattern>
</servlet-mapping></span>
4.8:login.jsp: 视图显示,界面显示
<span style="font-size:18px;"><%@page contentType="text/html" pageEncoding="GBK"%>
<%@page import="java.util.*"%>
<html>
<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> iterator=info.iterator();
while(iterator.hasNext()){
String str=iterator.next();
%>
<h1><%=str%></h1>
<%
}
}
%>
<form action="LoginServlet" method="post" onSubmit="return validate(this)">
用户名:<input type="text" name="userid"><br>
密; 码:<input type="password" name="usepass"><br>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
</html>
</span>
使用Mysql数据库,数据库名称为mldn,该数据库中的表名称为:user,其中含有三个属性,分别为:(userid,name,password)。