Spring-webmvc

controller方法

2019-07-09  本文已影响0人  xzz4632

1. controller方法请求参数

1.1 请求参数

参数 说明
javax.servlet.ServletRequest, javax.servlet.ServletResponse 任何特定的请求或响应类型, 如HttpServletRequest,或MultipartHttpServletRequest
javax.servlet.http.HttpSession 会话, 这个参数永远不会为null, 它是线程不安全的.如果要允许多个请求并发访问同一个会话, 则要设置RequestMappingHandlerAdapter实例的synchronizeOnSession属性为true.
javax.servlet.http.PushBuilder
java.security.Principal 当前经过身份验证的用户
HttpMethod 请求的HTTP方式
java.util.Locale 当前请求所在的区域
java.util.TimeZone + java.time.ZoneId 与当前请求关联的时区
@PathVariable 访问路径URI变量
@MatrixVariable 访问路径中的name-value对.
@RequestParam 访问servlet请求参数, 包括文件.
@RequestHeader 访问请求头的参数.
@CookieValue 访问cookie中的参数
@RequestBody 访问请求body.
HttpEntity<B> 访问header和body参数
java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap 用于访问HTML控制器中使用的模型,并作为视图呈现的一部分公开给模板。
RedirectAttributes 重定向时为重定向请求添加请求参数,以及临时存储的flash属性。
Errors, BindingResult 字段验证信息
SessionStatus + 类级的@SessionAttributes 用于标记表单处理完成,这将触发通过类级别@SessionAttributes注释声明的会话属性的清理
UriComponentsBuilder
@SessionAttribute 访问session属性
@RequestAttribute 用于访问请求属性
任何其他参数 如果是简单类型,将会被@RequestParam解析, 否则将会被@ModelAttribute解析.

1.2 请求参数部分详解

1.2.1 @MatrixVariable
1.2.1.1 定义

MatrixVariable(矩阵变量)是指出现在请求URI中的name=value对, 多个用分号分隔, 多个value值用逗号分隔或者定义多个name=value对(name相同). 示例如下:

/cars;color=red,green;year=2012
/cars;color=red;color=green;year=2012
1.2.1.2 启用MatrixVariable:
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper helper = new UrlPathHelper();
        helper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(helper);
    }
    
}
<mvc:annotation-driven enable-matrix-variables="true"/>
1.2.1.3 使用

MatrixVariable必须与路径变量(PathVariable)一起使用.

示例1:

// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
    // petId == 42
    // q == 11
}

示例2: 有多个路径变量

// GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(@MatrixVariable(name="q", pathVar="ownerId") int q1,
        @MatrixVariable(name="q", pathVar="petId") int q2) {
    // q1 == 11
    // q2 == 22
}

示例3:使用MultiValueMap获取所有的矩阵变量

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(@MatrixVariable MultiValueMap<String, String> matrixVars,
        @MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {
    // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
    // petMatrixVars: ["q" : 22, "s" : 23]
}

2. controller方法返回值

2.1 返回值类型

返回值类型 说明
@ResponseBody 返回JSON格式
HttpEntity<B>, ResponseEntity<B> 完整响应(包含header和body)
HttpHeaders 返回响应header
String 视图名称
View 视图实例
ModelAndView 视图对象
void
DeferredResult<V> 异步请求
Callbale<V> 异步请求
ListenableFuture<V>, java.util.concurrent.CompletionStage<V>, java.util.concurrent.CompletableFuture<V>
ResponseBodyEmitter, SseEmitter
StreamingResponseBody
Reactive类型
@JsonView Jackson库注解, spring对其提供了内置支持, 提供序列化的视图, 呈现返回对象中所有字段的子集, 与@ResponseBody或ResponseEntity一起使用

2.2 使用

2.2.1 @JsonView

它需要Jackson库的支持.

2.2.1.1 定义子集

在返回的对象中定义子集.

public class User {

    public interface WithoutPasswordView {};
    public interface WithPasswordView extends WithoutPasswordView {};

    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @JsonView(WithoutPasswordView.class)
    public String getUsername() {
        return this.username;
    }

    @JsonView(WithPasswordView.class)
    public String getPassword() {
        return this.password;
    }
}
2.1.1.2 在controller方法上指定子集
    @GetMapping("/user")
    @JsonView(User.WithoutPasswordView.class)
    public User getUser() {
        return new User("eric", "7!jd#h23");
    }
上一篇下一篇

猜你喜欢

热点阅读