我是要进大厂的男人!
文章目录
唠一唠
我经历了一个痛苦的十月qwq,振作过后打算找个实习。最近我在纠结的问题是选c++开发还是java开发,目前我给自己定的方向和计划就是java后端开发。相比于底层代码,我还是更喜欢上层的一些业务实现,而且通过了解发现java后端的市场需求要比C++多,进互联网大厂的话还是java会好一点。其次,我本科学的是java,虽然学的不咋地或多或少还是有点基础,最近想找一份实习,c++无法速成,再加之毕业设计,想做一个java的项目。所以还是走java后端开发的道路了。
我目前找工作最需要的是项目经历,所以现在在网上找当下比较热门的SpringBoot的MyBatis的项目。
内容如果有误的话麻烦告诉我!阿里嘎多!
概要
目前在学一个商城类的项目,最近刚学完注册和登录的实现,总结一下,以便之后复习。目前的项目结构:
代码仓库:WangXiuhao/store (github.com)
一个项目的开始
- 新建项目
- 在properties文件中配置数据库的连接信息
- 测试连接:启动SpringBoot主类,数据库是否可以正常加载
- 访问项目的静态资源是都可以正常加载
整体开发流程
一个模块的开发大体上分为四个部分
- 持久层开发:依据前端页面的设置规划相关的SQL语句,进行配置
- 业务层开发:核心功能控制、业务操作以及异常处理
- 控制层开发:接受请求、处理响应
- 前端开发
用户注册
先得有实体类,下面是对用户操作的前期准备
-
创建用户的数据表
-
创建实体基类BaseEntity
包含创建时间、创建者、修改时间、修改者,以便于以后的类进行继承
-
创建用户类
通过表的结构,添加用户的属性,要创建get、set、equals、hashCode、toString方法
接下来是用户注册的业务开发
-
持久层开发
通过MyBatis来操作数据库,做MyBatis开发的流程:
-
规划需要执行的SQL
注册的操作主要用到插入和查询两种:插入一个新用户、查询当前用户名是否存在
insert into t_user (username,password) values (值列表)
select * from t_user where username = ?
-
设计接口
定义Mapper接口,在项目的目录结构创建mapper包,在这个包下根据不同的功能模块来创建mapper接口,创建一个usermapper接口,编写抽象方法
SpringBoot要做两件事:创建mapper实现类、怎么实现mapper
创建mapper实现类两种方法
-
@Mapper
-
@MapperScan
@MapperScan("com.cy.store.mapper")
怎么实现mapper有两种方法
-
@Insert、@Delete、@Update、@Select
-
在properties文件
mybatis.mapper-locations=classpath:mapper/*.xml
-
-
编写映射
编写xml文件
-
单元测试
要注意添加注解
@SpringBootTest //@RunWith表示的是启动单元测试类,需要传递固定的参数 @RunWith(SpringRunner.class)
-
-
业务层开发
service下有三个部分:1.异常 2.接口 3.具体实现
-
异常
根据业务层不同的功能,统一去继承ServiceException异常类
插入异常、用户名重复异常 实现五种方法
-
设计接口
在service包下创建一个IUserService接口
-
实现
在impl包下继承IUserService接口,实现功能,要加@Service注解
-
测试
这里有个小问题是关于@Autowired的,长大后再学习
-
-
控制层开发
-
创建一个JasonResult类作为返回给前端的数据类型,包括状态码、状态描述信息、数据,记得实现相应的构造方法和setget方法
-
设计请求
根据注册功能设计请求,模板如下
请求路径:/user/reg 请求参数:User user 请求类型:POST 响应结果:JsonResult<void>
-
处理请求
创建UserController类来接受前端传来的请求,这个类要继承一个BaseController类,这里可以把异常处理的操作都放在BaseController里,自动地统一处理异常
@ExceptionHandler(ServiceException.class) //用于统一处理抛出的异常 public JsonResult<Void> handleException(Throwable e){ JsonResult<Void> result = new JsonResult<>(e); if(e instanceof UsernameDuplicatedException){ result.setState(4000); result.setMessage("用户名已经被占用1"); }else if(e instanceof UserNotFoundException){ result.setState(4001); result.setMessage("用户数据不存在的异常"); }else if(e instanceof InsertException){ result.setState(5000); result.setMessage("注册时产生未知的异常"); }else if(e instanceof PasswordNotMatchException){ result.setState(4002); result.setMessage("密码错误的异常"); } return result; }
-
-
前端页面(长大后再学习)
-
在register页面中编写发送请求的方法,借助于点击事件来完成。涉及到两个问题:1.选中相对应的按钮 ( ( " 选择器 " ) ) 2. 再去添加点击的事件, ("选择器")) 2.再去添加点击的事件, ("选择器"))2.再去添加点击的事件,.ajax()函数发送异步请求。
-
JQUery封装了一个函数,称之为$.ajax(),可以异步加载相关的请求,页面没有重新加载,但是需要的内容会被填充过来。依靠的是JavaScript提供的一个对象XmlHttpResponse(XHR),封装了这个对象。
-
ajax()使用方法。需要传递一个方法体 作为方法的参数来使用,语法结构:ajax接受多个参数,参数之间要使用","进行分割,参数的值要求用字符串,声明顺序没有要求
$.ajax({ url:"", type:"", data:"", datatype:"", success:function(){ }, error:function(){ } });
-
ajax函数参数的含义
参数 功能描述 url 请求的地址,不能包含参数的列表部分的内容 type 请求类型 data 向指定url地址提交的数据 datatype 数据的类型 success 当服务器正常响应客户端时,会自动调用success参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上 error 当服务器未正常响应客户端时,会自动调用error参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上 -
js代码可以独立生命在一个js的文件里或者声明在一个script标签中
-
js代码无法被服务器解析执行,体现在点击页面中的按钮没有任何的相应,解决方案:
-
- 在项目的maven下clear install
- 在项目的file选项下 cash清理缓存
- build选项下 rebulid
- 重启idea 或者 重启电脑
-
用户登录
大致的功能:当用户输入用户名和密码将数据提交到数据库进行查询,如果存在对应的则表示登录成功,跳转index.htnl页面,跳转在前端使用jquery来完成
持久层
业务层
-
异常
有两个异常:用户名对应的密码错误、用户名没有被找到,继承ServiceException异常类,有5个构造方法
-
实现
步骤如下:
- 在IUserService接口中编写抽象方法, login(String username,String password),将当前登录成功的用户数据以当前用户对象的形式进行返回。
- 实现抽象方法
- 测试
控制层
-
业务层抛出异常,控制层负责处理异常
业务层抛出的异常,需要在统一异常处理类中进行统一的捕获和处理 细节异常从4000开始,大的异常从5000开始
-
设计请求
请求路径:/users/login 请求方式:POST 请求数据:String username, String password,HttpSession session 响应结果:JsonResult<User>
-
处理请求
用户会话Session
session对象主要存服务器端,可以用于保存服务器的临时数据的对象,所保存的数据可以在整个项目中都可以通过访问来获取,把session的数据看作一个共享的数据。首次登录的时候所获取的用户的数据,转移到session对象即可
Session.setAttribute(“key”)可以将获取session中的数据这种行为进行封装,封装在BaseController类中
- 封装session对象中数据的获取(可以封装父类中)、数据的设置(当用户登录成功后进行数据的设置,设置到全局的session对象)
- 在BaseController父类中封装两个数据:获取uid、获取username对应的两个方法(用户头像暂不考虑,将来封装到cookie中)
- 在登陆方法中将数据封装到session对象中。服务器本身自动创建session对象,已经是一个全局的session对象。SpringBoot直接使用session对象,直接将HttpSession类型的对象作为请求处理方法的参数,会自动将全局的session对象注入到请求处理方法的session形参上。
前端
- 在login.html页面中依据前面所设置的请求来发送ajax请求
- 访问页面进行用户的登录操作
拦截器
首先将所有的请求首先统一拦截到拦截器中,可以在拦截其中定义过滤的规则,如果不满足系统设置的过滤规则,统一的处理是重新打开login.html,(重定向和转发两种)推荐使用重定向,因为重定向时的网址可以是任何网址,转发的网址必须是本站点的网址
插一个重定向和请求转发的区别
1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址
3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变
4、重定向是两次request,转发只有一次请求
5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址
在SpringBoot项目中拦截器的定义和使用。SpringBoot是依靠SpringMVC来完成的,SpringMVC提供了一个HandlerInterceptor接口,可以定义拦截器,使用方法:自定义一个类,在这个类上实现这个接口,具体步骤如下:
- 首先自定义一个类,在这个类实现这个HandlerInterceptor
要实现三个方法preHandle、postHandle、afterCompletion
- preHandle
在调用所有请求处理的方法之前被自动调用执行的方法
- postHandle
在modleandview对象返回之后调用的方法
- afterCompletion
在整个请求所有相关联的资源被执行完毕最后所执行的方法
- 注册这个过滤器,做两件事情:添加白名单、添加黑名单
白名单(哪些资源可以在不登陆的情况下访问):login.html \ register.html \ login \ reg \ index \ product.html
黑名单(只有在用户登陆的状态下进行访问)
- 注册过滤器的技术
配置信息存放在项目的config包结构下,添加@Configuration注释
定义一个类LoginIntercepterConfigurer,借助WebMvcConfigure接口,实现addInterceptors方法,可以将用户定义的拦截器进行注册。
小结
在SpringBoot项目中,一个模块的编写主要是以下几个步骤,持久层->业务层->控制层->控制层->前端,再加上拦截器