在页面输入用户名和密码,进行权限判断。登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您;
登录失败跳转到FailServlet展示:登录失败,用户名或密码错误。
我们这里使用了以下技术:使用Druid数据库连接池技术,操作mysql,使用spring的JdbcTemplate技术封装JDBC。
对于实体类的封装,我们后面使用了apache的BeanUtils进行了简化
代码中我们编写了实体类,JDBC工具类,操作数据库的dao,测试类和servlet
//首先编写实体类 Userpackage cn.figo.web.domain;
/*** 数据库中的user表的实体类*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
//然后编写通用工具类 JDBCUtilspackage cn.figo.web.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
private static DataSource ds;
//静态代码块用来加载配置文件,初始化连接池对象static {
try {
Properties pro = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*** 获取连接池对象* @return*/
public static DataSource getDataSource(){
return ds;
}
/*** 获取连接对象* @return* @throws SQLException*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
//然后编写操作数据库表的 UserDaopackage cn.figo.web.dao;
import cn.figo.web.domain.User;
import cn.figo.web.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
/*** 操作数据库中的user表*/
public class UserDao {
//声明 JDBCTemplate对象 共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/*** 登录方法* @param loginUser 只有用户名和密码* @return user包含用户的所有数据*/
public User login(User loginUser){
try {
String sql = "select * from user where username = ? and password = ?";
User user = template.queryForObject(sql,
new BeanPropertyRowMapper(User.class),
loginUser.getUsername(),loginUser.getPassword());
return user;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}
//现在编写一个测试类,测试UserDao中登录方法是否有效package cn.figo.web.test;
import cn.figo.web.dao.UserDao;
import cn.figo.web.domain.User;
import org.junit.Test;
public class UserDaoTest {
@Test
public void testLogin(){
User loginUser = new User();
loginUser.setUsername("zhangsan");
loginUser.setPassword("123456");
UserDao dao = new UserDao();
User user = dao.login(loginUser);
System.out.println(user);
}
}
//然后编写 LoginServlet 用于请求处理、判断和转发
package cn.figo.web.servlet;
import cn.figo.web.dao.UserDao;
import cn.figo.web.domain.User;
import org.apache.commons.beanutils.BeanUtils;
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 java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
/*
//获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//封装User对象
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(password);
*/
//使用开源的beanutils简化对象的封装
Map map = req.getParameterMap();
User loginUser = new User();
try {
BeanUtils.populate(loginUser,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
UserDao dao = new UserDao();
User user = dao.login(loginUser);
//如果登录成功,转发到成功页,否则转发到失败页
if (user == null){
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else {
req.setAttribute("user",user);
req.getRequestDispatcher("/successServlet").forward(req,resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPut(req, resp);
}
}
// SuccessServlet
package cn.figo.web.servlet;
import cn.figo.web.domain.User;
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 java.io.IOException;
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = (User) request.getAttribute("user");
if (user != null){
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("登录成功," + user.getUsername() + "欢迎您");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
// failServlet
package cn.figo.web.servlet;
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 java.io.IOException;
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("登录失败,用户名或密码错误");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
目录结构如下:
为了大家方便使用数据库,建表语句如下
/*Navicat Premium Data TransferSource Server : MysqlConnectSource Server Type : MySQLSource Server Version : 50722Source Host : localhost:3306Source Schema : javaweblearnTarget Server Type : MySQLTarget Server Version : 50722File Encoding : 65001Date: 26/09/2019 00:10:41*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`PASSWORD` varchar(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'zhangsan', '123456');
SET FOREIGN_KEY_CHECKS = 1;
本系列所有java代码,在figo学习整理完放github地址