使用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开发中,客户端验证和服务器端验证都需要进行处理;