基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能

2021-05-17 12:29

阅读:349

YPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

标签:ssi   xmlns   index   fonts   update   username   tco   net   dex   

 本案例的技术选型主要是jsp+servlet+JavaBean,采用三层架构的分层思想与MVC设计模式结合进行规范开发。

采用的数据库是MySQL,并且搭配数据源连接池DBCP和apache官方提供的DBUtils进行数据库连接开发。

目的是为了简化SQL连接编码,并且提高连接数据库的性能。


本案例代码不含有Css和Js效果,如需要完整代码,访问:https://download.csdn.net/download/kese7952/107028


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()				
				);
		
	}

}

  5.接下来需要把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);
		}
	}

}

  5.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

  6. 接下来把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);	
}

  7.接下来把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);
		}
	}
}

  8.接下来把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);// } }

  9. jsp页面开发

    技术分享图片

    -- 9.1 首页index.jsp    

Insert title here

  9.2 登录页面 在WEB-INF中新建一个Folder,起名为jsp,在jsp文件夹中新建 login.jsp




	

${msg } 没有账号,去注册

  9.3 注册页面 在WEB-INF中新建一个Folder,起名为jsp,在jsp文件夹中新建 regist.jsp

 

	
		${initParam.MyTitle}
请填写表单
已有账号,去登录

Mryang个人整理 转载请自觉注明出处!注:此代码仅供学习交流,请勿用于商业用途。
关注更多学习内容更新 请加入Java学习交流群 : 827829292 编程研习社QQ群①

  9.4.登录成功页面




Insert title here

${sessionScope.USER_SESSION.username},遇到您真好!


如果您呆的厌倦了,可以点我离开

  9.5 错误信息提示页面




Insert title here
	${msg}


  web.xml的配置文件内容如下:

MyTitlejavaWeb案例之用户的注册Loginindex.htmlindex.htmindex.jspdefault.htmldefault.htmdefault.jspUserServletUserServletcn.javabs.login.controller.UserServletUserServlet/UserServlet

  最终的页面效果如下所示:

 

技术分享图片

基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能

标签:ssi   xmlns   index   fonts   update   username   tco   net   dex   

原文地址:https://www.cnblogs.com/xiaoxiao5016/p/9746529.html


评论


亲,登录后才可以留言!