程序开发:MVC设计模式与应用
程序开发: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.bkjia.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.bkjia.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.bkjia.dao ;
import com.mvc.bkjia.vo.User;
public interface IUserDAO {
public boolean findLogin(User user) throws Exception ;
}
package com.mvc.bkjia.dao.impl ;
import com.mvc.bkjia.dao.*;
import com.mvc.bkjia.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.bkjia.factory ;
import com.mvc.bkjia.dao.*;
import com.mvc.bkjia.dao.proxy.*;
/**
*
* @author 偶my耶
* 工厂接口
*/
public class DAOFactory {
public static IUserDAO getIUserDAOInstance(){
return new UserDAOProxy() ;
}
}
UserDAOProxy.java
package com.mvc.bkjia.dao.proxy ;
import com.mvc.bkjia.dbc.DatabaseConnection;
import com.mvc.bkjia.dao.IUserDAO;
import com.mvc.bkjia.dao.impl.UserDAOImpl;
import com.mvc.bkjia.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.bkjia.servlet ;
import java.io.* ;
import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
import com.mvc.bkjia.factory.DAOFactory;
import com.mvc.bkjia.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.bkjia.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>
密 码:<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的操作结果进行跳转
本文永久更新链接地址:
评论暂时关闭