本帖最后由 小石姐姐 于 2019-7-4 09:39 编辑
注册功能分析:流程图解: file://C:\Users\Administrator\Desktop\%E9%BB%91%E9%A9%AC%E9%A1%B9%E7%9B%AE1\img\regist.png?lastModify=1561861248 实现思路: 首先声明:如果熟练功能的思路,则实现功能没有固定流程,可以先写页面,也可以先写后台。 现阶段:我们一般采用从页面出发。先写页面,然后根据请求地址去编写负责响应的Servlet,进而就是Servlet处理业务需要的Service类,最后是Service操作数据库所有需要的Dao类。 1.register.html注意:由于资料中已经提供html页面编写。我们将不再负责编写页面,我们需要在页面上使用javaScript和Jquery技术来实现前端代码和服务器之间的数据交互。 <script>
/*
表单校验:
1.用户名:单词字符,长度8到20位
2.密码:单词字符,长度8到20位
3.email:邮件格式
4.姓名:非空
5.手机号:手机号格式
6.出生日期:非空
7.验证码:非空
*/
//校验用户名
//单词字符,长度8到20位
[Java] 纯文本查看 复制代码 function checkUsername() {
//1.获取用户名值
var username = $("#username").val();
//2.定义正则
var reg_username = /^\w{8,20}$/;
//3.判断,给出提示信息
var flag = reg_username.test(username);
if(flag){
//用户名合法
$("#username").css("border","");
}else{
//用户名非法,加一个红色边框
$("#username").css("border","1px solid red");
}
return flag;
}
//校验密码
function checkPassword() {
//1.获取密码值
var password = $("#password").val();
//2.定义正则
var reg_password = /^\w{8,20}$/;
//3.判断,给出提示信息
var flag = reg_password.test(password);
if(flag){
//密码合法
$("#password").css("border","");
}else{
//密码非法,加一个红色边框
$("#password").css("border","1px solid red");
}
return flag;
}
//校验邮箱
function checkEmail(){
//1.获取邮箱
var email = $("#email").val();
//2.定义正则 [url=mailto:itcast@163.com]itcast@163.com[/url]
var reg_email = /^\w+@\w+\.\w+$/;
//3.判断
var flag = reg_email.test(email);
if(flag){
$("#email").css("border","");
}else{
$("#email").css("border","1px solid red");
}
return flag;
}
$(function () {
//当表单提交时,调用所有的校验方法
$("#registerForm").submit(function(){
//1.发送数据到服务器
if(checkUsername() && checkPassword() && checkEmail()){
//校验通过,发送ajax请求,
//$(this).serialize(): jquery的方法。把表单项序列化成提交的数据格式。
// 提交表单的数据 username=zhangsan&password=123
$.post("user/regist",$(this).serialize(),function(data){
//处理服务器响应的数据 data {flag:true,errorMsg:"注册失败"}
if(data.flag){
//注册成功,跳转成功页面
location.href="register_ok.html";
}else{
//注册失败,给errorMsg添加提示信息
$("#errorMsg").html(data.errorMsg);
}
});
}
//2.不让页面跳转
return false;
//如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
});
//当某一个组件失去焦点是,调用对应的校验方法
$("#username").blur(checkUsername);
$("#password").blur(checkPassword);
$("#email").blur(checkEmail);
});
</script>
2.RegistUserServlet编写思路(必读): 1.由于存在验证码的校验,因此首先获取页面传递过来的验证码数据。 2.判断验证码是否正确。验证码不正确就直接返回数据:”验证码错误“使用json格式返回。 3.验证码通过后再次获取页面提交的其它注册信息,然后交个service去完成注册业务。 4.根据service返回的boolean值来判断注册是否成功。然后根据成功与否来响应信息给页面。 [Java] 纯文本查看 复制代码 @WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//验证校验
String check = request.getParameter("check");
//从sesion中获取验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
//比较
if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
//验证码错误
ResultInfo info = new ResultInfo();
//注册失败
info.setFlag(false);
info.setErrorMsg("验证码错误");
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
return;
}
//1.获取数据
Map<String, String[]> map = request.getParameterMap();
//2.封装对象
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.调用service完成注册
UserService service = new UserServiceImpl();
boolean flag = service.regist(user);
ResultInfo info = new ResultInfo();
//4.响应结果
if(flag){
//注册成功
info.setFlag(true);
}else{
//注册失败
info.setFlag(false);
info.setErrorMsg("注册失败!");
}
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
//将json数据写回客户端
//设置content-type
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
}
}3.UserServiceImpl编写思路:(必读) 1.servlet调用了我的方法regist(User user)让我来帮他处理注册的业务。此时我能得到的数据资源就是通过参数传递过来的User对象。对象中就有页面提交过来的注册用户的信息。 2.我需要根据注册信息的用户名来查询数据库中是否有重名的用户。如果有就直接返回注册失败。 3.如果查不到重名的用户,我就调用dao的保存用户方法。将用户信息保存到数据库。至此完成注册功能。 [Java] 纯文本查看 复制代码 public class UserServiceImpl implements UserService {
//用户操作数据库的dao实现类对象
private UserDao userDao = new UserDaoImpl();
//注册用户方法
@Override
public boolean regist(User user) {
//1.根据用户名查询用户对象
User u = userDao.findByUsername(user.getUsername());
//判断u是否为null
if(u != null){
//用户名存在,注册失败
return false;
}
//用户不存在可以去注册用户了。保存用户信息到数据库。
userDao.save(user);
return true;
}
}
4.UserDaoImpl编写思路:(必读) 1.service业务层要想跟数据库打交道,需要调用Dao层的代码。因此Dao实现类的作用就是专门负责操作数据库,所以dao中一般写的都是操作数据库的增删改查方法。尽量不涉及业务逻辑,这样可以得到不同业务层的复用。
[Java] 纯文本查看 复制代码 public class UserDaoImpl implements UserDao {
//用户操作数据库的工具类对象:JdbcTemplate: 该类封装了jdbc的增删改查原始操作。
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//根据用户名查询用户的方法。
@Override
public User findByUsername(String username) {
User user = null;
try {
//1.定义sql
String sql = "select * from tab_user where username = ?";
//2.执行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper<User> (User.class), username);
} catch (Exception e) {
//这里无须打印日志,因为整个异常是因为查不到数据抛出的。不算是程序错误。
}
return user;
}
//保存用户的方法
@Override
public void save(User user) {
//1.定义sql
String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";
//2.执行sql
template.update(sql,user.getUsername(),
user.getPassword(),
user.getName(),
user.getBirthday(),
user.getSex(),
user.getTelephone(),
user.getEmail(),
user.getStatus(),
user.getCode()
);
}
}
|