本案例的技术选型主要是jsp+servlet+JavaBean,采用三层架构的分层思想与MVC设计模式结合进行规范开发。
采用的数据库是MySQL,并且搭配数据源连接池DBCP和apache官方提供的DBUtils进行数据库连接开发。
目的是为了简化SQL连接编码,并且提高连接数据库的性能。
本案例代码不含有Css和Js效果,如需要完整代码,访问:https://download.csdn.net/download/kese7952/10702892
DBUtils的组件官方最新下载地址:http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi
以下是DBUtils1.7版本的分享链接:https://pan.baidu.com/s/1Ohg9v-vN2m3lwP_BSizrGA 提取码:idca
DBCP的组件官方最新下载地址:http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
POOL的组件官方最新下载地址:http://commons.apache.org/proper/commons-pool/download_pool.cgi
以下是DBCP和POOL最新版本的分享链接:https://pan.baidu.com/s/1tR5LAT5v2B94_d0wACCvSA 提取码:3e5o
项目的层级结构图如下:
1. 先设计数据库,有两种方式:
a)编写SQL代码[推荐]:
1. 创建sql文件:
2. 编写SQL代码:
-- 创建数据库
create database login;
-- 选择数据库
use login;
-- 创建用户表
create table user(
id int primary key auto_increment, -- 用户编号 - 主键(自动递增)
username varcahr(30), -- 用户名
password varcahr(30), -- 用户密码
email varcahr(50), -- 用户邮箱
sex varcahr(50) -- 用户性别 [注:最后一个字段,不要再最后加入“,”]
);
3. 使用代码进行执行建表!
b)使用可视化窗口进行建表
2. 开始写实体类:User.java
package cn.javabs.login.entity;
/**
* Title: User.java
* @date 2018年10月5日 下午3:19:40
* @author Mr.yang
* 用户的实体类设计
*/
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
3.接下来写的是DAO的接口
package cn.javabs.login.dao;
import java.sql.SQLException;
import cn.javabs.login.entity.User;
/**
* Title: UserDao.java
* @date 2018年10月5日 下午3:24:55
* @author Mr.yang
* 用户的DAO接口设计
* |--- 接口是不可以被final修饰的哦!
* |--- 登录
* |--- 注册
*/
public interface UserDao {
/**
* 用户登录(需要传入两个参数)
* @param username 用户名
* @param password 密码
* @return 用户对象
* @throws SQLException
*/
User login(String username,String password) throws SQLException;
/**
* 用户注册(传入的是对象)
* @param user
* @return 整数
* @throws SQLException
*/
int regist(User user) throws SQLException;
}
4.接下来写的是DAO的实现类
package cn.javabs.login.dao.impl;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import cn.javabs.login.dao.UserDao;
import cn.javabs.login.entity.User;
import cn.javabs.login.util.DBCPUtils;
/**
* Title: UserDaoImpl.java
* 用户的DAO实现类的设计
* @date 2018年10月5日 下午3:28:33
* @author Mr.yang 采用[数据源连接池 - DBCP] 使用Dbutils工具类中的QueryRunner进行
*/
public class UserDaoImpl implements UserDao {
QueryRunner queryRunner = new QueryRunner(DBCPUtils.getDataSource());
@Override
public User login(String username, String password) throws SQLException {
return queryRunner.query(
"select * from user where username = ? and password = ?", //
new BeanHandler(User.class), username, password);
}
@Override
public int regist(User user) throws SQLException {
return queryRunner.update("insert into user(username,password,sex,email)values(?,?,?,?)",
user.getUsername(),
user.getPassword(),
user.getSex(),
user.getEmail()
);
}
}
4.接下来需要把DAO中的用到的数据源连接池的工具类补全
package cn.javabs.login.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
/**
* Title: DBCPUtils.java
*
* @date 2018年10月5日 下午4:04:48
* @author Mr.yang
*/
public class DBCPUtils {
public static DataSource dataSource;
static {
try {
String resource = "jdbc.properties";
InputStream is = DBCPUtils.class.getClassLoader()
.getResourceAsStream(resource);
Properties properties = new Properties();
properties.load(is);
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取数据源
* @return
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 获取连接
* @return
*/
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
4.2 在config的中创建配置文件:jdbc.properties
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql:///login
username = root
password = sorry
# 初始化连接
initialSize=10
# 最大连接数量
maxActive=50
# 最大空闲数量
maxIdle=20
# 最小空闲数量
minIdle=5
5.接下来把service层的接口设计出来
package cn.javabs.login.service;
import cn.javabs.login.entity.User;
/**
* Title: UserService.java
* @date 2018年10月5日 下午4:15:04
* @author Mr.yang
*/
public interface UserService {
/**
* 用户登录(传入两个参数,用户名和密码)
* @param username
* @param password
* @return 用户对象
*/
User userLogin(String username,String password);
/**
* 用户注册(传入的是对象)
* @param user
* @return 影响的行数
*/
int userRegister(User user);
}
6.接下来把service层的实现类设计出来
package cn.javabs.login.service.impl;
import java.sql.SQLException;
import cn.javabs.login.dao.UserDao;
import cn.javabs.login.dao.impl.UserDaoImpl;
import cn.javabs.login.entity.User;
import cn.javabs.login.service.UserService;
/**
* Title: UserServiceImpl.java
* @date 2018年10月5日 下午4:17:34
* @author Mr.yang
*/
public class UserServiceImpl implements UserService {
UserDao userDao = new UserDaoImpl();
@Override
public User userLogin(String username, String password) {
try {
User user = userDao.login(username, password);
return user;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public int userRegister(User user) {
try {
return userDao.regist(user);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
7.接下来把controller层的控制器设计出来
package cn.javabs.login.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import cn.javabs.login.entity.User;
import cn.javabs.login.service.UserService;
import cn.javabs.login.service.impl.UserServiceImpl;
/**
*
* @author Mryang StringUtilsz中的isNotbBlock:判断某字符串是否不为空且长度不为0且不由空白符构成
*
*/
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 引入UserService
UserService userService = new UserServiceImpl();
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String method = request.getParameter("method");
// 如果传入的参数是login
if ("login".equals(method)) {
login(request, response);
// 如果传入的参数是regist
} else if ("regist".equals(method)) {
regist(request, response);
// 如果传入的参数是logout
} else if ("logout".equals(method)) {
logout(request, response);
// 如果传入的参数是tologin
} else if ("tologin".equals(method)) {
tologin(request, response);
// 如果传入的参数是toregist
} else if ("toregist".equals(method)) {
toregist(request, response);
// 如果传入的参数是对应不上
} else {
request.setAttribute("msg", "该功能正在开发...");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
/**
* 用户登录
*
* @param request
* @param response
*/
private void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1. 获取前台jsp表单传递的参数
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
// 如果测试传入的参数。可以打开72行的注释
// System.out.println("用户名:" + username + "
" + "密码" + password);
/*
* 2.根据参数进行判断
*/
// 2.1 如果用户名和密码都不为空
if (StringUtils.isNotBlank(username)
&& StringUtils.isNotBlank(password)) {
// 2.1.1 传递到service层登录方法
User user = userService.userLogin(username, password);
// 2.1.2 判断用户信息是否查询到
if (user != null) {
// 查询到,存入session
request.getSession().setAttribute("USER_SESSION", user);
// 登录成功,转向主页
request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(
request, response);
} else {
// 未查询到或者用户名和密码不匹配,将失败的信息存储到msg中
request.setAttribute("msg", "用户名或者密码不对!");
// 登录失败,转向错误信息提示页面,根据存入的msg取出相对应的内容
request.getRequestDispatcher("/message.jsp").forward(request,
response);//
}
// 2.2 如果用户名或者密码为空
} else {
request.setAttribute("msg", "用户名或者密码不许为空!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(
request, response);//
}
}
/**
* 用户注册
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void regist(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
// 1. 获取前台jsp页面的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String email = request.getParameter("email");
// 2. 将获取到的参数封装到user对象中去
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
user.setSex(sex);
if (StringUtils.isNotBlank(user.getUsername())
&& StringUtils.isNotBlank(user.getPassword())) {
int rows = userService.userRegister(user);
if (rows > 0) {
response.setHeader("refresh",
"1;url=UserServlet?method=tologin");
} else {
request.setAttribute("msg", "注册失败!");
request.getRequestDispatcher("/message").forward(request,
response);
}
}else{
request.setAttribute("msg", "用户名或者密码不许为空");
request.getRequestDispatcher("/message").forward(request,
response);
}
}
/**
* 转向到登录页面
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void tologin(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,
response);//
}
/**
* 转向到注册页面
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void toregist(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/regist.jsp").forward(
request, response);//
}
/**
* 用户注销
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void logout(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.getSession().invalidate();
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(
request, response);//
}
}
8.首页
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
9.注册页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
${initParam.MyTitle}
10.登录成功页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${sessionScope.USER_SESSION.username},遇到您真好!
如果您呆的厌倦了,可以点我离开
错误提示页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${msg}
web.xml的配置文件内容如下:
MyTitle
javaWeb案例之用户的注册
Login
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
UserServlet
UserServlet
cn.javabs.login.controller.UserServlet
UserServlet
/UserServlet
最终的页面效果如下所示: