实例: 用一个用户登陆验证明例讲解MVC设计模式html
登陆程序以前已经学过,是使用JSP+JDBC完成的开发操做,可是以前的登陆程序开发中能够发现有不少的问题,就是一个JSP文件中代码过多了,即使是使用了JSP+javaBean的开发模式,其自己也存在JSP中代码过多的问题。
如今咱们就能够利用MVC设计模式来完全解决掉这些代码过多的问题了mysql
在本程序中,用户输入的登陆信息提交给Servlet进行接收,Servlet接收到请求内容后首先对其合法性进行检验(若是输入的内容是否为空或者长度是否知足要求等),若是验证失败,则将错误信息传递给登陆页显示;若是数据合法,则调用DAO层完成数据库的验证,根据验证的结构跳转到登陆成功或登陆失败的页面。web
须要开发的页面橄榄以下:sql
首先创建数据库 (咱们用的数据库是MySqL,不会的同窗能够到这儿 http://zhaoyuqiang.blog.51cto.com/6328846/1127226)学习数据库
建立数据库,名字为: 51ctomvctest 设计模式
建立表 , 名字为: usermvc
设计表,以下:(注意红色部分,不要忘记编码,不然可能出现不能输入中文现象)app
在表中填写信息,以下图所示:jsp
开发工具部署(咱们用的是MyEclipse)
部署以下图所示:
导入sql的jar包文件,这个不用我再说了吧。
代码编写
按照DAO的设计标准,首先应该定义出VO类
- User.java
- //vo中的属性与数据库表中的属性对应
- package mvc.vo;
- public class User {
- private String userid;
- private String name;
- private String password;
- public String getUserid(){
- return userid;
- }
- public void setUserid(String userid){
- this.userid=userid;
- }
- public String getPassword(){
- return password;
- }
- public void setPassword(String password){
- this.password=password;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name=name;
- }
- }
DAO中须要进行数据库的链接操做,须要DatabaseConnection的类负责数据的操做
- DatabaseConnection.java
- //负责数据库的打开与关闭操做
- package mvc.dbc;
- import java.sql.*;
- public class DatabaseConnection {
- private static final String DBdriver="org.gjt.mm.mysql.Driver";
- private static final String DBURL="jdbc:mysql://localhost:3306/51ctomvctest";
- private static final String DBUSER="root";
- private static final String DBPASS="425680992";
- 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){//避免NullPointerException
- try{
- this.conn.close();//关闭数据库
- }catch(Exception e){
- throw e;
- }
- }
- }
- }
因为本程序的核心功能是完成用户登陆验证,因此在定义DAO的时候,定义一个验证方法
- IUserDAO.java
- //定义一个登录验证的方法,这个方法为执行查询操做,而且采用了findXxx()的命名形式
- package mvc.dao;
- import mvc.vo.User; //引用mvc.vo包里面的User类
- public interface IUserDAO {
- /**
- * 用户登陆验证
- *@param user 传入VO对象
- *@param 验证的操做结果
- *@throw Exception
- */
- public boolean findLogin(User user)throws Exception;
- }
下面分别编写实现类和代理类
- UserDAOImpl.java
- //定义实现类,在此类中将经过输入用户ID和密码进行验证,
- //若是验证成功,则经过VO将用户的真实姓名取出并返回
- package mvc.dao;
- import java.sql.*;
- import mvc.dao.IUserDAO;
- import mvc.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 userid=? and password=?";
- thisthis.pstmt=this.conn.prepareStatement(sql);//实例化操做
- this.pstmt.setString(1,user.getUserid());//设置id
- this.pstmt.setString(2,user.getPassword());//设置密码
- ResultSet rs=this.pstmt.executeQuery();//取得查询结果
- if(rs.next()){
- user.setName(rs.getString(1));//取得姓名
- flag=true;//登陆成功
- }
- }catch(Exception e){
- throw e;
- }finally{
- if(this.pstmt!=null){
- try{
- this.pstmt.close();//关闭操做
- }catch(Exception e){
- throw e;
- }
- }
- }
- return flag;
- }
- }
- UserDAOProxy.java
- package mvc.dao;
- import mvc.dao.*;
- import mvc.dbc.*;
- import mvc.vo.*;
- public class UserDAOProxy implements IUserDAO{
- private DatabaseConnection dbc=null;//定义数据库链接
- private IUserDAO dao=null;//定义DAO接口
- 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;
- }
- }
定义工厂类 取得DAO实例
- DAOFactory.java
- package mvc.factory;
- import mvc.dao.*;
- public class DAOFactory {
- public static IUserDAO getIUserDAOInstance(){//取得DAO实例
- return new UserDAOProxy();//返回代理实例
- }
- }
DAO的操做完成只是数据层的操做,下面须要编写Servlet
- LoginServlet.java
- //定义Servlet,在Servlet中要接受客户端发来的输入数据
- //同时要调用DAO,而且要根据DAO的结果返回响应的信息
- //在Servlet中,首先定义对接受的userid和userpass两个参数进行验证,若是没有输入参数//或者是输入的参数为空,则会在info对象中增长相应的错误信息。
- //当验证经过后,程序将调用DAO进行数据层的验证,并根据DAO的返回结果来决定返回//给客户端的信息
- package mvc.servlet;
- import java.io.*;
- import java.util.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import mvc.factory.*;
- import mvc.vo.*;
- public class LoginServlet extends HttpServlet{
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{
- String path="login.jsp";
- String userid=req.getParameter("userid");//接受userid内容
- String userpass=req.getParameter("userpass");//接受password内容
- 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();//实例化VO
- user.setUserid(userid);//设置userid
- user.setPassword(userpass);//设置password
- 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);//调用doGet()操做
- }
- }
编写前台显示登陆页login.jsp
- login.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <%@ page import="java.util.*"%>
- <html>
- <head>
- <title>登陆页面</title>
- <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.userid.focus();
- return false;
- }
- return true
- }
- </script>
- </head>
- <body>
- <h2>用户登陆程序</h2>
- <%
- request.setCharacterEncoding("utf-8");
- %>
- <%
- List<String>info=(List<String>)request.getAttribute("info");//取得属性
- if(info!=null){ //判断是否有内容
- Iterator<String>iter=info.iterator();// 实例化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>
不要忘记Servlet在web.xml中的配置
- <servlet>
- <servlet-name>MVCLogin</servlet-name>
- <servlet-class>mvc.servlet.LoginServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>MVCLogin</servlet-name>
- <url-pattern>/jsp/LoginServlet</url-pattern>
- </servlet-mapping>
注意:关于web.xml配置路径不会的同窗能够到这儿去学习http://zhaoyuqiang.blog.51cto.com/6328846/1148434
写完全部的程序后来执行一下:效果以下下图所示:
从这道程序中,能够发现这样一个问题,之前的JSP页面中的代码实在太多 ,可是如今的代码明显比之前少不少了,实际上对于一个JSP页面应该只包含以下的代码:
一个好的JSP页面应该不导入任何一个开发包,固然,这要等到咱们后面的学习了。
明白了MVC的开发以后,咱们来讲一下他们之间的关系:
MVC的实际开发做用,DAO只是负责数据的操做,JSP只是负责显示,Servlet只是负责接收参数,调用javaBean,并进行跳转功能。