JavaWeb项目实战MyShop

苏苏老师第二节课

写功能

注册功能

用户名验证

先验证用户名是否存在
先去前端页面(regist注册的页面)看一下是通过什么方式进行验证的
是通过阿贾克斯异步请求验证的

小知识点:
Ajax 全称“Asynchronous JavaScript and XML”,译为“异步 JavaScript 和 XML”,程序员们习惯称之为“阿贾克斯”,它并不是一种技术,而是多种技术的综合体,其中包括 JavaScript、XML、JSON、DOM、CSS、HTML 以及最重要的 XMLHttpRequest 对象。通过 Ajax 可以异步从服务器请求数据并将数据更新到网页中,整个过程不需要重载(刷新)整个网页,可以将网页的内容更快的呈现给用户。
这里的异步是指,当程序执行到 Ajax 代码时,将 Ajax 代码交给另外一个线程来执行,不论执行结果如何,当前线程会继续向下执行。

AJAX = Asynchronous JavaScript and XML(AJAX = 异步 JavaScript 和 XML。)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。

在这里插入图片描述

小知识点:
有一个编码流程:先写controller里对应的传递给前端的数据;然后到service业务层里写业务;再dao层向数据库对数据进行增删改查,传递给service,再传递给controller,controller再传递给前端,然后展示出来。
可以从controller往dao层写,然后从dao往controlller写

先在controller里写一个UserController,在里面写对应的用户模块的功能
继承BaseServletpublic class UserController extends BaseServlet{

刚才看的前端页面(regist.jsp)有访问路径,是通过user进行访问的,所以用户模块需要在类的前面添加一个访问路径:

import javax.servlet.annotation.WebServlet;

@WebServlet("/user")

在这里插入图片描述
回到UserController,写一个对应的验证方法

小知识点:
写方法的时候都要传入请求和响应这两个参数
String类型的,要有返回值,因为是一点一点写的,写功能的时候是要从controller里写到service再写到dao,再往回掉用方法,回到controller里去完成,需要先写一个返回值,让它是null,先让它不报错。

 public String check(HttpServletRequest request, HttpServletResponse response){

        return null;
    }

1.从前端获取输入的用户名
2.调用业务逻辑判断用户名是否存在
3.响应 页面给出提示判断用户名是否已存在

@WebServlet("/user")
public class UserController extends BaseServlet{
    public String check(HttpServletRequest request, HttpServletResponse response){
        //1.从前端获取输入的用户名

        //2.调用业务逻辑判断用户名是否存在

        //3.响应 页面给出提示判断用户名是否已存在
        
        return null;
    }
}

先不写controller里面这些内容,因为需要去调用对应的业务逻辑判断是否存在,所以需要先去写对应的业务层(service层),以及dao层

在service层先创建接口UserService:
这是对应用户模块的逻辑接口类
在这里插入图片描述

在这里面去定义一个检查用户名是否存在的方法,返回值是boolean类型
传入一个想要查询的用户名的参数,这个参数是前端输入的uname,也就是被检查的对象

boolean checkedUser(String username);

有了接口就要完成对应的实现类,在service里建一个名为impl的包,专门放对应接口的实现类,

再在impl里创建一个对应UserService的实现类UserServiceImpl

在UserServiceImpl类里实现对应的刚刚定义的UserService的接口

public class UserServiceImpl implements UserService{

此时这句话会报错这是因为,在接口里去定义了想要完成的方法,用实现类实现接口,就要去实现里面对应的方法
在这里插入图片描述
在这里插入图片描述
这是业务层,需要通过它来调用dao层,dao层根据用户名查询数据库是否有想要查询的用户,接下来先去写dao层,然后再回到service里去调用。
dao层先去创建一个对应的UserDao接口
这里面负责用户模块数据库访问的接口,根据用户名查询用户,返回值类型就是用户User,也就是对应用户的数据
定义一个查询的方法,通过用户名进行查询,username叫参数,也叫查询条件

User selectUserByName(String username);

接下来在dao包里去建一个包对应实现类,叫impl

在对应实现类的包(impl)里创建一个实现类UserDaoImpl

在这个实现类UserDaoImpl里面同样实现Userdao接口,然后再实现里面对应的方法
这个就是数据库访问的实现类

数据库表里的字段名和实体类里的名字是不一样的,所以在写sql语句的时候最好起一个别名
接下来就是写数据库对应的查询部分,想要访问到数据库,第一步就是要连接到数据库
1.创建一个QueryRunner对象,传入对应的数据库连接池(c3p0),与数据库进行连接

需要改一下c3p0里的数据库名、用户名和密码,改成我自己的

2.编写sql语句,完成数据库查询的操作
目的是想要根据用户名查询,看user表
根据实体类给数据表中的字段起一个别名
逗号一定不要少
在这里插入图片描述
在这里插入图片描述

3.通过QueryRunner对象,执行sql语句
查询的结果是用户,返回的就是user对象
传入的参数第一个就是sql语句,第二个就是解析器BeanHandler,通过解析器来解析、执行对应的sql语句
通过QueryRunner,调用query()方法,传入对应的参数

User user=queryRunner.query(sql,new BeanHandler<User>(User.class),username);

传入对应的sql语句 sql
解析器,通过解析器来解析、执行对应的sql语句 new BeanHandler(User.class)
传入了执行sql语句需要的参数 username

此时query报错,有异常,直接抛出就行了,不用管
小知识点:
在这里插入图片描述

public User selectUserByName(String username) throws SQLException {
        //1.创建一个QueryRunner对象,传入对应的数据库连接池(c3p0)
        QueryRunner queryRunner=new QueryRunner(C3P0Utils.getDataSource());
        //2.编写sql
        String sql="select u_id as uid, u_name as username, u_password as upassword, " +
                "u_sex as usex, u_status as ustatus, u_code as code, u_email as email, " +
                "u_role as urole from user where u_name=?";
        //3.执行sql
        User user=queryRunner.query(sql,new BeanHandler<User>(User.class),username);
        return user;
    }

dao层的实现类(UserDaoImpl)里面需要完成的操作:dao的实现类里面去执行对应的sql语句,完成查询,查询之后得到的是user对象,将user对象进行返回,如果没查到,那么返回的对应的值就是空值。

然后回到对应的service实现类里完成对应的操作
通过调用对应的dao层,来执行里面的方法 ,来判断查询到的user是否为空,如果为空,返回false,不为空则返回true。在dao层的实现类里完成了sql语句的编写,然后执行,执行完是完成了一个根据用户名查询用户是否存在的查询操作,将查询的用户返回,返回值是查没查询到,查询到返回的是user,没查询的返回空值。
到对应的业务层里,调用对应的dao里面的方法,执行一下,获取到对应的user,再去判断一下,返回值(user)是否为空,如果为空,说明没查到,直接返回false;如果不为空,说明查到了,返回true,然后去判断用户名是否存在

在UserServiceImpl里:
1.创建dao访问对象
2.调用对应到层里的方法去执行操作返回一个值,返回值就是user,把用户名传进去,完成查询的操作
会出现报错,抛出就行
3.处理结果,判断user是否为空,不为空,说明查到了,return true,表示存在,如果不为空,就不用写了,返回false

    public boolean checkedUser(String username) throws SQLException {
        //1.创建dao访问对象
        UserDao userDao=new UserDaoImpl();
        //2.执行结果
        User user=userDao.selectUserByName(username);
        //3.处理结果
        if (user!=null){
            return true;
        }
        return false;
    }

回到对应的controller里去写:
UserController

1.通过request获取前端输入的用户名
先判断输入的用户名是否为空,等于1的时候说明用户名已经存在了
在这里插入图片描述

2.调用业务逻辑判断用户名是否存在
在controller里面写,说明是调用service里面的内容
首先创建service对象,new一个对应的实现类,通过它来创建service对象
看UserService.java里的返回值是boolean类型,通过userService调用里面的方法,将username传入
报错还是直接抛,原因和之前一样

3.响应 页面给出提示判断用户名是否已存在
判断是true返回1,判断false返回0。

@WebServlet("/user")
public class UserController extends BaseServlet{
    public String check(HttpServletRequest request, HttpServletResponse response) throws SQLException {
        //1.从前端获取输入的用户名
        String username=request.getParameter("username");
        //做一个简单的判断
        if (username==null){
            return "1";//前端显示不能注册
        }

        //2.调用业务逻辑判断用户名是否存在
        UserService userService=new UserServiceImpl();
        boolean b= userService.checkedUser(username);

        //3.响应 页面给出提示判断用户名是否已存在
        if(b){
            return "1";
        }
        return "0";
    }
}

至此用户名验证的功能就写完了

运行,点击注册,输入用户名(随意输),输入密码(随意输),最后把鼠标点到确认密码里,会显示用户名可用,这样就行了。
在这里插入图片描述
在这里插入图片描述

注册功能

先看一下regist.jsp,看一下前端关于注册功能对应的代码
在这里插入图片描述
在这里插入图片描述
注册功能还是属于用户模块的,所以还是在UserController下面添加一个注册的方法,仍然是传入两个参数,仍然先返回一个null,让它先不报错
通过map集合来进行存储,通过request来获取前端输入的内容,存到map集合中。
map的值映射到utils上,因为key的值是一样的
首先定义一个user,用new创建
通过BeanUtils进行存储
有异常直接try/catch
这样就将获取到的用户信息定义到一个user当中,方便后面进行数据的插入
完善用户信息:
激活状态默认未激活,设置成0
code是激活码,激活码是为了邮箱激活用的,老师不讲邮箱激活,在这里先不用去定义
直接去自动生成,用RundomUtils,通过随机数生成对应的激活码
RundomUtils是激活码生成的工具类
在这里插入图片描述

还需要处理一下一些属性,md5处理,就是进行加密,在数据库中无法直接看到存入的密码
后边登录输入密码的时候也需要进行加密,才能与数据库进行比较

先获取用户信息
将用户信息同意定义到了一个user当中
然后去完善没有输入的信息,如:激活状态,用户类型以及密码(密码需进行单独的处理)
调用业务逻辑(service里的方法)

然后就可以到对应的方法里去写啦
到service里定义一个注册业务

抛异常
在这里插入图片描述
return 0;改成return rows看是否插入成功
数据插入的操作就完成啦
在这里插入图片描述
Dao层写完,就回到service里

在UserServiceImpl里执行操作
直接创建UserDao对象就可以了
直接调用方法,一返回就可以,
因为是只是去判断是否插入成功
用户信息进行插入
有报错直接抛
将对应的数据返回return row
在这里插入图片描述

service写完回到Controller里写
第三步调用用户的业务逻辑进行注册
创建UserService对象
创建完之后通过它来调用对应注册的方法,传入用户信息
判断是否发生异常,否,插入操作成功;是,插入操作失败了,说明没有注册成功,直接返回到注册页面
try catch
插入失败,跳转到注册页面
在这里插入图片描述
对应的工具类里有一个常量类,这里面封装和不封装没有什么影响
在这里插入图片描述
向前端传递一个提示
在这里插入图片描述
如果成功了,直接跳转到注册成功页面
在这里插入图片描述
这样注册功能就实现了
在这里插入图片描述
点击注册
在这里插入图片描述
跳转到成功页面了,就说明没有问题了
到数据库里看是否有插入的数据
在这里插入图片描述
有加密的密码,自动生成激活码等等
注册功能就完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值