admin管理员组文章数量:1635325
一、项目搭建
1.1 src
6个包–>controller、dao、entity、filter、service、utils
一个c3p0-config.xml
c3p0数据库连接池使用步骤
1.2 web
css、js、WEB-INF下lib
导入jar包和jQuery、bootstrap
Maven下载
其中对BeanUtils的jar包下载
BeanUtils使用及报错的解决办法
二、entity实体层
重点就是继承Serializable接口
Serializable接口-所有实体类都继承
User类的代码
package com.itqf.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 4L;
private int uid;
private String uname;
private String upassword;
private String uemail;
private String usex;
private int status;
private String ucode;
private int urole;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String getUemail() {
return uemail;
}
public void setUemail(String uemail) {
this.uemail = uemail;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getUcode() {
return ucode;
}
public void setUcode(String ucode) {
this.ucode = ucode;
}
public int getUrole() {
return urole;
}
public void setUrole(int urole) {
this.urole = urole;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", upassword='" + upassword + '\'' +
", uemail='" + uemail + '\'' +
", usex='" + usex + '\'' +
", status=" + status +
", ucode='" + ucode + '\'' +
", urole=" + urole +
'}';
}
}
三、Dao层
重点c3p0连接数据库
c3p0数据库连接池使用步骤
3.1 UserDao
用户模块数据库的访问接口
package com.itqf.dao;
import com.itqf.entity.User;
/*
* 用户模块数据库访问的接口*/
public interface UserDao {
public User selectUserByUname(String username);
}
3.2 UserDaoImpl
用户模块数据库访问的实现类
package com.itqf.dao.impl;
import com.itqf.dao.UserDao;
import com.itqf.entity.User;
import com.itqf.utils.C3p0Utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.Connection;
import java.sql.SQLException;
/*
* 用户模块数据库访问的实现类*/
public class UserDaoImpl implements UserDao {
private QueryRunner queryRunner = new QueryRunner(C3p0Utils.getDataSource());
@Override
public User selectUserByUname(String username) {
User user = null;
String sql = "select u_id as uid,u_name as uname,u_password as upassword,u_email as uemail,u_sex as usex,u_status as status,u_code as ucode,u_role as urole from user where u_name = ?";
try {
user = queryRunner.query(sql, new BeanHandler<User>(User.class), username);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
}
四、 service层
4.1 UserService
检测用户名是否存在的接口
package com.itqf.service;
public interface UserService {
//检测用户名是否存在
public boolean checkUser(String name);
}
4.2 UserServiceImpl
检测用户名是否存在的实现类
用户名已经了存在返回false、不存在(就是可以注册)返回true
package com.itqf.service.impl;
import com.itqf.dao.UserDao;
import com.itqf.dao.impl.UserDaoImpl;
import com.itqf.entity.User;
import com.itqf.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public boolean checkUser(String name) {
UserDao userDao = new UserDaoImpl();
User user = userDao.selectUserByUname(name);
if(user!=null){
return true;
}
return false;
}
}
五、Controller层
5.1 先写BaseServlet页面、Constans处理常量的Utils类
重点就是
BaseServlet封装业务逻辑
以下是baseServlet页面代码
package com.itqf.controller;
import com.itqf.utils.Constants;
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.lang.reflect.Method;
@WebServlet(name = "BaseServlet")
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter(Constants.TAG);
if(method==null&method.equals("")){
method = Constants.INDEX;
}
//1. 获取类的class对象
Class clazz = this.getClass();
try {
Method method1 = clazz.getMethod(method,HttpServletRequest.class,HttpServletResponse.class);
Object result = method1.invoke(this,req,resp);
if(result != null){
String str= (String)result;
if(str.startsWith(Constants.FORWARD)){
String path = str.substring(str.indexOf(Constants.FLAG)+1);
req.getRequestDispatcher(path).forward(req,resp);
}
else if(str.startsWith(Constants.REDIRECT)){
String path = str.substring(str.indexOf(Constants.FLAG)+1);
resp.sendRedirect(path);
}
else {
resp.getWriter().println(str);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String index(HttpServletRequest req,HttpServletResponse resp){
return Constants.FORWARD+Constants.FLAG+"/index.jsp";
}
}
以下是Constants类的代码
package com.itqf.utils;
public class Constants {
public static final String TAG = "method";
public static final String FORWARD = "forward";
public static final String REDIRECT = "redirect";
public static final String FLAG = ":";
public static final String INDEX = "index";
/*
* 定义用户模块涉及的常量*/
public static final String HAS_USER="1";
public static final String NOT_HAS_USER="0";
}
5.2 再写UserController继承BaseServlet
Register.jsp页面通过jQuery AJAX传值给UserController页面,调用这个check方法
- 重点就是check方法是判断用户名
- checkEmail方法是判断用户输入的email格式对不对
jQuery 集成AJAX
下面return的0和1已经在Constants类下面定义成常量了
package com.itqf.controller;
import com.itqf.service.UserService;
import com.itqf.service.impl.UserServiceImpl;
import com.itqf.utils.Constants;
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.lang.reflect.Method;
/*
* 用户模块的controller*/
@WebServlet(name = "UserController", value = "/user")
public class UserController extends BaseServlet {
public String check(HttpServletRequest req, HttpServletResponse resp) {
//1.获取用户名
//2.调用业务逻辑判断用户名是否存在
//3.响应字符串 1 存在 0 不存在
String username = req.getParameter("username");
if(username == null){
return Constants.HAS_USER;
}
UserService userService = new UserServiceImpl();
boolean b = userService.checkUser(username);
if(b){
return Constants.HAS_USER;
}
return Constants.NOT_HAS_USER;
}
public String checkEmail(HttpServletRequest req, HttpServletResponse resp){
String uemail = req.getParameter("uemail");
boolean result = isEmail(uemail);
if(result){
return "1";
}
return "0";
}
public static boolean isEmail(String string) {
if (string == null)
return false;
String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern p;
Matcher m;
p = Pattern.compile(regEx1);
m = p.matcher(string);
if (m.matches())
return true;
else
return false;
}
}
六、Register.jsp页面的<body></body>
6.1 使用了bootstrap的模态框效果,
重点就是导入modal-dialog、modal-content、modal-header、modal-body、modal-footer类
6.2 注册框的头部
6.3 注册框的中部
6.4 注册框的尾部,也写在form表单中!不然提交按钮怎么提交?!!!
6.5 注册框中部 :form表单内的元素
6.5.1 用户名:
一个label标签、一个input输入框、
再加一个div>p>span用于显示验证用户名的信息,
div.class="col-xs-3"栅格用style居右,label.class=“col-xs-9”
p.class=“text-danger”,span.class=“help-block”
6.5.2密码、确认密码、邮箱
这3个都是一个lable标签、一个input输入框、一个p标签(提示信息)
七、Register.jsp页面的<head></head>
7.1 导入问题:bootstrap.min.css和bootstrap.min.css.map和jquery-3.5.1.js、bootstrap.min.js都要导入
一开始导入失败:
右键浏览器页面检查
,报错:找不到bootstrap.min.css.map的404
发现是没有导入bootstrap.min.css.map、重新导入还是报错
网上找了是由于没有删除bootstrap.min.css的最后一行注释
删除了发现还是报同样的错误,原因是浏览器缓存了
做web项目对css和js文件更改后浏览器端不生效的解决办法
7.2 Register.jsp页面通过jQuery AJAX传值给UserController页面,调用check方法判断用户名,调用checkEmail方法判断email格式对不对
(check方法在UserController页面)
jQuery 集成AJAX
全部代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="#">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/bootstrap.min.css.map" rel="stylesheet">
<script type="text/javascript" src="js/jquery-3.5.1.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript">
var bool = true;
$(function () {
<%-- ajax判断用户名是否重复--%>
$("#username").change(function () {
$.get("user", "username=" + this.value + "&method=check", function (data) {
if (data == 1) {
$("#usernameMsg").html("用户名已经存在").css("color", "red");
bool = false;
} else {
$("#usernameMsg").html("用户名可用").css("color", "green");
bool = true;
}
})
});
//ajax判断邮箱格式是否正确
$("#email").change(function () {
$.get("user", "uemail=" + this.value + "&method=checkEmail", function (data) {
if (data == 1) {
$("#uemailMsg").html("邮箱格式正确").css("color", "green");
bool = true;
} else {
$("#uemailMsg").html("邮箱格式输入不正确").css("color", "red");
bool = false;
}
})
});
//ajax判断密码是否是6位
$("#password").change(function () {
if (this.value.length > 6 || this.value.length < 1) {
$("#upasswordMsg").html("密码格式错误,请输入6位字符").css("color", "red");
bool = false;
} else {
$("#upasswordMsg").html("密码可用").css("color", "green");
bool = true;
}
});
$("#registerBtn").attr("disabled",(!bool));
})
</script>
</head>
<body>
<div class="register modal-dialog">
<div class="modal-content">
<%-- 注册框的头部--%>
<div class="register_header modal-header">
<div class="header">
<div class="col-xs-6 h3" style="text-align: left">用户注册</div>
<div class="col-xs-6" style="text-align: right"><a href="index.jsp">首页</a></div>
</div>
<hr>
</div>
<%-- 注册框的中部--%>
<div class="regiser_body">
<form action="/qfshop_war_exploded/user?method=register" method="post">
<div class="modal-body">
<%-- 用户名--%>
<div class="form-group">
<label class="control-label col-xs-9 " style="text-align: left">用户名:</label>
<div class="col-xs-3" style="text-align: right">
<p class="text-danger"><span class="help-block" id="usernameMsg"></span></p>
</div>
<input type="text" class="form-control" name="uname" id="username" placeholder="Username">
</div>
<%-- 密码--%>
<div class="form-group">
<label class="control-label">密码:</label>
<input type="text" class="form-control" name="upassword" id="password" placeholder="Password">
<p class="text-danger"><span class="help-block" id="upasswordMsg">请不输入6位以上字符</span></p>
</div>
<%-- 确认密码--%>
<div class="form-group">
<label class="control-label">确认密码:</label>
<input type="text" class="form-control" name="pwd2" id="pwd2" placeholder="Password Again">
<p class="text-danger"><span class="help-block" id="pwd2Msg">两次输入要一致</span></p>
</div>
<%-- 邮箱--%>
<div class="form-group">
<label class="control-label">邮箱:</label>
<input type="text" class="form-control" name="uemail" id="email" placeholder="Email">
<p class="text-danger"><span class="help-block" id="uemailMsg">请填写正确格式</span></p>
</div>
<div class="form-group">
<label class="control-label">性别:</label>
<input type="radio" id="checkbox" name="usex" value="男">男
<input type="radio" id="checkbox2" name="usex" value="女">女
</div>
</div>
<%-- 注册框的尾部--%>
<div class="register_footer">
<div class="modal-footer">
<input type="submit" class="btn-primary" id="registerBtn" value="注册"/>
<input type="reset" value="重置" class="btn btn-default">
</div>
</div>
</form>
</div>
<div>${registerMsg}</div>
<div id="notnull" class="text-danger"></div>
</div>
</div>
</body>
</html>
版权声明:本文标题:javaWeb用户注册之用户名、密码、邮箱验证例题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729200264a1189509.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论