Javaweb学习笔记【项目实战】(三)
Javaweb学习笔记【项目实战】(三)
何平安本文章的图片由于是天香园1.0的但是过期了图片就查看不了,就当我自己的一个纪念了吧~
科普一下htpps各种错误代码:常见HTTP错误代码大全 – 知乎 (zhihu.com)
环境搭建/基础准备
创建如下的文件
配置MySQL数据库:
1 | -- 部门管理 |
可以看到SQL语句里面的dept和emp的变量,就分别在pojo里的Dept and Emp里定理对应的私有型变量,命名规则为驼峰型,并添加上lombok注解省略简单方法。
配置application.properties文件:
1 | #驱动类名称 |
使用Restful开发规范,前端请求方式:
https://localhost:8080/users/1 (GET:查询id为1的用户;DELECT:删除id为1的用户)
https://localhost:8080/users (POST:新增/修改用户)
Result类:用作于统一的数据操作响应的返回类型,看代码就懂了:
1 | @Data |
添加查询系统
原始记录日志方式:private static Logger log= LoggerFactory.getLogger(DeptController.class);有了lombok可以直接在Controller类上使用Slf4j注解来自动创建log日志;
原始指定值和请求方法:@RequestMapping(value = “/dept”,method = RequestMethod.GET) //指定请求方式为GET;直接新的注解:**@GetMapping**(“/dept”) //直接使用Get/Post/…Mapping就可以省略method后面的。Java像是面向注解编程…
DeptController类:通过前端请求GET型的depts指令,调用Result类型的 list方法,创建一个DeptServicelmpl类的list()方法的集合用于输出,并将结果返回给前端。
1 | @Autowired |
DeptService接口里面:定义了一个Dept类的集合的方法。
1 | List<Dept> list(); |
DeptServicelmpl接口类:重新list()方法,里面返回DepMapper类的list()方法的结果。
1 | @Service |
DeptMapper接口:list()方法为调用SQL的select查询语句。
1 | @Mapper |
总的来说就是要熟悉三层架构,层层套娃,Controller类调用Service类,Service类再调用Mapper类的方法,然后该方法又返回给Service,再返回给Controller,最后返回给前端。用postman可以输入https://localhost:8080/depts测试下响应。
前后端联调
首先下载该项目的前端文件:https://pan.baidu.com/s/1w0b-MJ33WhzNEwXNgB9EKw?pwd=1234,提取码:1234
将zip解压到一个全英文路径的文件夹,并打开里面的exe文件,打开任务管理器如果有这个程序在后台说明就运行成功了,该程序会自动占用一个90端口。打开浏览器输入localhost:90,点击部门管理,如果有结果说明就成功了!可以打开F12查看网络,是通过Tomcat将90端口转换为8080端口的。
删除部门系统
删除方法就需要前端请求时附上一个id了,且返回给前端的数据不需要日志(date),所有就用Result返回类中的success无参方法了。
一样的,Controller层:这里的**@PathVariable**注解是用于传递上面的{id}的
1 | @DeleteMapping("/depts/{id}") |
DeptService接口:定义一个有参的方法(id)
1 | void delect(Integer id); |
DeptServicelmpl类:
1 | @Override |
DeptMapper类:
1 | @Delete("delete from dept where id=#{id}") |
总之就是套娃…..会了一个其他的几乎也就全会。请求方式是DELECT了注意哦~
新增部门
请求参数就一个部门名字,因为id是自动生成,create_time和update_time也是根据创建时间生成。请求类型为POST。
Controller:
1 | @PostMapping("/depts") |
Service:(接口省了)
1 | @Override |
Mapper:
1 | @Insert("INSERT INTO dept (name, create_time, update_time) value (#{name},#{createTime},#{updateTime})") |
postman我这样编辑:
分页查询功能
由于起始索引有变化((页码-1)*每页展示记录数 ),所以需要前端传递一个页码数,另外前端还需要传递‘每页展示记录数’的参数。
先在pojo里创建个PageBean类用于定义参数,就跟之前的Dept一样,需要添加上@Date等注解。定义的变量:
1 | private Long total;//总记录数 |
先在Controller类定义@GetMapping的方法,因为要传递参数所以就要用有参的嘛,参数就这么定义:@RequestParam注解替代了原始的if语句,直接添加默认值。
1 | @RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize |
EmpController类:
1 | @GetMapping("/emps") |
EmpServiceImpl接口类:
1 | @Override |
EmpMapper接口:一个是查询页码
1 | @Select("Select count(*) from emp") |
一个是查询当前页的数据
1 | @Select("SELECT *from emp limit #{start},#{pagesize}") |
PageHelper分页插件:
目的就是简化Mapper接口和Service层的代码。下载:Maven Repository: com.github.pagehelper » pagehelper-spring-boot-starter » 1.4.6 (mvnrepository.com)
Mapper就只写:不用什么limit还要写两个查询
1 | @Select("SELECT *from emp") |
EmpServiceImpl接口类:
1 | @Override |
其他的类都一样。
条件分页查询
查询条件:模糊查询的名字,精确查询的性别,between中间查询的入职日期:eg.
1 | select * |
EmpController类里面查询方法再添加4个变量:String name,Short gender,@DateTimeFormat(pattern = “yyyy-MM-dd”) LocalDate begin,@DateTimeFormat(pattern = “yyyy-MM-dd”) LocalDate end,其他地方的看IDEA提示修改就行。Service里也要添加这四个变量。
EmpServiceImpl接口类里面要注意的是list()里面只需要这新增的四个变量,因为MySQL查询语句里面用不到page和pageSize这两个变量。Mapper接口:public List
1 | <mapper namespace="top.hepingan.mapper.EmpMapper"> |
查询语句:http://localhost:8080/emps?page=1&pagesize=10&name=张&gender=1&begin=2000-01-01&end=2010-01-01
删除操作
前端请求参数:/emp/{ids},请求方式:DELECT
创建@DeleteMapping(“emps/{ids}”)注解的方法delete(@PathVariable List
1 | <delete id="delete"> |
嗯学会了一种方法其他的都简单。
新增员工操作
前端请求方式post,json格式输入,要求有image,username,name,gender,job,entrydate,deptId。
数据比较多,之前创建的Emp就派上用场了,由于是json格式,所以就需要添加@RequestBody注解,调用Service的方法,创建Service方法,接口类定义基础的create_time and update_time,调用Mapper的方法,这里的Mapper里的添加方法就不用XML映射了,直接:
1 | @Insert("INSERT INTO emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + |
上传文件
上传到本地存储
在resources/static里面创建upload.html文件,里面编写:前端文件不用管。
1 | <!DOCTYPE html> |
再在Controller里面创建一个UploadController类,里面编写:
1 | @Slf4j |
MultipartFile 函数就上传文件的格式。这里定义的变量名要和前端给的名字一样。