MVC入门——经典MVC登录实例详解--附完整代码
来源:互联网 发布:dmm点数充值淘宝 编辑:程序博客网 时间:2024/04/30 00:59
参考《JavaWeb开发实战经典》
MVC是核心,是最重要的基础!
“有不少人一直问,是不是应该把框架(Struts、Spring、Hibernate等成为开发框架)开发作为学习重点,其实:框架只是一种很简单的应用,而整个JavaEE的核心并不在框架上,更多的是在MVC设计模式的应用上”。
所谓“基础不牢,地动山摇”,只要真正掌握了内部核心原理(本质:MVC),再去学习任何一门框架都能很快上手!有兴趣的可以去看下这本书,个人感觉这本书入门JavaWeb相当不错!
进入正题,以下对书中的一个MVC登陆实例进行讲解。
在讲解实例前先简单介绍下web开发模式,在web开发模式中主要有两种:Mode1与ModeII (MVC)。
Mode1
Mode1就是指在开发模式中将显示层、控制层、数据层的操作统一交给JSP或JavaBean来处理。类似于JSP+DAO的开发模式(优缺点这里就不说了,网上有很多资料啦)。
ModeII:Model-View-Control
在ModeII中所有的开发都是以Servlet为主体展开的,由Servlet接收所有的客户端请求,然后根据请求调用相应的JavaBean,并将所有的显示结果交给JSP完成,也就是俗称的MVC设计模式。
MVC是一个设计模式,它强制性地使应用程序的输入、处理和输出分开。
显示层(View):主要负责接收Servlet传递的内容,并且调用JavaBean,将内容显示给用户。
控制层(Controller): 主要负责所有的用户请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean执行操作并将最终的处理结果交由显示层进行显示。
模型层(Model): 完成一个独立的业务操作组件,一般都是以JavaBean或者EJB的形式进行定义的。
下面进行MVC登陆实例讲解(环境:Tomcat+MySQL)
1.在数据库中创建user表
User表结构
数据库创建脚本如下:
/*======================= 使用MLDN数据库 =======================*/USE mldn ;/*======================= 删除user数据表 =======================*/DROP TABLE IF EXISTS user ;/*======================= 创建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') ;
2.定义VO类——User.java
定义登陆所需属性:userid、name、password,并设置相应setting与getting方法
package org.lxh.mvcdemo.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 ; }}
3.定义JDBC数据库操作类——DatabaseConnection.java
提供数据库的连接与关闭操作
package org.lxh.mvcdemo.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/mldn" ; private static final String DBUSER = "root" ; private static final String DBPASSWORD = "mysqladmin" ; 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 ; } } }}
4.定义DAO接口——IUserDAO.java
由于本程序的核心功能只是用户的登陆验证,所以在定义DAO接口时,只需定义一个登陆验证方法即可findLogin(),当然需要扩展只需在此接口定义相应方法即可(CRUD)。
package org.lxh.mvcdemo.dao ;import org.lxh.mvcdemo.vo.User ;public interface IUserDAO { // 现在完成的是登陆验证,那么登陆操作只有两种返回结果 public boolean findLogin(User user) throws Exception ;}
现在的方法主要是用来查询操作,并且采用findXxx()的命名形式,下面分别定义实现类(真实主题类)和代理类。
5.定义DAO实现类——UserDAOImpl.java
实现DAO接口的findLogin方法,对数据库的操作
package org.lxh.mvcdemo.dao.impl ;import org.lxh.mvcdemo.vo.User ;import org.lxh.mvcdemo.dbc.* ;import org.lxh.mvcdemo.dao.* ;import java.sql.* ;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 ; }}
6.定义DAO代理操作类——UserProxy.java
取得数据库连接,调用真实主题类
package org.lxh.mvcdemo.dao.proxy ;import org.lxh.mvcdemo.vo.User ;import org.lxh.mvcdemo.dbc.* ;import org.lxh.mvcdemo.dao.* ;import org.lxh.mvcdemo.dao.impl.* ;import java.sql.* ;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 ; }}
7.定义工厂类——DAOFactory.java
调用DAO接口,返回代理类
package org.lxh.mvcdemo.factory ;import org.lxh.mvcdemo.dao.* ;import org.lxh.mvcdemo.dao.proxy.* ;public class DAOFactory { public static IUserDAO getIUserDAOInstance(){ return new UserDAOProxy() ; }}
DAO的操作完成只是数据层的操作,下面需要编写Servlet类(控制层),在Servlet中接收客户端发来的输入数据,同时需要调用DAO,并且根据DAO的结果返回相应的信息。
8.定义Servlet——LoginServlet.java
(1)通过request.getParameter()方法接收用户请求发送过来的userid与userpass两个参数
(2)对两个参数进行非空验证,若为空,则在info类集对象中添加相应错误信息;当验证通过后,程序将调用DAO进行数据层的验证,并根据DAO的返回结果来决定返回给客户端的信息;
(3)使用反射机制通过工厂类取得代理类实例,然后调用真实主题类的findLogin()方法,进行数据库的验证(判断登录用户是否数据库user表中的用户id与密码一致),并将相应成功或错误信息添加到info对象中;
(4)通过req.setAttribute(“info”,info) ;将最终响应信息request范围中;
(5)通过forward()方法跳转回相应的JSP(String path = “login.jsp” ;)进行显示
package org.lxh.mvcdemo.servlet ;import java.io.* ;import java.util.* ;import javax.servlet.* ;import javax.servlet.http.* ;import org.lxh.mvcdemo.factory.* ;import org.lxh.mvcdemo.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") ; String userpass = req.getParameter("userpass") ; 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) ; }}
9.Servlet配置文件web.xml
<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> org.lxh.mvcdemo.servlet.LoginServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/mvclogin/LoginServlet</url-pattern> </servlet-mapping></web-app>
10.显示层JSP——login.jsp
用户登录界面以及接收响应信息
<%@ page contentType="text/html" pageEncoding="GBK"%><%@ page import="java.util.*"%><html><head><title>www.mldnjava.cn,MLDN高端Java培训</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>
11.配置web.xml
<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> org.lxh.mvcdemo.servlet.LoginServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/mvclogin/LoginServlet</url-pattern> </servlet-mapping></web-app>
最终运行结果如下:
注:通过本MVC程序,与最初JSP开发(如JSP+JDBC或JSP+DAO)相比,现在的JSP页面中的代码减少了很多,只是简单地完成了输出,实际上在开发中,读者一定要记住JSP中最好只包含以下3中类型的代码(可以对照上面login.jsp代码):
1)接收属性:接收从Servlet传递过来的属性;
2)判断语句:判断传递到JSP中的属性是否存在;
3)输出内容:使用迭代或者VO进行输出。
而且要记住一点:在JSP页面中唯一允许导入的包只能是java.util包,只要把握这一点,即可开发出一个简洁、清晰的JSP页面。
完整代码.rar
- MVC入门——经典MVC登录实例详解--附完整代码
- 用Spring MVC实现用户登录的完整实例
- 用Spring MVC实现用户登录的完整实例
- 用Spring MVC实现用户登录的完整实例
- 实例详解Spring MVC入门使用
- 实例详解Spring MVC入门使用
- 实例详解Spring MVC入门使用
- 实例详解Spring MVC入门使用
- 实例详解Spring MVC入门使用
- 实例详解Spring MVC入门使用
- MVC经典实例
- spring mvc 和ajax异步交互完整实例代码
- Spring MVC 入门 实例
- Spring MVC 入门实例
- Spring MVC 入门实例
- Spring MVC入门实例
- Spring MVC 入门实例
- Spring MVC入门实例
- jenkins下使用git获取源码的配置方法
- Spring aop实现的三种方式
- Linux的lvm管理:修改LV大小
- IntelliJ使用指南—— 导入Eclipse的Web项目
- python
- MVC入门——经典MVC登录实例详解--附完整代码
- weqdas
- Android之ListView使用方法-SimpleAdapter-两个TextView
- xcode快捷键
- launchOptions的key
- wordpress教程:检测当前页面使用的哪个模板文件的方法
- error MSB3073: :VCEnd”已退出,代码为 1 error MSB3073: :copy............
- MySQL入门--数据表的创建、显示指定数据库中的所有数据表
- 如何优雅地使用 Stack Overflow?