当前位置: 首页 > news >正文

SpringMVC之注解驱动的控制器

Spring MVC 架构图

在这里插入图片描述

一:@RequestMapping 映射请求

如何将请求映射到对应的控制器方法中是 Spring MVC 框架的重要任务之一,这项任务由@ RequestMapping 承担。
在控制器的类定义及方法定义处都可以标注@ RequestMapping ,类定义处的@ RequestMapping 提供初步的请求映射信息,方法定义处的@ RequestMapping 提供进一步的细分映射信息。 DispatcherServlet 截获请求后,就通过控制器上@ RequestMapping 提供的映射信息确定请求所对应的处理方法。

1.通过请求URL 进行映射

@RestController
@RequestMapping("/login")
public class LoginController {
	
	@RequestMapping("/index")
	public ModelAndView index(){
		ModelAndView view = new ModelAndView();
		view.setViewName("/login");
		view.addObject("helloStr", "test hello world");
		return view;
	}

//访问路径 IP:端口/项目服务名/login/index 既可访问

@RequestMapping 不仅支持标准的URL 还支持Ant风格的和带{xxx} 占位符的URL

/user/*/createUser : 匹配 /user/aa/createUser、/user/bb/createUser 等
/user/**/createUser :  匹配 /user/createUser、/user/aa/bb/createUser 等
/user/createUser?? :  匹配 /user/createUseraa、/user/createUserbb   等
/user/{userId} :  匹配 /user/123/user/456/user/**/{userId} :  匹配 /user/aa/123/user/aa/bb/123

实战中没怎么用到,都是具体的明确的URL

@PathVariable(“xxx”) 可以将URL 中的占位符绑定到操作方法中


@RequestMapping("/login/{roleID}")
public class LoginController {

@RequestMapping("/{uerID}")
	public ModelAndView test(@PathVariable("roleID") String roleID,@PathVariable("userID") String userID){
		ModelAndView view = new ModelAndView();
		view.setViewName("/hello");
		view.addObject("roleID is", roleID);
		view.addObject("userID is", userID);
		return view;
	}
}

2.通过请求参数,请求方法或请求头进行映射

在这里插入图片描述
这是截取的chrome 访问的一段请求报文,上面报文头的参数都是可以获取的,用来当作访问条件

//使用请求方法和请求参数映射请求
@RequestMapping(value="/test1",method=RequestMethod.GET,params="userID")
public String test1(@RequestParam("userID") String userID){
		
		return "SUCCESS";
}
//使用报文头映射请求
@RequestMapping(value="/test1",headers="context-type/*")
public String test1(@RequestParam("userID") String userID){
		
		return "SUCCESS";
}
	

@RequestMapping 的
value、method、params、headers 分别是请求URL,请求方法,请求参数,报文头的映射条件,联合使用可使请求映射更精确

其中params 表达式和headers 含义一样

  • ”param1“ :请求须包含名为param1的请求参数
  • ”!param1“ :请求不能包含名为param1的请求参数
  • ”param1 != value1“ :请求须包含名为param1的请求参数,但其值不能为value1
  • {”param1=value1“,”param2“} : 请求须包含名为param1 和 param2的请求参数,且param1的参数值必须为value1

二:请求处理方法签名

下面是4种典型的处理方法

    //1 请求参数按名称匹配的方式绑定到方法入参中,方法返回字符串代表逻辑视图名
	@RequestMapping("/handle1")
	public String handle1(@RequestParam("userName") String userName) {
		return "success";
	}
	
	
	//2.将Cookie值及报文头属性绑定到入参中,方法返回ModelAndView
	@RequestMapping(value="/handle2")
	public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId ,
			@RequestHeader("Accept-Language") String acceptLanguage){
		ModelAndView view = new ModelAndView();
		System.out.println("mv hello -----------------");
		view.setViewName("/hello");
		view.addObject("helloStr", "test hello world");
		return view;
	}
	
	//3.请求参数按名称匹配的方式绑定到userInfo 的属性中,方法返回字符串代表逻辑视图名
	@RequestMapping("/handle3")
	public String handle3(UserInfo userInfo) {
		return "success";
	}
	
	//4.直接将Http请求对象传递给处理方法,方法返回字符串代表逻辑视图名
	@RequestMapping("/handle4")
	public String handle4(HttpServletRequest request) {
		return "success";
	}

请求方法签名的详解:

1.@RequestParam 有以下参数:

  1. value 参数名
  2. required 是否必需,默认true 表示请求参数中必须包含对应的参数名,否则抛出异常
  3. defaultValue 默认参数名,在设置该参数时,自动将required 设为false。不推荐使用

2.@CookieValue
和@RequestParam 有一样的参数,其中value 属性 表示 Cookie 的名称

3.@RequestHeader
也和@RequestParam 有一样的参数:通过value 可获取若干请求报文头的属性,报文头直接浏览器F12 就可以查看

4.以实体类为入参参数
如上文的UserInfo ,参数名只需和实体类的属性名一直即可
也可以多种组合
例如:

/handle5?userInfo.userName&roleInfo.roleId

5.使用ServletAPI 对象作为入参

	//5.同时使用HttpServletRequest和 HttpServletResponse 入参
	@RequestMapping("/handle5")
	public void handle5(HttpServletRequest request,HttpServletResponse response) {
		String username = WebUtils.findParameterValue(request, "userName");
		response.addCookie(new Cookie("userName", username));
	}
	
	//6.使用HttpSession 入参
	@RequestMapping("/handle6")
	public String handle6(HttpSession httpSession) {
		httpSession.setAttribute("sessionId", "123");
		return "success";
	}

(1).在使用ServletAPI 的类入参时,SpringMVC 会自动将Web 层对应的Servlet 对象传递给处理方法的入参。参数位置顺序也没有要求。
(2).注意使用HttpServletResponse 返回响应,则处理方法的返回值设置成void即可
(3).springmvc 在其他定义的ServletAPI的接口如 WebRequest 和NativeWebRequest 这些也可以作为入参,通过这些代理类可访问请求对象的任何信息

6.使用 I/O 对象作为入参

	//7.IO 作为入参
	@RequestMapping("/handle7")
	public void handle7(OutputStream outputStream) throws IOException {
		Resource res = new ClassPathResource("/image.jpg");//读取类路径下的图片文件
		FileCopyUtils.copy(res.getInputStream(), outputStream);//将图片写入输出流
	}

Servlet 的 ServletRequest 拥有 getInputStream() 和 getReader() 方法,可以通过它们读取请求的信息。相应的,Servlet 的 ServletResponse 拥有getOutputStream() 和 getWriter()方法,可以通过它们输出响应信息。

java.io.InputStream / java.io.Reader 和java.io.tOutputStream / java.io.Writer 可作为方法的入参,这些参数继续向下传递给控制器的处理方法

未完待续…

学习笔记 摘自 精通Spring 4.x 企业应用开发实战

相关文章:

  • Flask--路由配置
  • Linux定时器
  • iNFTnews | 一词解答区块链技术普及的制胜关键
  • 京准,PTP时间同步服务器在运营商通信网应用
  • 判断数组类型的方法(Array.isArray)以及Math数字对象
  • zemax---Tangential plane, meridian plane and sagittal plane(切线面,子午面与弧矢面)(完结)
  • Java配置42-配置redis高可用(sentinel监控)
  • 共话龙蜥:中国操作系统到底有没有角力世界舞台的实力?
  • vue独立提供模板下载功能
  • 怎么判断MES系统好不好?MES又是如何帮企业省钱的?
  • 数据治理:为什么不见BI作关联分析
  • 聚氨基酯偶联牛血清白蛋白/人血清白蛋白/卵清白蛋白纳米粒PAE-BSA/HSA/OVA(合成路线)
  • 应用开发类API推荐
  • sonar是一款静态代码质量分析工具
  • EN 14782建筑金属结构产品—CE认证
  • JavaScript-如何实现克隆(clone)函数
  • [译] 怎样写一个基础的编译器
  • 【Linux系统编程】快速查找errno错误码信息
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • C# 免费离线人脸识别 2.0 Demo
  • Create React App 使用
  • jquery ajax学习笔记
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • win10下安装mysql5.7
  • 包装类对象
  • 闭包,sync使用细节
  • 程序员该如何有效的找工作?
  • 从PHP迁移至Golang - 基础篇
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 官方解决所有 npm 全局安装权限问题
  • 怎么将电脑中的声音录制成WAV格式
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ###C语言程序设计-----C语言学习(3)#
  • #Spring-boot高级
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (06)金属布线——为半导体注入生命的连接
  • (2015)JS ES6 必知的十个 特性
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4)(4.6) Triducer
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (南京观海微电子)——I3C协议介绍
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • ****Linux下Mysql的安装和配置
  • . NET自动找可写目录
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 4.0并行库实用性演练
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net 路由处理厉害了
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net2005怎么读string形的xml,不是xml文件。
  • .netcore 获取appsettings