Spring MVC学习笔记(五)

第五章 Spring MVC起步
1,Spring将请求在调度Servelet,处理器映射(handler mapping),控制器以及视图解析器(view resolver)之间移动。
在Spring MVC中,DispatcherServlet就是前端控制器。DispatcherServlet的任务是将请求发送给Spring MVC控制器(controller).
2,搭建Spring MVC
配置DispatcherServlet:
1)配置在web.xml文件中,这个文件会放到应用的WAR包里面。
2)在config包中,定义继承AbstractAnnotationConfigDispatcherServletInitializer的类,配置在Servlet容器中。
扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动配置DispatcherSevlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。
三个方法:getServeletMappings():将一个或多个路径映射到DispatcherServlet上。
getServeletConfigClasses():返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文的bean,加载包含Web组件的bean(控制器,视图解析器,处理器映射)
getRootConfigClasses():返回的带有@Configuration注解的类将会用来定义ContextLoaderListener创建的应用上下文中的bean ,加载其他bean(驱动应用后端的中间层和数据层组件)
3,启用MVC

@EnableWebMvc
4,控制器
方法上添加了@RequestMapping注解(value属性:指定方法所要处理的请求路径,method属性:细化所处理的HTTP方法)的类,这个注解声明了它们要处理的请求。
@Controller:基于@Component注解,辅助实现组件扫描
5,接受请求的输入
Spring MVC运行以多种方式将客户端中的数据传送到控制器的处理器方法中:
查询参数(Query Parameter)
@RequestMapping(method=RequestMethod.GET)
public List spittles(
@RequestParam(value="max",defaultValue=MAX_LONG_AS_STRING)long max,
@RequestParam(value="count",defaultValue=20)int count){
    return spittleRespository.findSpittles(max,count);
}
private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);
表单参数(Form Parameter)
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(
@Valid Spitter spitter, Errors errors){  @Valid注解告知Spring确保该参数满足校验限制,Errors参数要紧跟在带有@Valid注解的参数后面,@Valid标注的就是要检验的参数
    if(errors.hasErrors()) {    //检验校验是否有错误
    return "registerForm";
    spittleRespository.save(spitter);
    return "redirect:/spitter/" + spitter.getUsername();//模型的key将会是spittle,这是根据传递到addAttribute()方法中的类型推断得到的。
}
Spring对Java校验API的支持:javax.validation.constraints包,  @AssertFalse  @Pattern  @Size  @NotNull
路径变量(Path Variable)
@RequestMapping(value="/{spittleID}", method=RequestMethod.GET)
public String spittle(
@PathVariable("spittleID")long spittleID, Model model){  也可以写做public String spittle(@PathVariable long spittleID, Model model){如果@PathVariable没有value属性的话,会假设占位符的名称与方法的参数名相同)
    model.addAttribute(spittleRespository.findOne(spittleID);
    return "spittle";//模型的key将会是spittle,这是根据传递到addAttribute()方法中的类型推断得到的。
}
对/spittles/12345(通过路径变量)发起GET请求要优于对"/spittles/show?spittle_id=12345(通过查询参数)发起请求。前者能够识别出要查询的资源,而后者描述的是带有参数的一个操作--本质上是通过HTTP发起的RPC。

20190506:
第16章 使用Spring MVC创建REST API
1,以信息为中心的表述性状态转移(Representaitonal State Transfer,REST,关注要处理的数据)已经成为替换传统SOAP(关注行为和处理) web服务的流行方案。
REST就是将资源的状态以最适合客户端或服务端的形式从服务器端转移到客户端(或者反过来)。
REST中会有行为,它们是通过HTTP方法来定义的。具体来讲,也就是GET,POST,PUT,DELETE,PATCH以及其他的HTTP方法构成了REST中的动作。
2,Spring支持以下方式来创建REST资源:
控制器可以处理所有的HTTP方法。
表述是REST中很重要的一个方面。它是关于客户端和服务器端针对某一资源是如何通信的。
控制器本身通常并不关心资源如何表述。控制器以Java对象的方式来处理资源。控制器完成了它的工作之后,资源才会被转化成最适合客户端的形式。
Spring提供了两张方法将资源的Java表述形式转换为最适合客户端的表述形式:
内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式。特殊的视图解析器:ContentNegotiatingViewResolver
消息转换器(Message conversation):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。
3,ContentNegotiatingViewResolver配置
@Bean
public ViewResolver cnViewResolver() {
    return new ContentNegotiatingViewResolver();
}
首先查看URL的文件扩展名,然后再考虑请求中的Accept头部信息,然后会使用“/"作为默认的内容类型,这就意味着客户端必须要接收服务器发送的任何形式的表述。
与Spring的其他视图解析器不同,ContentNegotiatingViewResolver本身不会解析视图,而是委托给其他的视图解析器,让他们来解析视图。
通过设置ContentNegotiationManager可以改变所请求媒体类型的默认策略。
    class="org.springframework.http.ContentNegotiationManagerFactoryBean"
    p:defaultContentType="application/json">
@Override
public void configureContentNegotiation(
    ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
将ContentNegotiationManager Bean注入到ContentNegotiatingViewResolver的将contentNegotiationManager属性中:
@Bean
public ViewResolver cnViewResolver(ContentNegotiationManager cnm) {
    ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver();
    cnvr.setContentNegotiationManager(cnm);
}
4,使用HTTP信息转换器
使用消息转换器的话,需要告诉Spring跳过正常的模型/视图流程,并使用消息转换器,最简单的方法是为控制器方法添加@Response注解。
@Response注解会告知Spring,我们要将返回的对象作为资源发送给客户端,并将其转换为客户端可接受的表述形式。更具体地讲,DispatcherServet将会考虑到请求中Accept头部信息,并查找能够为客户端提供所需表述形式的消息转换器。
@RequestMapping(method=RequestMethod.GET,produces="application/json") //produces属性表明这个方法只处理预期输出为JSON的请求,即只会处理Accept头部信息包含"application/json"的请求。
public @ResponseBody List spittles(
    @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING)long max,
    @RequestParam(value="count",defaultValue=20)int count){
    return spittleRespository.findSpittles(max,count);
}
在请求提中接收资源状态
@RequestMapping(method=RequestMethod.POST,consumes="application/json")
public @ResponseBody Spittle saveSpittle(@RequestBody Spittle spittle)
    return spittleRespository.save(spittle);
}

你可能感兴趣的:(学习记录,Spring)