使用JSP+Servlet+MVC+JDBC+JS实现用户登录校验、登录成功后三天免登录及可打印数据库信息

MySQL驱动及JQuery文件:

链接:https://pan.baidu.com/s/10RNLJ4dwxEoJYUUE32Q9qw 
提取码:fpqr 
 

一、需求:

1、用户访问主登录页面,可填写登录信息并提交。

2、根据用户提交信息查询数据库中进行用户校验。

3、校验失败,主登录页面给提示信息。

4、登录成功,则显示登录成功页面。3天之内每次访问主登录页面即刻跳转登录成功页面。

5、在登录成功页面有一个查询数据库所有信息的按钮,一点击按钮,则立马显示数据库所有用户数据。

二、实现思路

1、三个jsp文件作页面显示,三个servlet作页面之间跳转的逻辑判断。

2、LoginServlet进行主登录页面显示之前的逻辑判断:

                A、如果之前登录成功,通过浏览器cookie中的uid查询用户信息,重新缓存session,然后重定向登录成功页面succeed.jsp;

                B、如果之前未登录成功,则请求转发主登录页面login.jsp。

3、login.jsp显示主登录页面,采集用户输入的用户名和密码信息,数据提交给CheckServlet。

4、CheckServlet对用户输入的数据进行校验:

               A、校验成功则将该用户信息以session的形式存储,同时响应给浏览器一个三天有限的存储着用户编号的cookie;然后重定向到succeed.jsp。

              B、校验失败则给request对象打一个标记,请求转发到login.jsp(login.jsp显示主登录页面时如果能拿到该标记,则提示用户名或密码错误)。

5、succeed.jsp进行登录成功的页面展示,提示“某某用户登录成功”。

注:以上可实现用户登录校验及三天免登录需求

---------------------------------------------------------------------------------------------------------------------------------------------

6、在succeed.jsp登录成功页面有一个查询数据库所有用户信息的按钮,一点击则立马重定向到ShowAllServelt。

7、ShowAllServelt根据用户可查询数据库中用户的所有信息,返回一个List集合,该List集合存储在request对象中,然后请求转发ShowAll.jsp。

8、ShowAll.jsp通过request对象拿到List集合,然后遍历输出所有用户信息。

三、部分运行效果图

1、主登录页面(未登录时)

2、主登录页面(登录失败时)

3、登录成功页面

4、显示所有用户信息页面

注意:请注意我的地址栏信息哦。

四、具体实现

前置:导入数据库驱动的jar包,引入JQuery文件(事件触发我使用JQuery写的)

1、MySQL文件

use d_student;

create table t_user(
	uid int auto_increment primary key,
	uname varchar(20),
	pwd varchar(20)
)charset=utf8;

insert into t_user values(default,'张三','123456');
insert into t_user values(default,'李四','123456');

select * from t_user;

2、配置文件

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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>04-login</display-name>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.imooc.servlet.LoginServlet</servlet-class>
  </servlet>


  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>CheckServlet</servlet-name>
    <servlet-class>com.imooc.servlet.CheckServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ShowAllServlet</servlet-name>
    <servlet-class>com.imooc.servlet.ShowAllServlet</servlet-class>
  </servlet>






  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CheckServlet</servlet-name>
    <url-pattern>/check</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowAllServlet</servlet-name>
    <url-pattern>/show</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

db.properties(内含连接数据库的信息)

3、实体类层----com.imooc.pojo

package com.imooc.pojo;

public class User {
	private String uname;//用户名
	private String pwd;//用户密码
	private Integer uid;//用户编号
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname=uname;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Integer getUid() {
		return uid;
	}
	public void setUid(Integer uid) {
		this.uid = uid;
	}
	public User() {
		
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
		result = prime * result + ((uid == null) ? 0 : uid.hashCode());
		result = prime * result + ((uname == null) ? 0 : uname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (pwd == null) {
			if (other.pwd != null)
				return false;
		} else if (!pwd.equals(other.pwd))
			return false;
		if (uid == null) {
			if (other.uid != null)
				return false;
		} else if (!uid.equals(other.uid))
			return false;
		if (uname == null) {
			if (other.uname != null)
				return false;
		} else if (!uname.equals(other.uname))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "User [uname=" + uname + ", pwd=" + pwd + ", uid=" + uid + "]";
	}
	
	
	
	
}

4、工具类层----com.imooc.util

DBUtil类

package com.imooc.util;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


public class DBUtil {
	//声明属性记录jdbc链接参数
		private static String driver;
		private static String url;
		private static String username;
		private static String password;
	//声明静态代码块儿
		static{
			//动态获取编译目录下的文件的流对象
			InputStream in = DBUtil.class.getResourceAsStream("/db.properties");
			//创建Properties对象,读取properties文件类型的内容。
			Properties p=new Properties();
			try {
				//加载   该句代码执行完毕后,配置文件中的数据已经被p对象所获取并存储。
				p.load(in);
				//获取p对象中的数据并赋值给属性
				driver=p.getProperty("driver");
				url=p.getProperty("url");
				username=p.getProperty("user");
				password=p.getProperty("password");
				//加载驱动
				Class.forName(driver);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	//获取Connection对象的方法
		public static Connection getConnection(){		
			Connection conn=null;
			try {
				//获取链接
					conn=DriverManager.getConnection(url,username,password);
				} catch (SQLException e) {
					e.printStackTrace();
			}
			return conn;
		}
	//封装公共增删改查方法
		public static int executeDML(String sql,Object...objs){
			
			//声明jdbc遍历
			Connection conn=null;
			PreparedStatement ps=null;
			try {
				//获取链接
				conn=getConnection();
				//开启事务
					conn.setAutoCommit(false);
				//创建Sql命令对象
					ps=conn.prepareStatement(sql);
				//给占位符赋值
					if(objs!=null){
						for(int i=0;i<objs.length;i++){
							ps.setObject(i+1,objs[i]);
						}
					}
				//执行
					int i = ps.executeUpdate();
					if(i>0){
						conn.commit();
					}
				//返回结果
					return i;
				
			} catch (Exception e) {
				try {
					conn.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
				e.printStackTrace();
			}finally {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return -1;
		}
	//封装公共查询方法:针对结果为一条
		public static <T> T executeOne(String sql,T t,Object...objs){
			T t2=null;
			//声明jdbc变量
			Connection conn=null;
			PreparedStatement ps=null;
			ResultSet rs=null;
			try {
				//获取链接
				conn=DBUtil.getConnection();
				//创建Sql命令对象
				ps=conn.prepareStatement(sql);
				//给占位符赋值
				if(objs!=null){
					for(int i=0;i<objs.length;i++){
						ps.setObject(i+1,objs[i]);
					}
					
				}
				//执行
				rs=ps.executeQuery();
				//获取结果集的结构 
				ResultSetMetaData rm = rs.getMetaData();//rm对象中存储了结果表中的字段的名字和字段的java类型
				int count = rm.getColumnCount();//获取列的数量
				
				//遍历
				while(rs.next()){
					//获取实体类的类对象
						Class cla = t.getClass();
						t2 = (T) cla.newInstance();
					//获取数据
						for(int i=0;i<count;i++){
							//获取列名
							String columnName = rm.getColumnName(i+1);
							//拼接方法名
							String methodName="set"+columnName.substring(0,1).toUpperCase()+columnName.substring(1);
							//获取字段类型
							String columnClassName = rm.getColumnClassName(i+1);// "java.lang.Integer"  "java.lang.String"
							Method m=null;
							if("java.sql.Date".equals(columnClassName)){
								 m=cla.getDeclaredMethod(methodName, Class.forName("java.util.Date"));
							}else{
								//反射获取方法对象
								 m=cla.getDeclaredMethod(methodName, Class.forName(columnClassName));
							}
							//执行方法
							m.invoke(t2, rs.getObject(columnName));
							//System.out.println(columnName+"---"+methodName+"---"+columnClassName);
						}
				}
				//关闭资源
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				try {
					if(rs!=null)
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					if(ps!=null)
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					if(conn!=null)
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return t2;
		}
	//封装公共查询方法:针对查询结果为多条
		public static <T> List<T> executeQuery(String sql,T t,Object...objs){
			//声明list集合
			List<T> list=null;
			//声明jdbc变量
			Connection conn=null;
			PreparedStatement ps=null;
			ResultSet rs=null;
			try {
				//获取链接
				conn=DBUtil.getConnection();
				//创建Sql命令对象
				ps=conn.prepareStatement(sql);
				//给占位符赋值
				if(objs!=null){
					for(int i=0;i<objs.length;i++){
						ps.setObject(i+1,objs[i]);
					}
					
				}
				//执行
				rs=ps.executeQuery();
				//获取结果集的结构 
				ResultSetMetaData rm = rs.getMetaData();//rm对象中存储了结果表中的字段的名字和字段的java类型
				int count = rm.getColumnCount();//获取列的数量
				//给list赋值
				list=new ArrayList<>();
				//遍历
				while(rs.next()){
					//获取实体类的类对象
						Class cla = t.getClass();
						T newInstance = (T) cla.newInstance();
					//获取数据
						for(int i=0;i<count;i++){
							//获取列名
							String columnName = rm.getColumnName(i+1);
							//拼接方法名
							String methodName="set"+columnName.substring(0,1).toUpperCase()+columnName.substring(1);
							//获取字段类型
							String columnClassName = rm.getColumnClassName(i+1);// "java.lang.Integer"  "java.lang.String"
							Method m=null;
							if("java.sql.Date".equals(columnClassName)){
								 m=cla.getDeclaredMethod(methodName, Class.forName("java.util.Date"));
							}else{
								//反射获取方法对象
								 m=cla.getDeclaredMethod(methodName, Class.forName(columnClassName));
							}
							//执行方法
							m.invoke(newInstance, rs.getObject(columnName));
							//System.out.println(columnName+"---"+methodName+"---"+columnClassName);
						}
					//添加集合
					list.add(newInstance);
				}
				//关闭资源
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return list;
			
			
			
			
			
			
		}
				
}

5、数据访问层----com.imooc.dao

IDao接口

package com.imooc.dao;

import java.util.List;

import com.imooc.pojo.User;

public interface IDao {
	/*
	 * 通过用户名和用户密码查询用户的方法,查询到了返回该用户对象
	 */
	User  getUserInfoByNameAndPwd(String name,String pwd);
	/*
	 * 通过用户名编号查询用户的方法,查询到了返回该用户对象
	 */
	User getUserInfoByUid(Integer uid);
	/*
	 * 返回一个含有所有用户信息的list集合
	 */
	List<User> getAllUserInfo();
}

IDaoImpl实现类

package com.imooc.dao;

import java.util.List;

import com.imooc.pojo.User;
import com.imooc.util.DBUtil;

public class IDaoImpl implements IDao {
	
	@Override
	public User getUserInfoByNameAndPwd(String uname, String pwd) {
		
		return DBUtil.executeOne("select * from t_user where uname=? and pwd=?", new User(), uname,pwd);
	}

	@Override
	public User getUserInfoByUid(Integer uid) {
		return DBUtil.executeOne("select * from t_user where uid=?", new User(), uid);
	}

	@Override
	public List<User> getAllUserInfo() {
		
		return DBUtil.executeQuery("select * from t_user", new User());
	}
	
	
}

6、业务处理层---com.imooc.service

IService接口

package com.imooc.service;

import java.util.List;

import com.imooc.pojo.User;

public interface IService {
	/*
	 * 用户校验
	 */
	User  checkUserInfoByNameAndPwd(String uname,String pwd);
	/*
	 * 根据用户编号获取用户信息
	 */
	User checkUserInfoByUid(Integer uid);
	/*
	 * 获取所有用户信息
	 */
	List<User> getAll();
}

IServiceImpl实现类

package com.imooc.service;

import java.util.List;

import com.imooc.dao.IDao;
import com.imooc.pojo.User;

public class IServiceImpl implements IService {
	private IDao dao;
	
	public IServiceImpl(IDao dao){
		this.dao=dao;
	}
	
	@Override
	public User checkUserInfoByNameAndPwd(String uname, String pwd) {
		
		return dao.getUserInfoByNameAndPwd(uname, pwd);
	}

	@Override
	public User checkUserInfoByUid(Integer uid) {
		return dao.getUserInfoByUid(uid);
	}

	@Override
	public List<User> getAll() {
		
		return dao.getAllUserInfo();
	}

}

7、控制层(Servlet层)----com.imooc.servlet

LoginServlet类(在显示页面前执行逻辑判断)

package com.imooc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.imooc.dao.IDao;
import com.imooc.dao.IDaoImpl;
import com.imooc.pojo.User;
import com.imooc.service.IService;
import com.imooc.service.IServiceImpl;

public class LoginServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");//告诉tomcat怎么接收
		//设置响应编码格式
		resp.setCharacterEncoding("utf-8");//告诉tomcat怎么响应
		resp.setContentType("text/html;charset=utf-8");//告诉浏览器怎么打开
		
		//获取服务器提交的所有cookies
		Cookie []cookies=req.getCookies();
		
		if(cookies!=null){
			for(Cookie c:cookies){//遍历
				if("uid".equals(c.getName())){//如果有这个uid,则表明用户在三天内成功登录过
					 Integer uid=Integer.parseInt(c.getValue()); //获取uid
					 //通过uid查询数据库
					 IDao dao=new IDaoImpl();
					 IService is=new IServiceImpl(dao);
					 User user = is.checkUserInfoByUid(uid);
					 
					 
						 //获取/创建session对象
					 HttpSession session = req.getSession();
					 session.setAttribute("user", user);
					 resp.sendRedirect("succeed.jsp");
					 return;
					 }
					 
					
				}
			}	
		//没有找到用户uid的cookie信息,或者没有cookie信息,返回登录页面
		req.getRequestDispatcher("login.jsp").forward(req, resp);
		}
	
}

CheckServlet类(对用户输入信息进行校验)

package com.imooc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.imooc.dao.IDao;
import com.imooc.dao.IDaoImpl;
import com.imooc.pojo.User;
import com.imooc.service.IService;
import com.imooc.service.IServiceImpl;

public class CheckServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		//获取用户输入数据
		String uname=req.getParameter("uname");
		String pwd=req.getParameter("pwd");
		/*
		 * 查询数据库
		 */
		IDao dao=new IDaoImpl();
		IService is=new IServiceImpl(dao);
		User user = is.checkUserInfoByNameAndPwd(uname, pwd);
		/*
		 * 校验
		 */
		if(user!=null){
			//设置session缓存用户信息
			HttpSession session = req.getSession();
			session.setAttribute("user", user);
			
			//缓存用户uid到浏览器,设置该cookie保留三天
			Cookie cookie=new Cookie("uid",user.getUid().toString());
			cookie.setMaxAge(3*24*3600);
			resp.addCookie(cookie);
			//重定向到登录成功页面
			resp.sendRedirect("succeed.jsp");
			return;
		}else{
			//打上一个登录失败的标识
			req.setAttribute("flag", "true");
			
			//请求转发到登录页面
			req.getRequestDispatcher("login.jsp").forward(req, resp);
			return;
		}
	}
}

ShowAllServlet(查询所有用户信息)

package com.imooc.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.dao.IDao;
import com.imooc.dao.IDaoImpl;
import com.imooc.pojo.User;
import com.imooc.service.IService;
import com.imooc.service.IServiceImpl;

public class ShowAllServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式、
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		
		//获取业务层
		IDao dao=new IDaoImpl();
		IService is=new IServiceImpl(dao);
		//查询,返回list集合并封装在req中
		ArrayList<User>list=(ArrayList<User>)is.getAll();
		System.out.println(list.toString());
		req.setAttribute("list", list);
		//请求转发到展示所有用户数据的页面
		req.getRequestDispatcher("showAll.jsp").forward(req, resp);
	}
}

8、对应的jsp文件

login.jsp(主登录页面)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
  </head>
  
  <body>
  	<%
  		String flag=(String)request.getAttribute("flag");
  	 %>
  	
    <form action="check" method="get">
    	<h2>用户登录页面</h2>
    	<hr />
    	<b><%= flag!=null?"用户名或密码错误":""  %></b><br />
    	用户名:<input type="text" name="uname" value="" /><br />
    	密码:<input type="password" name="pwd" value="" /><br />
    	<input type="submit" value="登录" />
    </form>
  </body>
</html>

succeed.jsp(登录成功页面)

<%@ page language="java" import="java.util.*,com.imooc.pojo.User" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <!--引入jquery-->
    <script type="text/javascript" src="js/j.js"></script>
    <!--声明js代码域-->
    <script type="text/javascript">
    	$(function(){
    		$("#btn").click(function(){
    			window.location.href="show";//跳转到另一个页面
    		});
    	
    	});
    
    
    </script>
  </head>
  
  <body>
    <h2><%=((User)session.getAttribute("user")).getUname()+"登录成功" %></h2>
    <hr />
    <input type="button" id ="btn" value="查询所有用户信息">
  </body>
</html>

ShowAll.jsp(显示所有用户数据的页面)

<%@ page language="java" import="java.util.*,com.imooc.pojo.User" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

  </head>
  
  <body>
    <h2>所有用户信息如下</h2>
    <hr /> 
    <table>
    	<tr>
   			<td>用户编号</td>
   			<td>用户名</td>
   			<td>用户密码</td>
   		</tr>
    <%
    ArrayList<User> list=(ArrayList<User>)request.getAttribute("list");  
    for(User u:list){ 	
     %>
     	<tr>
     		<td><%=(u.getUid()) %></td>
     		<td><%=(u.getUname()) %></td>
     		<td><%=(u.getPwd())%></td>
     	</tr>
     <%} %>
     </table>
     
  </body>
</html>

猜你喜欢

转载自blog.csdn.net/pengzonglu7292/article/details/87880655