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>