专业编程基础技术教程

网站首页 > 基础教程 正文

MVC框架笔记 mvc框架教程

ccvgpt 2024-10-16 08:24:02 基础教程 5 ℃

参考

《Spring_Boot_2精髓_从构建小系统到架构分布式大系统》

1.RequestMapping 属性

  • value:请求的URL的路径,支持URL模板、正则表达式
  • method:HTTP请求方法,有GET、POST、PUT等
  • consumes:允许的媒体类型(Media Types),如consumes="application/json",对应于请求的HTTP的Content-Type
  • produces:相应的媒体类型,如 produces=“application/json” ,对应于HTTP的Accept字段
  • params:请求的参数,如params=“action=update”
  • headers:请求的HTTP头的值,如 header="myHeader=myValue"

1.1.value说明

value属性用于匹配一个URL映射,value支持简单的表达式匹配:

MVC框架笔记 mvc框架教程

@RequestMapping(value="/get/{id}.json")

也可以使用类似Ant的通配符来对URL进行映射,比如:

@RequestMapping(path="/user/all/*.json")

Ant路径表达式

Ant用符号 "*" 来表示匹配任意字符,用 "**" 表示统配任意路径,用 "?" 来匹配单个字符。

如果一个请求有多个@RequestMapping能够匹配,通常是更具体的匹配会作为处理此请求的方法。

  • 有通配符的低于没有通配符的,比如/user/add.json 比 /user/*.json 优先匹配
  • 有 ** 通配符的低于有 * 通配符的

URL映射也可以使用${}来获得系统的配置或者环境变量,通常用于Controller路径是通过配置文件设定的情况:

@RequestMapping("/${query.all}.json")

1.2.consumes和 produces

属性consumes意味着请求的HTTP头的Content-Type媒体类型与consumes的值匹配才能调用此方法。

@GetMapping(value="/consumes/test.json", consumes="application/json")

produces属性对应于HTTP请求的Accept字段,只有匹配得上的方法才能被调用。

@GetMapping(path="/user/{userid}", produces=MediaType.APPLICATION_JSON_UTF8_VALUE )

通常浏览器都会将Accept设置为*.* ,因此通过浏览器直接访问"/user/l",浏览器总是返回id为1的用户信息,井转成JSON格式。

1.3.params和header匹配

可以从请求参数或者HTTP头中提取值来进一步确定调用的方法,有以下三种形式:

  • 如果存在参数,则通过
  • 如果不存在参数,则通过
  • 如果参数等于某一具体值,则通过
@PostMapping(path="update.json",params= "action=save")
@PostMapping(path="update.json",params= "action=update")

header和params一样:

@PostMapping(path="update.json",headers= "action=update")

2.方法参数

Spring的Controller方法可以接受多种类型参数,比如我们看到的path变量,还有MVC的Model。除此之外,方法还能接受以下参数。

  • @PathVariable,可以将URL中的值映射到方法参数中。
  • Model,Spring中通用的MVC模型,也可以使用Map和ModelMap作为渲染视图的模型。为视图提供数据。
  • ModelAndView,包含了模型(数据)和视图路径的对象。
  • JavaBean,将HTTP参数映射到JavaBean对象。
  • MultipartFile,用于处理文件上传。
  • @ModeIAttribute,使用该注解的变量(方法返回变量)将作为Model的一个属性。通常用在某个方法上,该方法将在请求方法执行之前被执行,可以用于特定数据初始化。
  • WebRequest或者NativeWebRequest,类似ServletRequest,但做了一定封装。
  • java.io.InputStream和java.io.Reader,用来获取ServletAPI中的lnputStream/Reader。
  • java.io.OutputStreamIjava.io.Writer,用来获取ServletAPI中的OutputStream/Writer。
  • HttpMethod,枚举类型,对应于HTTPMethod,如POST、GET.@MatrixVariable,矩阵变量。
  • @RequestParam,对应于HTTP请求的参数,自动转化为参数对应的类型。
  • @RequestHeader,对应于HTTP请求头参数,自动转化为对应的类型。
  • @RequestBody,自动将请求内容转为指定的对象,默认使用HtψMessageConverters来转化。
  • @RequestPart,用于文件上传,对应于HTTP协议的multipart/form-data。
  • @SessionAttribute,该方法标注的变量来自于Session的属性。
  • @RequestAttribute,该标注的变量来自于request的属性。
  • @InitBinder,用在方法上,说明这个方法会注册多个转化器,用来个性化地将HTTP请求参数转化成对应的Java对象,如转化为日期类型、浮点类型、JavaBean等,当然,也可以实现WebBindinglnitializer接口来用于SpringBoot应用所需要的dataBinder。
  • BindingResult和Errors,用来处理绑定过程中的错误。

这里部分含义比较明确,限于篇幅不做详细讲解,下面会对常用的PathVariable、Model、ModelAndView、JavaBean、文件上传、ModelAttribute进行讲解。

3.WebMvcConfigurer

WebMvcConfigurer使用来全局定制化Spring Boot的MVC特性。开发者通过实现WebMvcConfigurer 接口来配置应用的MVC全局特性。

@Configuration
public class MvcConfigurer implements WebMvcConfigurer{
 // 拦截器
 public void addInterceptors(InterceptorRegister registry){}
 //跨域访问配置
 public void addCorsMappings(CorsRegistry registry){}
 //格式化
 public void addFormatters(FormatterRegistry registry){}
 // URI到视图的映射
 public void addViewControllers(ViewControllerRegistry registry){}
 //其他更多全局定制接口
}

3.1.拦截器

需要实现HandlerInterceptor接口,之后将该类注册到容器中(通过上面的方式):

public void addInterceptors(InterceptorRegistry registry){
 // 增加一个拦截器,检查会话,URL以admin开头的都是用此拦截器
 registry.addInterceptor(new SessionHandlerInterceptor()).addPathPatterns("/admin/**");
}

3.2.跨域访问

允许所有跨域访问:

public void addCorsMappings(CorsRegistry registry){
 registry.addMapping("/**");
}

仅仅允许来自domain2.com的跨域访问,并且限定访问路径为/api、方法是POST或GET。

public void addCorsMappings(CorsRegistry registry){
 registry.addMapping("/api/**")
 .allowedOrigins("http://domain2.com")
 .allowedMethods("POST", "GET");
}

跨域原理简单理解就是发起跨域请求的时候,浏览器会对请求域返回的响应信息检查HTTP头,如果Access-Control-Allow-Origin 包含了自身域,则表示允许访问。否则报错,这就是allowedOrigins的作用。

3.3.格式化

HTTP请求映射到Controller方法的参数上后,Spring会自动进行类型转化。对于日期类型的参数,Spring默认并没有配置如何将字符串转为日期类型。为了支持可按照指定格式转为日期类型,需要添加一个DateFormatter类:

public void addFormatters(FormatterRegistry registry){
 registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
}0

DateFormatter类实现将字符串转为日期类型java.util.Date。

4.视图技术

4.1.Redirect和Forward

常而言,Controller会返回一个图名称,比如以btl结尾的视图会交给Beet!模板引擎渲染。有些情况下,Controller会返回客户端一个HTTPRedirect重定向请求,希望客户端按照指定地址重新发起一次请求,比如客户登录成功后,重定向到后台系统首页。再比如客户端通过POST提交了一个名单,可以返回一个重定向请求到此订单明细的请求地址。这样做的好处是,如果用户再次刷新页面,则访问的是订单详情地址,而不会再次提交订单。

Controller中重定向可以返回以 "redirect:" 为前缀的URI:

return "redirect:/order/detail.html?orderId=" + orderId;

在ModelAndView中设置带有"redirect:"前缀的URI:

new ModelAndView("redirect:/order/detail.html?orderId=" + orderId);

或直接使用RedirectView类:

RedirectView view = new RedirectView("/order/detail.html?orderId="+orderId)

Spring MVC也支持forward前缀,用来在Controller执行完毕后,在执行另一个Controller方法。

@RequestMapping("/bbs")
public String index(){
 return "forward:/bbs/module/1-1.html";
}
?
@RequestMapping("/bbs/module/{type}-{page}")
public ModelAndView module(@PathVariable int type,@PathVariable int page){
 
}

5.通用错误处理

在Spring Boot中,Controller中抛出的异常默认交给了/error处理,应用程序可以将/error映射到一个特定的Controller中处理来代替Spring Boot的默认实现,应用可以继承AbstractErrorControoler来同义处理系统的各种异常。

Tags:

最近发表
标签列表