Spring ,Spring MVC,Spring Boot

Spring框架

Spring框架的作用

Spring 框架主要解决了创建对象,管理对象的问题

Spring 框架的依赖项

当项目中需要使用Spring框架时,需要添加依赖项是: spring-context

Spring 框架创建对象的做法

Spring框架创建对象有2中做法:

  • 在任何配置类(添加了@Configuration)中,自定义方法,返回某种类型(你需要的)对象,并在方法上添加@Bean注解
    • 此方法创建出来的对象,在Spring容器中名称就是方法名称.
    • 此方法应该是public
    • 此方法的返回值类型,是你期望Spring框架处理的类型
    • 此方法的参数列表,应该为空
    • 此方法的方法体,应该是自行设计的,没有要求
  • 配置组件扫描,并在组件类上添加组件注解
    • 此方式创建出来的对象,在Spring容器中的名称默认是将类名首字母改为小写
      • 例如:类名是AdminController,则对象在Spring容器中的名称为adminController
      • 此规则仅适用于类名的第1个字母大写,且第2个字母小写的情况,如果不符合此规则,则对象在Spring容器中的名称就是类名
      • 可以通过组件注解的参数来指定名称.
    • 在任何配置类上,添加 @ComponentScan ,当加载此配置类时们就会激活组件扫描
    • 可以配置@ComponentScan的参数,此参数应该是需要被扫描的根包(会扫描所配置的包,及其所有子孙包),且此注解参数的值是数组类型.
      • @CompontenScan("cn.tedu")
  • 如果没有配置@ComponentScan的参数中的根包,则组件扫描的范围就是当前类的根包,及其子孙包.
  • 需要在个组件类上添加组件注解才会被创建对象.常见的主键注解有
    • @Component: 通用注解
    • @Controller :控制器类注解
      1. @RestController:仅添加在Spring MVC框架以后才可以使用
      2. @ControllerAdvice:仅添加在Spring MVC框架以后才可以使用
      3. @RestControllerAdvice:仅添加在Spring MVC框架以后才可以使用
    • @Service :保证数据的完整性,安全性,和有效性,设计业务流程和业务逻辑规则,是Serviect这种业务注解
    • @Repository :处理数据源中的数据读写的类的注解
  • 以上四种组件注解在Spring框架作用范围之内是完全等效的.但是用的时候我们还是要有章法,分开来用.
  • Configuration也是一个组件注解,但是和上面四个是不一样的.Spring对次注解的处理更加的特殊(Spring 框架对配置类使用了代理模式.)
    对于这两种创建对象的做法,通常
  • 如果是自定义的类,优先使用组件扫描的做法来创建对象
  • 如果不是自定义类,无法使用组件扫描的做法,只能在配置类中通过@Bean方法来创建对象
    当Spring成功创建了对象后,会将对象保存在Spring应用程序上下文中,后续,当需要这些对象时,可以从Spring上下文中获取.
    由于Spring应用程序上下文对象中持有大量对象的引用,所以:Spring应用程序上下文也通常称之为Spring 容器

Spring 框架管理的对象的作用域

默认情况下,Spring框架管理的对象都是单例的
单列 :在任何时间点,某个类的对象最多只有1个
可以在类上添加@Scope(“protorype”)使得被Spring管理的对象时"非单列的".

@Scope注解还可以配置为@Scope("singleton"),此singleton表示“单例的”,是默认的。

默认情况下,Spring框架管理框架单例是"预加载的",相当于设计模式中的单例模式的"恶汉式单列模式"

提示可以在类上添加@Lazy注解,使得此读写是"懒加载的",相当于"懒汉式单列模式",只会在第1次需要获取对象时才把对象创建出来!

注意 Spring框架并不是是用来设计模式中的"单例模式",只是从对象管理方面,对象的作用域表现域单例模式极为相似而已.

Admin admin=new Admin();
admin.setUsername("root")

自动装配

自动装配的定义:当某个量需要值时,Spring框架会自动从Spring容器中找到合适的值,为这个量赋值.
自动装配的典型表现是在某个类中添加@Autowired 注解,例如

@RestController
public class AlbumController {

// ↓↓↓↓↓↓↓↓↓自动装配的典型表现↓↓↓↓↓↓↓↓↓↓↓
    @Autowired
    private IAlbumService albumService;

或者:

@RestController
public class AlbumController {
    private IAlbumService albumService;

//                    ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
public AlbumController(IAlbumService albumService){
   this.albumService=albumService;
}
 

Spring创建对象时候,需要调用构造方法,如果类中仅有一个构造方法,Spring会自动调用,(如上所示),如果这个唯一的构造方法是有参数的,Spring也会自动从容器中找到合适的对象来调用此构造方法,如果容器没有合适的对象,则无法创建,!如果类中有多个构造方法,默认情况下,Spring会自动调用添加了@Autowired注解的构造方法,如果多个构造方法都没有添加此注解,则Spring会自动调用无参的构造方法,如果也不存在无参构造,则会报错.

或者:

@RestController
public class AlbumController {
    private IAlbumService albumService;

@Autowired
//                        ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
public void setAlbumService(IAlbumService albumService){
   this.albumService=albumService;
}

另外在配置类中的@Bean方法也是可以在需要的时候自行添加参数,如果Spring容器中有合适的值,Spring也会从容器中找到值来调用对象.
关于合适的值,Spring对于@Autowired的处理机制是:查找在Spring容器中匹配类型的对象的数量:

  • 1个:直接装配,且装配成功
  • 0个:取决于@Autowired注解的required属性
    • true(默认值):装配失败,加载时报错(即启动项目)
    • false:放弃装配,则此量的值为null,在接下来的使用过程中可能导致NPENullPointerException
  • 超过1个:取决于是否存在某个Spring Bean(Spring容器中的对象)的名称与当前量的名称匹配
    • 存在:成功装配
    • 不存在:转配失败,加载时报错(即启动项目的时候报错)
      关于通过名称匹配失败的问题
  • 默认情况下,要求量(全局变量,方法参数等)的名称与对象在Spring容器中名称完全相同,可视为完全匹配.
  • 可以在量的声明之前添加@Qualifier注解,通过此注解参数来指定名称,以匹配某个Spring容器的对象.
    • @Qualifier注解是用于配合自动转配机制的,单独使用没有意义.
      其实还可以使用@Resource注解来实现自动装配,但是不推荐
      Spring框架对@Resource注解的自动装配机制是:先根据名称再根据类型来实现自动装配,与@Autowired完全相反.
      为什么不推荐用@Resource是javax这个包(官方的)中的注解(儿子),但是@Autowired是Spring的亲儿子,为什么我们明明有官方的亲儿子,Spring还要创建一个呢?@Resource存在一定的不足,,此注解只能添加在类上、属性上、方法上,不可以添加在构造方法上、方法的参数上。

关于IoC与DI

**IoC: ** inversion of Control,控制反转,即将对象的创建,管理的权利(控制能力)交个框架
ID: Dependency Injection ,依赖注入,即为依赖项注入值(例如,controller中有Service,其实就是依赖 而我们的Service有值了那么就是注入.说白了就是赋值,但是没有等号,我们就叫注入,)
Spring框架通过DI,现实完善了Ioc

关于Spring AOP

AOP:面向切面的编程
** 注意:** AOP并不是Spring框架特有的技术,只是Spring框架很好地支持了AOP
AOP:主要用于:日志,安全,事务管理,自定义业务规则(但是我们现在都用来框架来解决这些,但是这些框架底层用了AOP,所有我们写代码后就没有用什么AOP).
在项目中,数据的处理流程大致是:

添加品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
           <---------           <---------       <---------      <---------

添加类别:请求--------->Controller -------->Service -------->Mapper ------->DB
           <---------           <---------       <---------      <---------

删除品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
           <---------           <---------       <---------      <---------

其实,各个请求提交到服务器端后,数据的处理流程是相对固定的!
假设存在某个需求,无论是添加[]品牌,添加类别,删除品牌,或者其他请求的处理,都需要在Service组件中执行相同的任务,应该如何处理?

例如,假设需要实现一个功能,“统计所有Service中的业务方法的执行耗时”,首先,需要添加依赖

<!-- Spring Boot AOP的依赖项 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

则可以在根包下创建一个aop.TimerAspect;类,作为切面类,必须添加@Aspect注解,由于是通过Spring来管理,它应该交由Spring管理,它应该是个组件类,则再补充上@Component注解,并在类中自定义方法,且通过注解来配置方法何时执行:

package cn.tedu.csmall.product.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class TimerAspect {

    public TimerAspect() {
        log.debug("创建切面对象:TimerAspect");
    }

    // 【AOP的核心概念】
    // 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
    // 切入点(PointCut):选择一个或多个连接点的表达式
    // 通知(Advice):在选择到的连接点执行的代码
    // 切面(Aspect):是包含了切入点和通知的模块
    // ----------------------------------------------------------
    // 【通知注解】
    // @Before注解:表示“在……之前”,且方法应该是无参数的
    // @After注解:表示“在……之后”,无论是否抛出异常,或是否返回结果,都会执行,且方法应该是无参数的
    // @AfterReturning注解:表示“在返回结果之后”,且方法的参数是JoinPoint和返回值
    // @AfterThrowing注解:表示“在抛出异常之后”,且方法的参数是JoinPoint和异常对象
    // @Around注解:表示“包裹”,通常也称之为“环绕”,且方法的参数是ProceedingJoinPoint
    // ----------------------------------------------------------
    // @Around开始
    // try {
    //     @Before
    //     表达式匹配的方法
    //     @AfterReturning
    // } catch (Throwable e) {
    //     @AfterThrowing
    // } finally {
    //     @After
    // }
    // @Around结束
    // ----------------------------------------------------------
    // 注解中的execution内部配置表达式,以匹配上需要哪里执行切面代码
    // 表达式中,星号(*)是通配符,可匹配1次任意内容
    // 表达式中,2个连接的小数点(..)也是通配符,可匹配0~n次,只能用于包名和参数列表
    @Around("execution(* cn.tedu.csmall.product.service.*.*(..))")
    //                 ↑ 此星号表示需要匹配的方法的返回值类型
    //                   ↑ ---------- 根包 ----------- ↑
    //                                                  ↑ 类名
    //                                                    ↑ 方法名
    //                                                      ↑↑ 参数列表
    public Object timer(ProceedingJoinPoint pjp) throws Throwable {
        log.debug("执行了TimeAspect中的方法……");

        log.debug("【{}】类型的对象调用了【{}】方法,参数值为【{}】",
                pjp.getTarget().getClass().getName(),
                pjp.getSignature().getName(),
                pjp.getArgs());

        long start = System.currentTimeMillis();
        // 注意:必须获取调用此方法的返回值,作为当前切面方法的返回值
        // 注意:必须抛出调用此方法的异常,不可以使用try...catch捕获并处理
        Object result = pjp.proceed(); // 相当于执行了匹配的方法,即业务方法
        long end = System.currentTimeMillis();

        log.debug("执行耗时:{}毫秒", end - start);

        return result;
    }

}


【AOP的核心概念】

  1. 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
  2. 切入点(PointCut):选择一个或多个连接点的表达式(注解里面的选择表达式)
  3. 通知(Advice):在选择到的连接点执行的代码(就是上面的注解)
  4. 切面(Aspect):是包含了切入点和通知的模块

Spring MVC框架

Spring MVC框架的作用

Spring MVC 框架主要解决了接收请求,响应结果的相关问题

Spring MVC框架的依赖项

当项目中使用Spring MVC框架时,需要添加的依赖项是:spring-webmvc

配置请求路径

通过@RequestMapping系列注解可以配置请求路径

限制请求方式

通过@RequestMapping注解的method属性限制请求方法,如

@RequestMapping(value="/login",method=RequestMetho.POST)

或者直接使用衍生的注解,例如@GetMapping,@PostMapping

接受请求参数

可以在处理请求的方法的参数列表中自由设计请求参数,可以:

  • 将各个请求参数逐一列举出来,表现为方法的多个参数,例如:
public JsonResult<Void> login(String username,String password){...}
  • 将各个请求参数封装到自定义类型中,使用自定义类型作为方法参数
    关于请求参数注解
  • @RequestParam:此注解可以用于:**1.**修改请求参数的名称(没有太多的实用价值),2强制要求必须提交这个参数,(可以通过Validation框架的@NotNull实现同样的效果)所有也没有太多价值,3:设置请求参数的默认值,(适用于允许客户端)提交此请求参数时)
  • @PathVariable:当URL中设计了占位符参数时,必须在对应的方法参数上添加此注解,以表示参数的值来自URL中的占位符位置的值,如果占位符中的名称与方法参数名称不匹配,可以通过此注解的参数来配置
    在这里插入图片描述
  • @RequestBody:当方法的参数添加了此注解时,客户端提交的请求参数必须是对象格式的,当方法的参数没有添加此注解时,客户端提交的请求参数必须是FormData格式.

响应结果

  • 默认情况下,处理请求的方法的返回值将表示"处理响应结果的视图组件的名称,及相关的数据".在Spring MVC中,有一种内置的返回值类型是Model AndView,不是前后端分离的做法,
  • 在处理请求的方法上可以添加一个@ResponseBody注解,当添加此注解后,处理请求的方法的返回值将表示"响应的数据,"不再由服务器端决定视图组件,这种做法也叫做响应正文! 这是前后端分离的做法.
  • @ResponseBody注解可以添加在处理请求的方法上,将作用于当前方法,也可以添加在控制器类上,将作用于控制器类中所有处理请求的方法.!
  • 控制器类需要添加@Controller注解,才是控制器类,或者,也可以改为添加@RestController,此注解是由@Controller@ResponseBody组合而成的,所以,添加@RESTController后,当前控制器类中多有处理请求的方法都是响应正文的.
    当控制器类处理请求需要响应正文时,Spring MVC框架会根据处理请求的方法的放回值类型,来决定使用某个MessageConverter(消息转换器),来将返回值转换为响应到客户端的数据,不同的返回值类型对应不同的消息转换器,例如
    ,返回值是String时,Spring MVC将使用stringHttpMessageConverter,如果某个返回值类型是Spring MVC框架默认不识别的没有对应的消息转换器,且当前项目添加了jackson-databind依赖项后,会自动使用此依赖项中的消息转换器,而jackaon-databind中的消息转换器会将返回的结果转换为JSON格式的字符串.!==所有我们的项目为什么能响应JSON类型的数据,1,是因为我们的类型框架自动不识别,2,是因为我们添加了此框架.==另外,如果此项目是使用XML来配置的SpringMVC框架的,还需要添加<annotation-driiven/>以开启注解驱动,如果是使用注解进行配置的,则需要在配置类添加@RnableWebMVC注解,如果在SpringBoot应用SpringMVC,不需要进行配置.
    .

关于处理异常

添加了 @ExceptionHandler注解的方法,就是处理异常的方法

  • 处理异常的方法到底处理哪种异常.由@ExceptionHandler注解参数或方法的参数中的异常类型来决定,如果@ExceptionHandler注解没有配置参数,由方法参数中的异常类型决定,如果@ExceptionHandler注解配置了参数,由注解参数中配置的类型为准.
  • 处理异常的方法可以声明在控制器类,将只作用于当前控制器类中的方法抛出的异常
    • 通常,建议将处理异常的方法声明在专门的类中,并在此类上添加@ControllerAdvice注解,当添加此注解后,此类中特定的方法(例如处理异常的方法)将作用于每次处理请求的过程中!如果处理异常后的将"响应正文",也可以在处理异常的方法上添加@ResponseBody注解,或在当前类上添加@ResponseBody,或使用@RestControllerAdvice取代@ControllerAdvice@ResponseBody注解.

Spring MVC核心处理

在这里插入图片描述

Spring Boot框架

Spring Boot框架的作用

Spring Boot 框架主要解决了统一管理依赖项与简化配置相关的问题
统一管理依赖项:在开发实践中,项目中需要用到的依赖项可能较多,在没有SpringBoot之前,可能徐需要自行添加若干个依赖项,并且,需要自行保证这些依赖项的版本不会发生冲突,或保证不存在不兼容的问题.Spring Boot提供了starter依赖项(就是依赖项的名称中都有starter作为关键字),这种依赖项包含了使用某个框架时可能涉及的一系列依赖项,并处理好了各种依赖项的版本相关问题,保证依赖项的版本兼容,不冲突!例如spring-boot-starter-web就包含了Spring MVC的依赖项(Spring-webmvc),jackson-databind,tomcat
简化配置 Spring Boot默认各个项目中最可预测的配置,它是一种约定大于配置的思想.当然这些配置也都是可以修改的,例如通过在application.properties中添加指定属性名的配置.

Spring 框架的依赖项

当项目中使用Spring Boot 框架时,需要添加的基础依赖项是:spring-boot-starter.此基础依赖项被其他各自带有starter字样的依赖项所包含,所以,通常是不必显示的添加此基础依赖项.

典型的应用技巧

关于日志
spring-boot-starter中已经包含spring-boot-starter-logging,所以,在添加任何starter依赖后,在项目中均可使用日志.
关于配置文件

  • Spring Boot项目默认在src/main/.resources下已经准备好了配置文件,且Spring Boot默认识别的配置文件的文件名是application,其扩展名为.properties.yml
  • 此配置文件会被Spring Boot自动读取,框架指定属性名称的个配置值会被自动应用,自定义的配置需要通过Environment对象或通过@Value注解自行读取并应用,所有不是指定属性名称的配置都是自定义配置.
  • 其实,读取.properties配置文件是Spring框架能做到的功能,而.ym 配置是Spring 框架并不支持的,但是在Spring Boot中,添加了解析 .yml文件的依赖项,所以,在Spring Boot 中既可以使用.properties也可以使用.yml.
  • 另外,Spring Boot 还很好的支持了Profile配置(也是Spring框架做到的功能)

注解

注解所属框架添加位置和作用
@ComponentScanSpring添加在配置类上,开启组件扫描。
如果没有配置包名,则扫描当前配置类所在的包,
如果配置了包名,则扫描所配置的包及其子孙包
@ComponentSpring添加在类上,标记当前类是组件类,可以通过参数配置Spring Bean名称
@ControllerSprign添加在类上,标记当前类是控制器组件类,用法同@Component
@Service Spring添加在类上,标记当前类是业务逻辑组件类,用法同@Component
@Repository Spring添加在类上,标记当前类是数据访问组件类,用法同@Component
@Configuration Spring添加在类上,仅添加此注解的类才被视为配置类,通常不配置注解参数
@BeanSpring添加在方法上,标记此方法将返回某个类型的对象,
且Spring会自动调用此方法,并将对象保存在Spring容器中
@AutowiredSpring添加在属性上,使得Spring自动装配此属性的值
添加在构造方法上,使得Spring自动调用此构造方法
添加在Setter方法上,使得Spring自动调用此方法
@QualifierSpring添加在属性上,或添加在方法的参数上,
配合自动装配机制,用于指定需要装配的Spring Bean的名称
@ScopeSpring添加在组件类上,或添加在已经添加了@Bean注解的方法上,
用于指定作用域,注解参数为singleton(默认)时为“单例”
注解参数为prototype时为“非单例”
@LazySpring添加在组件类上,或添加在已经添加了@Bean注解的方法上,
用于指定作用域,当Spring Bean是单例时,
注解参数为true(默认)时为“懒加载”,注解参数为false时为“预加载”
@ValueSpring添加在属性上,或添加在被Spring调用的方法的参数上,用于读取Environment中的属性值,为对象的属性或方法的参数注入值
@ResourceSpring此注解是javax包中的注解,
添加在属性上,使得Spring自动装配此属性的值,
通常不推荐使用此注解
@ResponseBodySpring MVC添加在方法上,标记此方法是“响应正文”的,
添加在类上,标记此类中所有方法都是“响应正文”的
@RestControllerSpring MVC添加在类上,标记此类是一个“响应正文”的控制器类
@RequestMappingSpring MVC添加在类上,也可以添加在处理请求的方法上,
通常用于配置请求路径
@GetMappingSpring MVC添加在方法上,是将请求方式限制为GET的@RequestMapping
@PostMappingSpring MVC添加在方法上,是将请求方式限制为POST的@RequestMapping
@DeleteMappingSpring MVC添加在方法上,是将请求方式限制为DELETE的@RequestMapping
@PutMapping Spring MVC添加在方法上,是将请求方式限制为PUT的@RequestMapping
@RequestParamSpring MVC添加在请求参数上,可以:
1. 指定请求参数名称
2. 要求必须提交此参数
3. 指定请求参数的默认值
@PathVariableSpring MVC添加在请求参数上,用于标记此参数的值来自URL中的占位符,如果URL中的占位符名称与方法的参数名称不同,需要配置此注解参数来指定URL中的占位符名称
@RequestBodySpring MVC添加在请求参数上,用于标记此参数必须是对象格式的参数,如果未添加此注解,参数必须是FormData格式的
@ExceptionHandlerSpring MVC添加在方法上,标记此方法是处理异常的方法,可以通过配置注解参数来指定需要处理的异常类型,如果没有配置注解参数,所处理的异常类型取决于方法的参数列表中的异常类型
@ControllerAdviceSpring MVC添加在类上,标记此类中特定的方法将作用于每次处理请求的过程中
@RestControllerAdviceSpring MVC添加在类上,是@ControllerAdvice@ResponseBody的组合注解
@MapperScanMybatis添加在配置类上,用于指定Mapper接口的根包,Mybatis将根据此根包执行扫描,以找到各Mapper接口
@MapperMybatis添加在Mapper接口上,用于标记此接口是Mybatis的Mapper接口,如果已经通过@MapperScan配置能够找到此接口,则不需要使用此注解
@ParamMybatis添加在Mapper接口中的抽象方法的参数上,用于指定参数名称,当使用此注解指定参数名称后,SQL中的#{} / ${}占位符中的名称必须是此注解指定的名称,通常,当抽象方法的参数超过1个时,强烈建议在每个参数上使用此注解配置名称
@SelectMybatis添加在Mapper接口的抽象方法上,可以通过此注解直接配置此抽象方法对应的SQL语句(不必将SQL语句配置在XML文件中),用于配置SELECT类的SQL语句,但是,非常不推荐这种做法
@InsertMybatis同上,用于配置INSERT类的SQL语句
@UpdateMybatis同上,用于配置UPDATE类的SQL语句
@DeleteMybatis同上,用于配置DELETE类的SQL语句
@Transactional Spring JDBC推荐添加的业务接口上,用于标记此接口中所有方法都是事务性的,或业务接口中的抽象方法上,用于此方法是事务性的
@SpringBootApplicationSpring Boot添加在类上,用于标记此类是Spring Boot的启动类,每个Spring Boot项目应该只有1个类添加了此注解
@SpringBootConfigurationSpring Boot通常不需要显式的使用,它是@SpringBootApplication的元注解之一
@SpringBootTestSpring Boot添加在类上,用于标记此类是加载Spring环境的测试类
@ValidSpring Validation添加在方法的参数上,标记此参数需要经过Validation框架的检查
@ValidatedSpring Validation添加在方法的参数上,标记此参数需要经过Validation框架的检查;添加在类上,并结合方法上的检查注解(例如@NotNull等)实现对未封装的参数的检查
@NotNull Spring Validation添加在需要被检查的参数上,或添加在需要被检查的封装类型的属性上,用于配置“不允许为null”的检查规则
@NotEmptySpring Validation使用位置同@NotNull,用于配置“不允许为空字符串”的检查规则
@NotBlank SpringValidation使用位置同@NotNull,用于配置“不允许为空白”的检查规则
@PatternSpring Validation使用位置同@NotNull,用于配置正则表达式的检查规则
@RangeSpring Validation使用位置同@NotNull,用于配置“数值必须在某个取值区间”的检查规则
@Api Knife4j添加在控制器类上,通过此注解的tags属性配置API文档中的模块名称
@ApiOperation Knife4j添加在控制器类中处理请求的方法上,用于配置业务名称
@ApiOperationSupportKnife4j添加在控制器类中处理请求的方法上,通过此注解的order属性配置业务显示在API文档中时的排序序号
@ApiModelProperty Knife4j添加在封装的请求参数类型中的属性上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等
@ApiImplicitParam Knife4j添加在控制器类中处理请求的方法上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等
@ApiImplicitParamsKnife4j添加在控制器类中处理请求的方法上,如果需要通过@ApiImplicitParam注解配置的参数超过1个,则必须将多个@ApiImplicitParam注解作为此注解的参数
@ApiIgnoreKnife4j添加在请求参数上,用于标记API文档中将不关心此参数
@EnableGlobalMethodSecuritySpring Security添加在配置类上,用于开启全局的方法级别的权限控制
@PreAuthorizeSpring Security添加在方法上,用于配置权限
@AuthenticationPrincipalSpring Security添加在方法的参数上,且此参数应该是Security上下文中的认证信息中的当事人类型,用于为此参数注入值
@DataLombok添加在类上,将在编译期生成此类中所有属性的SetterGetter方法,及hashCode()equals()toString()方法
@Setter Lombok添加在类上,将在编译期生成此类中所有属性的Setter方法,也可以添加在类的属性上,将在编译期生成此属性的Setter方法
@Getter Lombok添加在类上,将在编译期生成此类中所有属性的Getter方法,也可以添加在类的属性上,将在编译期生成此属性的Getter方法
@EqualsAndHashcodeLombok添加在类上,将在编译期生成基于此类中所有属性的hashCode()equals()方法
@ToStringLombok添加在类上,将在编译期生成基于此类中所有属性的toString()方法
@NoArgConstructorLombok添加在类上,将在编译期生成此类的无参数构造方法
@AllArgsConstructorLombok添加在类上,将在编译期生成基于此类中所有属性的全参构造方法
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
galaxy 起源于07年的一个数据库导库项目,做一个增删改查的功能,只要几行代码就可以了,只要你会简单的sql语句,就能快速完成一个 功能,相比struts2和spring,着实方便多了. 如果觉得好用,就放弃ssh吧,加入到galaxy的阵营。 1. 完成一个用户管理功能? user.jsp ,这个页面用于新增,修改一个用户 <html> <head></head> <body> <% MyHashMap req = RequestUtil.getRequest(request); MyHashMap obj = new Query("select * from user where id ="+req.getInt("id")); %> <form action="regesiterAction.jsp" method="post"> 用户名<input name="username" value="<%=obj.getString("username")%>" /> 密码<input type="password" value="<%=obj.getString("password")%>" name="password" /> 手机号: <input name="telphone" value="<%=obj.getString("username")%>" /> <input type="hidden" name="action" value="saveorupdate" /> <input type="submit" value="提交" /> </form> </body> </html> userAction.jsp <% MyHashMap req = RequestUtil.getRequest(request); if(req.getString("action").equals("saveorupdate")){ new Imp().saveOrUpdate(req); }else if(req.getString("action").equals("del")){ new Query().update("delete from user where id="+req.getString("id")); } response.sendRededict("user.jsp"); %> 用户列表页面 <html> <body> <form> <table> <tr><td>用户名</td><td>密码</td><td>手机号</td> <% MyHashMap req = RequestUtil.getReq(request); int pagesize = req.getInt("pagesize",10); int pageindex = req.getInt("pageindex",1); List<MyHashMap> list = new Query().getByPaging("select * from user where "+condition,pagesize,pageindex); MyHashMap pageinfo = list.get(0); for(MyHashMap map:list){ %> <tr> <td><%=map.getString("username")%></td> <td><%=map.getString("password")%></td> <td><%=map.getString("telphone")%></td> </tr> <%}%> </table> <%=com.zxhy.fxpt.common.util.StringUtil.getdaohang(pageinfo.getInt("pagecount"),pageinfo.getInt("pagenum"))%> </form> </body> </html> 有兴趣的话,跟我联系qq: 376860997

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值