【MVC】Servlet+Jsp+MySql用户登录实例

         林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

         本文要用Servlet+Jsp+MySql实例用户登录,并简要介绍了下MVC的思想,此例子也是按照这个思路来做的。在Eclipse+tomcat7.0上做的。不会很难,对于了解MVC思想很有帮助!

效果:

这是刚开始的界面

技术分享

                                          这是错误时的信息       

技术分享                                                                                                                    

这是成功时的信息

技术分享

一、MVC简介

       MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

技术分享

控制器

控制器掌管着用户的请求(当用户点击图形用户界面(GUI)上的元素执行操作时,控制器会收到HTTP GET或者POST请求)。它的主要功能就是调用并协调需要的资源/对象来执行用户请求。通常控制器会为任务调用合适的模型,以及选择合适的视图。

模型


模型是指运用于数据之上的数据规则和数据内容,它一般对应于应用程序所要管理的对象。在软件系统中,任何事物都可以被抽象成可以对其以某种方式进行处理的数据模型。应用程序中的用户,信息以及图书是什么?它们只是一堆必须按照对应规则处理的数据(日期不能是未来的日期,电子邮件有特定的格式,名字的长度不能超过多少字符等等。

视图

视图提供了展示模型数据的不同方式。它可能是数据填充的模板。视图可以有多个,而控制器则决定使用哪个视图。一个网络应用通常由许多控制器,模型和视图组成。控制器可以被看成是一个主控制器,用于接收用户的所有请求,然后在调用特定的控制器来处理不同的情况。

二、本文MVC结构

本文的这个例子,比较简单。看看下面的这个图就懂了


技术分享

三、程序

1、创建数据库,这里使用的是MySql5.6,并插入了一个用户

create database example;
use example;
create table user(
userid int primary key auto_increment,
name varchar(30) NOT NULL,
password varchar(30) NOT NULL
);
insert into user(userid,name,password) values (null,‘lin‘,‘1234‘);
如果example不存在,记得要先create database example

select *from user结果如下:

技术分享


2、VO类,用来和数据库对应,DAO类中会用到的东西

/** 
*功能 VO类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka) 
*时间 2015.4.22
*/
package com.mucfc.vo;
public class User {
	private int userid;//对应数据库中userid
	private String name;//对应数据库中name
	private String password;//对应数据库中password
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}

3、定义操作数据库 ,完成数据库的连接,打开等操作,要注意加异常操作!这也是在DAO类中需要用到的东西

/** 
*功能 定义数据库操作类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka) 
*时间 2015.4.22
*/
package com.mucfc.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection {
	//定义数据库驱动程序
	private static final String DBDRIVER="com.mysql.jdbc.Driver";
	//数据库连接地址
	private static final String DBURL="jdbc:mysql://localhost:3306/example";//example表示数据库
	private static final String DBUSER="root";
	private static final String DBPASS="christmas258@";
    private Connection connection=null;
    public DatabaseConnection() throws Exception{
    	try{
    		//数据库操作可能出现异常
    		Class.forName(DBDRIVER);
    		connection=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
    		
    	}catch(Exception exception ){
    		throw exception;
    	} finally {
		}	
    }
    public Connection getConnection(){
    	return connection;
    }
    public void close() throws Exception{
    	if(connection!=null){
    		try {
    			connection.close();			
			} catch (Exception e) {
				throw e;
			}
    	}
    	
    }

}

4、定义DAO接口

接口类,查询是否存在这个用户的方法是findLogin(User user)

/** 
*功能 定义DAO接口
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka) 
*时间 2015.4.22
*/
package com.mucfc.dao;
import com.mucfc.vo.User;
public interface IUserDAO {
/**
 * 用户登录验证
 * @param user传入vo对象
 * @return 验证的操作结果 
 * @throws Exception
 */
public boolean findLogin(User user) throws Exception;

}

5、DAO的实现类,这里相当是Mode(模型层)

/** 
*功能 定义DAO实现类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka) 
*时间 2015.4.22
*/
package com.mucfc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.mucfc.vo.User;
public class UserDAOImpI implements IUserDAO{
	private Connection conn=null;//定义数据库连接对象 
	private PreparedStatement pstmt=null;//定义数据库操作对象
	public UserDAOImpI(Connection conn){ //设置数据库连接
		this.conn=conn;
	}
	@Override
	public boolean findLogin(User user) throws Exception {
		boolean flag=false;
		try {
			String sql="select name from user where name=? and password=?";
			pstmt=conn.prepareStatement(sql);//实例化操作
			pstmt.setString(1,user.getName());
		    pstmt.setString(2, user.getPassword());
		    ResultSet rSet=pstmt.executeQuery();//取得结果 
		    if(rSet.next()){
		    	user.setName(rSet.getString(1));//取得用户名
		    	flag=true;   	
		    }

		} catch (Exception e) {
			throw e;
		}finally{
			//关闭操作
			if(pstmt!=null){
				try {
					pstmt.close();
				} catch (Exception e) {
					throw e;				
			}		
		}
			
		}
		return flag;
	}
	
}
对用户名和密码进行验证,如果验证成功,则通过VO将用户的真实姓名取出并返回。


6、定义一个DAO的代理类

这里这个代理类可以要也可以不要,这里为了方便些,所以定义了一个

/** 
*功能 定义DAO代理类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka) 
*时间 2015.4.22
*/
package com.mucfc.dao.proxy;
import com.mucfc.dao.IUserDAO;
import com.mucfc.dao.UserDAOImpI;
import com.mucfc.dbc.DatabaseConnection;
import com.mucfc.vo.User;
public class UserDAOProxy implements IUserDAO{
    private DatabaseConnection dbc=null;//定义数据库连接
    private IUserDAO dao=null;//定义DAO接口
    public UserDAOProxy(){
    	try {
			dbc=new DatabaseConnection();//实例化数据库连接
		} catch (Exception e) {
			e.printStackTrace();
		}
    	dao=new UserDAOImpI(dbc.getConnection());
    	
    }
	@Override
	public boolean findLogin(User user) throws Exception {
		boolean flag=false;
		try {
			flag=dao.findLogin(user);//调用真实主题
		} catch (Exception e) {
			throw e;
		}finally{
			dbc.close();
		}
		return flag;
	}

}

7、新建一个Servlet类,取名为LoginServlet.java ,这里相当是Controller(控制层)代码如下:

package com.mucfc.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mucfc.dao.proxy.UserDAOProxy;
import com.mucfc.vo.User;
/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	String name=request.getParameter("name");
	String password=request.getParameter("password");
	List<String> info=new ArrayList<String>();
	if(name==null||"".equals(name)){ //用户名输入格式问题
		info.add("用户名不能为空");
		System.out.println("用户名不能为空");
	}

	if(password==null||"".equals(password)){//密码输入格式问题
		info.add("密码不能为空");
		System.out.println("密码不能为空");
	}
	if(info.size()==0){
		User user=new User();
		user.setName(name);
		user.setPassword(password);
		UserDAOProxy userDAOProxy=new UserDAOProxy();
		try {
			
			if(userDAOProxy.findLogin(user)){
				info.add("用户登录成功,欢迎"+user.getName()+"光临!");				
			}else {
				info.add("用户登录失败,错误的用户名和密码");
			}						
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	request.setAttribute("info", info);//保存错误信息
	request.getRequestDispatcher("Login.jsp").forward(request,response);//跳转
	
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doGet(request, response);
	}

}
它主要实现了得到Login.jsp传过来的name和password,然后调用dao类到数据库example中的user表中去进行name和password的验证。最后再将结果返回给login.jsp,接着login,jsp更新显示结果。

8、初始界面Login.jsp,这里相当是View(显示层)

<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<center><title>MVC登录实例</title></center>
</head>
<body>
<center><h2>用户登录程序</h2></center>
<center>
<%
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>
<% 
}
}
%>
</center>
<center>
<form action="LoginServlet" method="post" onSubmit="return validate(this)">
用户名:<input type="text" name="name"><br>
 密 码:<input type="password" name="password"><br>
 <input type="submit" value="登录">
 <input type="reset" value="重置">
</form>
</center>
</body>
</html>

9、web.xml设置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <welcome-file-list>
    <welcome-file>Login.html</welcome-file>
    <welcome-file>Login.htm</welcome-file>
    <welcome-file>Login.jsp</welcome-file>

  </welcome-file-list>
  
    <servlet>   
    <servlet-name>LoginServlet</servlet-name>  <!-- 类名 -->
    <servlet-class>com.mucfc.servlet.LoginServlet</servlet-class> <!-- 所在的包 -->
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name> 
    <url-pattern>/servlet/LoginServlet</url-pattern><!-- 访问的网址 -->
    </servlet-mapping>
</web-app>

10.导入必要的包,是一定要的!

技术分享

11.整个工程目录如下:

技术分享


12、运行

技术分享

13、结果

浏览器输入:http://localhost:8080/ServletLearningChapter1_3/

技术分享

技术分享

技术分享

技术分享


好了,是不是很简单呢?

         林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。