springboot
老师建议用spingboot框架写Java-web项目,之前接触过,但是忘了,忘了
一:熟悉spingboot
1. new 一个springboot项目
- new project 选择springboot中的Spring starter project
- 项目相关信息
First SpringBoot
- 启动类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVk3TZNJ-1621258868119)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426212027196.png)] - @SpringBootApplication 是一个“三体”结构,实际上它是一个复合 Annotation:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScanpublic
@interface重要的只有三个 Annotation,而“三体”结构实际上指的就是这三个 Annotation:- @Configuration
- @EnableAutoConfiguration
- @ComponentScan
登录实现demo
-
前端通过ajax发送登录验证请求,请求参数是username 和password,然后后端连接数据库,根据请求的username查询数据库,得到相对应账号的密码truepassword,验证这个数据库的密码和请求的密码是否一致,一致则登录成功。
-
后端使用mysql数据库,Mybatis框架封装jdbc,开始创建项目的时候勾选MyBatis Framework ,MySQL Driver会自动生成对应的依赖。
-
在com.example.test下创建4个包,与TestApplication.java(启动项所在文件)同级。
四个包分别是 controller (控制层),entity(实体层),mapper(映射层),service(业务层)。 -
在src/main/resources下建mapper包。
-
修改配置文件,这里使用application.yml文件(springboot底层会把application.yml文件解析为application.properties)。
-
在application.yml下写上配置信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5blDN6Lv-1621258868155)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426213320480.png)]主要有服务器端口,数据库地址,数据库账号密码。
-
-
创建类
- UserMapper.java
mapper包下。
dao层。数据库进行持久化操作,他的方法使针对数据库操作的,基本上用的就是增删改查,他就是个接口,只有方法名,具体实现在mapper.xml中实现。 - service层:UserService.java
业务层,存放业务逻辑处理,不直接对数据库进行操作,有接口和接口实现类,提供 controller 层调用方法。 - 在service层下创建包impl,作为userservice的实现类。
- Controller层:UserController.Java
控制层,导入 service层,调用你service方法,controller通过接受前端传来的参数进行业务操作,在返回一个制定的路径或数据表。 - entity层:user.java
存放的是实体类,属性值与数据库值保持一致,实现 setter 和 getter 方法。
- UserMapper.java
-
resources下mapper下创建User Mapper.xml(SQL具体操作)
-
具体流程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-piRK0VBa-1621258868166)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426214045730.png)]
注册
-
由于登录的时候相关层已经存在,所以在实现注册的时候,利用已经有的结构添加相关方法,映射等。
-
mapper层:添加Integer addnew(User user);方法
-
在mapper.xml中添加具体的数据库操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrPEhPkg-1621258868171)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426214523034.png)] -
业务层接口和实现类
- 在service.java中添加 void insert(User user);接口
- 在impl中添加insert的具体实现方法。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBPaHJCj-1621258868174)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426214707695.png)]
-
添加控制器类,添加注册方法
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukYPHTLy-1621258868178)(C:\Users\14112\Desktop\yang\Software Safety\md\image-20210426214806082.png)]
-
此时,简单的注册就通过前端/handleregisterstudent的action调用controller层的handleregisterstudent方法,方法中又调用了service中的insert方法,insert方法具体实现类在impl中,impl中的insert调用了mapper层的addnew方法,addnew方法通过mapper.xml中的addnew实现对数据库的操作。
详细设计
总体流程:
主要功能详细设计:
注册:
注册功能流程图:
类图:
数据库表:
类的描述及主要代码:
前端:form表单,然后根据radio选择不同来进行不同的controller层的映射。
在提交form表单之前会要进行一段输入合法性的验证。
合法性验证:
function beforeSubmit(form){
var specialKey = “[`!#$^&*()=|{}’:;’,\[\].<>/?!#¥……&*()——|{}【】‘;:”“’。,、?]‘’”;//Specific Key list
//var realkey1 = String.fromCharCode(form.username.value);
//var realkey2 = String.fromCharCode(form.password.value);
//alert(realkey1);
var flg1 = false;
for(var i=0;i<form.username.value.length;i++)
{
flg1 = (specialKey.indexOf(form.username.value[i]) >= 0);
if (flg1) {
alert(‘用户名中请勿输入特殊字符’);
return false;
}
}
var flg2 = false;
for(var i=0;i<form.password.value.length;i++)
{
flg2 = (specialKey.indexOf(form.password.value[i]) >= 0);
if (flg2) {
alert('密码中请勿输入特殊字符');
return false;
}
}
if(form.username.value==''){
alert('用户名不能为空!');
form.username.focus();
return false;
}
if(form.password.value==''){
alert('密码不能为空!');
form.password.focus();
return false;
}
if(form.password.value.length<6){
alert(form.password.value[1]);
alert('密码至少为6位,请重新输入!');
form.password.focus();
return false;
}
/*检测是否有了用户
$(document).ready(function(){
$("#but2").click(function(){
data1=$.ajax({url:"http://localhost:8080/user/isPassT?username="+userName.value+"&password="+password.value,async:false});
data2=$.ajax({url:"http://localhost:8080/user/isPass?username="+userName.value+"&password="+password.value,async:false});
var ispass1=data1.responseJSON
var ispass2=data2.responseJSON
if(ispass1 || ispass2){
alert("用户已存在");
return false;
}
});
});
*/
var reg = /^[A-Za-z]+[0-9]+$/;
var v = form.password.value;
if (!reg.test(v)) {
alert("密码强度不够!");
return false;
}
alert("注册成功!");
return true;//表单提交前的认证,注意:form要加上onSubmit事件
}
Controller类:
映射后的方法:
Controller层调用service层的insert:
Insert的具体实现方法:
Mapper接口类:
Mapper.xml对数据库的具体操作:
登录:
登录功能流程图:
类图:
类的描述及主要代码段:
前端:
验证码:
Ajax传值:获取bool类型的一个返回值,判断用户名口令是否正确
IsPass映射:
Service层:
Mapper层:
Mapper层具体实现:
验证完成后进行登录:
前端:
控制层映射:
登录后的界面:
登录后安全退出:
点击退出后对于控制层layout映射:
重置密码:
登录界面有个重置密码的链接,可以供用户定期修改密码。
点击重置密码后会进入重置密码的界面:
用户名和原口令对应正确,将用户输入的新口令替换数据库中的原口令:
Controller层映射:
Service层方法:
Mapper层:根据用户名更新用户的口令
其他
- 验证码
- 防sql注入
- 口令加密存储
- 口令不能太短等。
- 修改密码
- 学生和教师身份