使用MVC设计模式完成一个用户登陆程序的开发;
登入程序之前已经学习过,是使用jsp+JDBC完成的开发操作,但是之前的登入程序开发中
发现有很多的问题,就是一个jsp文件中有scriptlet代码太多,即便是使用jsp+javabean
的开发模式,其本身也存在jsp中代码过多的问题。
现在就可以利用MVC设计模式来彻底解决掉代码过多的问题;
MVC登陆程序清单:
页面 文件类型 描述
· User JavaBean 用户登陆的VO操作类
· DatabaseConnection JavaBean 负责数据库的连接和关闭操作
· IUserDAO JavaBean 定义登录操作的DAO接口
· UserDAOImpl JavaBean 定义DAO接口的具体实现类
· UserDAOProxy JavaBean 定义一个代理
· DAOFactory JavaBean 定义一个工厂,得到现实DAO接口的类
· LoginServlet Servlet 接受请求,进行验证,调用DAO,返回信息
· login.jsp JSP 提供用户登陆表单,
1、数据库创建脚本:
/*=========启动mysql服务=========*/
net start mysql
/*=========打开mysql数据库=========*/
mysql -uroot -p123
/*=========使用lid数据库=========*/
use lid;
/*=========删除user数据表========*/
drop table user;
/*=========创建user数据表========*/
create table user(
userid varchar(30) primary key,
name varchar(30) null,
password varchar(32) null
);
/*=========插入测试数据========*/
insert into user(userid,name,password) values('1','lid','123');
2、创建一个VO类;
package login.lid.vo;
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;
}
}
编译该类,开始否能通过;
2、创建一个dbc的操作类---即数据库的连接关闭类(注意此时一定要不mysql数据驱动的jar包配置到classpath上)
package login.lid.dbc;
import java.sql.*;
public class DatabaseConnection{
private static final String DBDRIVEDR="org.gjt.mm.mysql.Driver";
private static final String DBURL="jdbc:mysql://localhost:3306/lid";
private static final String DBUSERNAME="root";
private static final String DBPASSWORD="123";
private Connection conn=null;
public DatabaseConnection() throws Exception{
Class.forName(DBDRIVEDR);
conn=DriverManager.getConnection(DBURL,DBUSERNAME,DBPASSWORD);
}
//得到数据库的连接
public Connection getConnection() throws Exception{
return this.conn;
}
//关闭连接
public void close() throws Exception{
if(conn!=null){
conn.close();
}
}
}
编译该类,开始否能通过;
3、创建DAO接口:---IUserDAO.java
package login.lid.dao;
import login.lid.vo.User;
public interface IUserDAO{
//现在完成的登陆验证,那么登陆操作只有两种返回结果
public boolean findLogin(User user) throws Exception;
}
编译该类,开始否能通过;
4、创建一个具体实现类:
package login.lid.dao.impl;
import java.sql.*;
import login.lid.vo.User;
import login.lid.dao.*;
public class UserDAOImpl implements IUserDAO{
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs=null;
public UserDAOImpl(Connection conn){
this.conn=conn;
}
//现在完成的登陆验证,那么登陆操作只有两种返回结果
public boolean findLogin(User user) throws Exception{
boolean flag=false;
String name=user.getName();
String password=user.getPassword();
String sql="select userid,name,password from user where name=? and password=?";
try{
this.pstmt=conn.prepareStatement(sql);
this.pstmt.setString(1,name);
this.pstmt.setString(2,password);
this.rs=this.pstmt.executeQuery();
}
catch(Exception e){
System.out.println(e);
}
if(rs.next()){
user.setName(rs.getString(2));
flag=true;
}
return flag;
}
}
编译该类,开始否能通过;
5、创建一个代理:
package login.lid.dao.proxy;
import java.sql.*;
import login.lid.dbc.*;
import login.lid.dao.*;
import login.lid.dao.impl.*;
import login.lid.vo.User;
public class UserDAOProxy implements IUserDAO{
private DatabaseConnection dbc=null ;
private IUserDAO dao=null;
public UserDAOProxy(){
try{
this.dbc=new DatabaseConnection();
this.dao=new UserDAOImpl(dbc.getConnection());
}
catch(Exception e){
e.printStackTrace();
}
}
//现在完成的登陆验证,那么登陆操作只有两种返回结果
public boolean findLogin(User user) throws Exception{
boolean flag=false;
try{
flag=this.dao.findLogin(user);
}
catch(Exception e){
e.printStackTrace();
}
finally{
dbc.getConnection().close();
}
return flag;
}
}
编译该类,开始否能通过;
6、创建工厂:
package login.lid.factory;
import login.lid.dao.*;
import login.lid.dao.proxy.*;
public class UserDAOFactory{
private IUserDAO dao=null;
public UserDAOFactory(){
this.dao=new UserDAOProxy();
}
public IUserDAO getIUserDAOInstance(){
return this.dao;
}
}
编译该类,开始否能通过;
以上DAO的操作主要是完成数据层的操作,但是下面在MVC设计模式中,还有servlet也很重要,
下面建立一个LoginServlet.java的操作类;
7、编写Servlet:
package login.lid.servlet;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import login.lid.factory.*;
import login.lid.vo.*;
public class LoginServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{
String path="login.jsp";
String userid=req.getParameter("userid");
String password=req.getParameter("password");
//存储错误的信息
List<String> info=new ArrayList<String>();
if(userid==null||"".equals(userid)){
info.add("用户id不能为空");
}
if(password==null||"".equals(password)){
info.add("密码不能为空");
}
if(info.size()==0){
User user=new User();
user.setName(userid);
user.setPassword(password);
UserDAOFactory dao=new UserDAOFactory();
try{
if(dao.getIUserDAOInstance().findLogin(user)){
info.add("用户登陆成功,欢迎"+user.getName()+"光临");
}
else{
info.add("用户登陆失败,错误的用户名和密码");
}
}
catch(Exception e){
e.printStackTrace();
}
}
if(info!=null){
System.out.println("=================");
}
req.setAttribute("info",info);
req.getRequestDispatcher(path).forward(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{
this.doGet(req,res);
}
}
编译该类,开始否能通过;
8、在web.xml中配置Servlet映射路径:
<servlet>
<servlet-name>loginservlet</servlet-name>
<servlet-class>login.lid.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginservlet</servlet-name>
<url-pattern>/mvclogin/ServerRedirectDemo</url-pattern>
</servlet-mapping>
9、创建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.password.value))){
alert("用户密码必须是5~15位");
f.password.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()){
%>
<h3><font color="red"><%=iter.next()%></font></h3>
<%
}
}
%>
<form action="LoginServlet" method="post" onSubmit="return validate(this)">
用户ID:<input type="text" name="userid"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
注意在MVC开发中,客户端验证和服务器端验证都需要进行处理;