Springboot+bootstrap+JPA完整的管理员小功能实现

记录一下自己做的第一个小小的功能
需求:管理页面的登录,对员工的信息进行增删改查

第一部分

资源准备:
页面(登录,增删改查【去bootstrap 的官网上找】),数据库css js 文件
需要导入的依赖:

  1. webjars 【jquery, bootstrap(使用的页面的框架)】
  2. 场景启动器
    在自动创建项目的时候选择的:web-start JDBC-start Mysql-start JPA
    手动添加依赖:Druid(数据源)

技术分析
3. 将页面的连接全部改为Thymeleaf 的格式;数据库的配置,数据源(Druid)的配置(DruidSource Servlet Filter Listener)
4. 登录模块:登陆页面的国际化设置 拦截器设置,资源的映射
5. 操作部分:基本的增删改查,还有错误页面的设置



第二部分

记录遇到的问题和步骤

  1. 配置数据源的时候
    在配置DruidDataSource 的时候,使用的类名 :druidConfig 显示这个组件已经在容器中注册
    解决办法:修改方法名

  2. thymenleaf 依赖导入出错

首先要注意的问题:Thymeleaf 的最新版本是发布在github 是上面的可以去查看比较新的版本号
webjars 可以直接在maven 的官网上查找
但是场景启动器应该在springboot 官方文档
  1. 修改页面中的href 和scr 改为thymeleaf 形式
    先要在页面< html lang="en" xmlns:th="http://www.thymeleaf.org">;
  2. 设置初始页面的映射
public   WebConfiguereAdapter  xxx(){
  return WebConfiguereAdapter(){
		//重写添加映射的方法
		AddViewController  
		//拦截器的方法
		addInterceptors
};
}
  1. 编写实例bean 对应数据表,编写Repository 接口(继承Jparepository)配置application.yml 建表的方式
  2. 项目的基本结构中要添加Model 和ViewModel 【这个涉及到数据的一些安全问题】
Model:
View Model:

在使用Model 的过程中使用到了BeanUtils 的对象复制(使用的反射机制):复制的原则是相同的类型 相同的 属性名称。如果有不一样的,那BeanUtils 就不对这些进行处理
  1. 自己觉得使用Jpa 不用写sql 语句所以在访问数据的模块使用的是Jpa 但是有一个问题,有些对数据库的操作JpaRepository 没有提供相应的方法,所以还是要自己自定义sql 语句
    @Jquery
自定义的sql 语句使用@Query(value=“sql 语句” nativeQuery=ture)
例如:一个用户登录需要的sql 操作 
@Query(value = "select id,last_name,password from tbl_manager where last_name =?1 and password =?2",nativeQuery = true)
1. select (一定要指明列名 不能使用*)   
2. 在参数后面要指定参数序号
3. 如果使用的是本地的数据库查询 :nativeQuery=true

方法声明
public List findByLastnameAndPassword(@Param("last_name") String name, @Param("password") String password);
4. 返回值为一个list< 数据表对应的bean> 在参数中要将sql 语句中的数据表的列名和参数绑定
  1. 进行数据出来还是要先进行RESTful 架构的设计
登录页面表单提交数据Post
修改数据Put
删除数据 Delect
这是RESTFUL 操作时的一种格式
在这其中涉及到的技术点:【前提是添加和修改的页面是共用的】
1. 如何修改表单的提交方式

主要是修改 : _method
2. 如何在同一表单里面判断当前是添加还是修改

对于项目中的Model 的理解

例如:

如果是一个用户登录的项目(淘宝之类的)
首先:在数据库中数据表应该有两张,一张用户的基本信息表,另一张密码表【密码表应该是单独的】
在编写与数据表映射的bean 时【无论是使用jpa 还是mybatis】基本信息应该是分开的两个bean  
在Service  层,除了有接口service  接口的实现impl,还应该有一个model :
将数据库中查询的数据进行拼装(将账户的基本信息和密码)封装到Model中。返回给Controller;
同样的在Controller 中也不需要将所有的数据都传递给前端,前端只要拿到他需要展示的数据就行了,所以在Contoller 中在一个ModelView 部分,用于封装前端需要的信息,最后将这个对象返回给前端。

在数据访问的时候使用springboot Jpa 时:
当需要使用自定义的sql 语句时:
使用@Query() 但是sql 的语法和通常的sql 语句的语法不太一样,他有自己的规则

@Query(value = "select id,last_name,password from tbl_manager where last_name =?1 and password =?2",nativeQuery = true)
1. select (一定要指明列名 不能使用*)   
2. 在参数后面要指定参数序号
3. 如果使用的是本地的数据库查询 :nativeQuery=true

方法声明
public List findByLastnameAndPassword(@Param("last_name") String name, @Param("password") String password);
4. 返回值为一个list< 数据表对应的bean> 在参数中要将sql 语句中的数据表的列名和参数绑定


第三部分

对一些小技术的分析和补充

  1. thymeleaf 相同页面的抽取
在 页面中经常会遇到页面中有相同的部分,此时我们可以将相同的页面抽取出来放到一个单独的页面中,
当其他的页面要使用这些抽取的页面时,在需要的地方进行引用
在抽取页面存放的文件中:为页面片段取名字:th:href="@{/index.html}"
在要使用的的地方使用:

		
  1. 防止其他页面的访问
设置拦截器:在没有登陆的情况下有些页面是无法访问的
首先创建一个类实现Handlerinterceptor 进行拦截的逻辑判断
然后在Spring Mvc 的相关配置中配置自定义的拦截器

【拦截器和过滤器是有区别的】
拦截器实现的是HandlerInterceptor 是在Springmvc 的相关配置中完成配置的【是在Controller调用之前】
【import org.springframework.web.servlet.HandlerInterceptor;】

过滤器是实现的Filter,是在配置Servlet 的时候进行的
【import javax.servlet.*;】

过滤器是基于Serlvet容器的,拦截器不是;过滤器只在Serlvet前后起作用;拦截器中可以获取各种springboot 组件

【https://www.cnblogs.com/alilcu/p/8073744.html】
  1. 国际化的实现

你可能感兴趣的:(Spring,Boot)