Java框架
Wei Jieyang Lv4

前言

工具

Swagger

参考

接口规范工具,通过注释的形式来规范接口的书写,并将其以可视化的形式展示出来,使得前后端分离变得更加的便捷

  • 将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;
  • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题
  • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本
  • 通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。

【Spring】迅速将Swagger规范纳入自身的标准,建立了Spring-swagger项目,后面改成了现在的Springfox。通过在项目中引入Springfox,可以扫描相关的代码,生成该描述文件,进而生成与代码一致的接口文档和客户端代码。这种通过代码生成接口文档的形式,在后面需求持续迭代的项目中,显得尤为重要和高效。

使用

  1. 添加依赖
  1. 开启Swagger功能
  1. 配置Swagger文档摘要信息
  1. 调用接口访问

注解

@Api()

  • 用于类;表示标识这个类是swagger的资源
  • tags – 表示说明,如果有多个值,会生成多个list
  • value – 也是说明,可以使用tags替代
1
2
3
@Api(value="用户controller",tags={"用户操作接口"})
@RestController
public class UserController { }

@ApiOperation()

  • 用于方法;表示一个http请求的操作
  • value - 用于方法描述
  • notes - 用于提示内容
  • tags - 可以重新分组(视情况而用)

@ApiParam()

  • 用于方法,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)
  • name – 参数名
  • value – 参数说明
  • required – 是否必填
1
2
3
4
5
6
7
8
@ApiOperation("更改用户信息")
@PostMapping("/updateUserInfo")
public int updateUserInfo(
@RequestBody
@ApiParam(name="用户对象",value="传入json格式",required=true) User user){
int num = userService.updateUserInfo(user);
return num;
}

@ApiModel()

  • 用于类 ;表示对类进行说明,用于参数用实体类接收
  • value - 表示对象名
  • description – 描述
  • (都可省略)
1
2
3
@ApiModel(value="user对象",description="用户对象user")
public class User implements Serializable{
private static final long serialVersionUID = 1L;

@ApiModelProperty()

  • 用于方法,字段; 表示对model属性的说明或者数据操作更改
  • value – 字段说明
  • name – 重写属性名字
  • dataType – 重写属性类型
  • required – 是否必填
  • example – 举例说明
  • hidden – 隐藏
1
2
3
4
5
6
7
8
9
10
11
@ApiModelProperty(value="用户名",name="username",example="xingguo") private String username;

@ApiModelProperty(value="状态",name="state",required=true)
private Integer state;
private String password;
private String nickName;
private Integer isDeleted;

@ApiModelProperty(value="id数组",hidden=true)
private String[] ids;
private List<String> idList; //省略get/set }

@ApiIgnore()

  • 用于类或者方法上,可以不被swagger显示在页面上,比较简单, 这里不做举例

@ApiImplicitParam()

  • 用于方法,表示单独的请求参数

  • name – 参数名

  • value – 参数说明

  • dataType – 数据类型

  • paramType – 参数类型

  • example – 举例说明

@ApiImplicitParams()

  • 用于方法,包含多个 @ApiImplicitParam

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @ApiOperation(value="获取邮箱验证码",notes="三种场景:根据type参数决定\n")
    @ApiImplicitParams({
    @ApiImplicitParam(name = "type", value = "类型:register | update | forget", required = true, dataType = "String", paramType = "query"),
    @ApiImplicitParam(name = "emailAddress", value = "邮箱地址", required = true, dataType = "String", paramType = "query")
    })
    @GetMapping("/getEmailCode")
    public AjaxResult sendEmailCode(@RequestParam("type") String type,
    @RequestParam String emailAddress) {
    return loginService.sendEmailCode(type, emailAddress);
    }

JRebel

JRebel官网地址

  • JRebel是一款JVM插件,实时监控java代码的状态,它使得Java代码修改后不用重启系统,立即生效。
    • 主要针对 Java + Tomcat 的 web 项目
  • IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费时间浪费生命。
  • 目前对于idea热部署最好的解决方案就是安装JRebel插件。

破解

在激活页面的 connect online licensing service 选项下面填入激活码地址(邮箱号随意)

代理地址格式:https://jrebel.qekang.com/{GUID}

GUID生成:在线生成GUID地址

使用

开启 compile 的属性:Build project automatically

勾选全部选项

截屏2021-06-28 上午9.35.12

使用右上角的图标运行

截屏2021-06-28 上午9.38.13

1、Tomcat

2、Spring Boot

Web

注解

@ResponseBody

@Controller

@RestController

相当于 @Controller + @ResponseBody 两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

  1. 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容
    • 例如:本来应该到success.jsp页面的,则其显示success.
  1. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
  2. 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

Spring

Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用。

体系结构

Spring MVC

Spring Boot

启动类:

1
2
3
4
5
6
7
@SpringBootApplication
public class TestApplication {

public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}

注解

@SpringBootApplication

  • 启动类注解
  • 它组合了多个注解,如@componentScan、@SpringBootConfiguration、@EnableAutoConfiguration。这些注解自动开启了自动扫描、依赖注入、自动配置等功能,而且main里的方法又加载了监听器、过滤器、拦截器等功能
  • (具体查看SpringApplication.run方法的源码)

@SpringBootTest

该注解是用到类名上,表示自动启动加载类或指定某个或多个加载启动类,默认会加载当前module下的启动类

Spring Security

参考

Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。

相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。

因此,一般来说,常见的安全管理技术栈的组合是这样的:

  • SSM + Shiro
  • Spring Boot/Spring Cloud + Spring Security

注解

@PreAuthorize()

  • 可以用来控制一个方法是否能够被调用
  • @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
    • @ss标签对应的 PermissionService
    • 调用service的 hasPermi 方法
    • 传入参数为 monitor:logininfor:export,表示用户的查询权限

Controller层

1
2
3
4
5
6
7
@PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
@GetMapping("/list")
public TableDataInfo list(SysLogininfor logininfor) {
startPage();
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
return getDataTable(list);
}

Service层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Service("ss")
public class PermissionService {
...
/**
* 验证用户是否具备某权限
*
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
public boolean hasPermi(String permission) {
if (StringUtils.isEmpty(permission)) {
return false;
}
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {
return false;
}
return hasPermissions(loginUser.getPermissions(), permission);
}
/**
* 判断是否包含权限
*
* @param permissions 权限列表
* @param permission 权限字符串
* @return 用户是否具备某权限
*/
private boolean hasPermissions(Set<String> permissions, String permission) {
return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
}
}

@PermitAll

@PermitAllScope

SSH

SSM

Spring + SpringMVC + MyBatis

项目目录结构:

1265200-20181218224119343-81299111
  • Post title:Java框架
  • Post author:Wei Jieyang
  • Create time:2021-06-22 11:47:39
  • Post link:https://jieyang-wei.github.io/2021/06/22/Java框架/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.