SpringMVC的注解总成

文章目录

  • 一、@RequestMapping注解、参数
    • 1、@RequestMapping的作用
    • 2、@RequestMapping参数:
    • 3、使用method属性表示请求方式;
    • 4、@RequestMapping了解Params和headers参数
    • 5、@RequestMapping支持Ant风格的URL请求地址
  • 二、@PathVariable注解、Rest风格
    • 1、@PathVariable注解绑定URL参数
    • 2、Rest风格的URL、基本CRUD
  • 三、获取请求参数的方式
    • 1、@RequestParam:获取请求中的参数
    • 2、Entity对象入参:支持级联属性
    • 3、@RequestHeader:获取请求头信息
    • 4、@CookieValue:获取请求的Cookie值
  • 四、使用原生的Servlet-API入参、返回
  • 五、将值存入request、session中
    • 1、ModelAndView对象:设置数据,逻辑视图。
    • 2、Map、Model、ModelMap作为入参;[@SessionAttribute]()注解
  • 四、特殊注解@[ModelAtrribute]()
    • @ModelAtrribute注解作用:

一、@RequestMapping注解、参数

1、@RequestMapping的作用

  1. 使用@RequestMapping注解为控制器指定映射的URL,简单来说就是映射用户可以访问的网址。
  2. DispatcherServlet截获请求后,根据@RequestMapping注解,来调用控制器的对应的方法。
@Controller
@RequestMapping("/view/")
public class IndexController {
	private static final String success = "success";
	
	/**
	 * 1、@RequestMapping除了修饰方法还可以修饰类
	 * 2、分别表示根路径和根路径下的子路径。
	 * 3、类上面没有RequestMapping的时候,方法上面的路径表示根路径。
	 * @return
	 */
	@RequestMapping("index.html")
	public String index() {
		System.out.println("12314");
		return success;
	}
}

2、@RequestMapping参数:

Param Desc
value 定义处理方法的请求的 URL 地址。
method 定义处理方法的 http method 类型,如 GET、POST 等。
params 定义请求的 URL 中必须包含的参数。
headers 定义请求中 Request Headers 必须包含的参数。

3、使用method属性表示请求方式;

常用值:RequestMethod.POST - RequestMethod.GET;

同样的映射路径,通过不同的请求方式执行不同的控制方法。

当不进行指定的时候,不能有相同的映射路径,控制器通过请求方式自动指定。

@RequestMapping(value="/post.html",method=RequestMethod.POST)
public String testMethod_post() {
  System.out.println("post.html");
  return success;
}
@RequestMapping(value="/post.html",method=RequestMethod.GET)
public String testMethod_get() {
  System.out.println("get.html");
  return success;
}

4、@RequestMapping了解Params和headers参数

@RequestMapping(value="params.html",params= {"username","age!=0","!sex"})
public String test_Params_headers() {
  return success;
}

params表示请求参数还支持简单的表达式;headers设置请求头符合的一些规范;

  1. username必须包含username
  2. age!=0 请求参数不能有age = 0
  3. !sex 表示不能有sex属性

5、@RequestMapping支持Ant风格的URL请求地址

  • ? :匹配URL中的一个字符
  • * :匹配URL中的任意字符
  • ** :匹配URL的多层路径
@RequestMapping(value="ant/nihao*/ant.html")
// 比如:ant/nihao21423/ant.html
public String test_Ant() {
  return success;
}

二、@PathVariable注解、Rest风格

1、@PathVariable注解绑定URL参数

**作用:**实现URL的占位符绑定到目标方法参数中;{占位符}

**注意:**占位符的名字和注解的值必须一致;@PathVariable值可以省略,如果省略形参名必须和URL参数名一致

@RequestMapping(value="path.html/{id}")
public String test_PathVariable(@PathVariable("id") Integer userId) {
  System.out.println("===========>"+userId);
  return success;
}

2、Rest风格的URL、基本CRUD

新增:/order POST 直接跳转新增页面
修改:/order/1 PUT == update?id=1
获取:/order/1 GET == find?id=1
删除:/order/1 DELETE == delete?id=1

如何发送PUT请求和DELETE请求呢?

  1. 需要配置 HiddenHttpMethodFilter过滤器。
  2. 需要发送 POST请求。
  3. 需要在发送 POST请求时携带一个 name="_method" 的隐藏域,值为PUT | DELETE。

Tomcat8、JDK8需要注意

​ 可能出现问题:405:SPs only permit GET POST or HEAD
​ 1、需要在过滤器添加中央控制器的servlet-name
​ 2、在使用DELETE | PUT方法的类上添加@ResponseBody

	@RequestMapping(value="rest_test/{id}",method=RequestMethod.GET)
	public String Rest_get(@PathVariable Integer id) {
		System.out.println("Test Rest_Get "+id);
		return success;
	}
	
	@RequestMapping(value="rest_test",method=RequestMethod.POST)
	public String Rest_post() {
		System.out.println("Test Rest_Post ");
		return success;
	}
	
	@ResponseBody
	@RequestMapping(value="rest_test/{id}",method=RequestMethod.PUT)
	public String Rest_put(@PathVariable Integer id) {
		System.out.println("Test Rest_Put "+id);
		return success;
	}
	
	@ResponseBody
	@RequestMapping(value="rest_test/{id}",method=RequestMethod.DELETE)
	public String Rest_delete(@PathVariable Integer id) {
		System.out.println("Test Rest_DELETE "+id);
		return success;
	}

三、获取请求参数的方式

1、@RequestParam:获取请求中的参数

属性 说明
value 表示请求参数的参数名称
name value的别名,意义相同;
required 该参数是否为必须,默认为true
defaultValue 设置请求参数的默认值

使用方法:标注在方法的参数前面,请求的参数名必须和注解的value一致。

当然不使用此注解都可以传参,只要请求的数据名和参数名一致即可。

	@RequestMapping("requestParams.html")
	public String test_Param(@RequestParam(name="name",required=false)String username,
							  				@RequestParam(name="pass",required=true,defaultValue="123456")
                           Integer password) {
		System.out.println("username============>"+username);
		System.out.println("password============>"+password);
		return success;
	}

2、Entity对象入参:支持级联属性

	/**
	 * 使用实体对象入参,支持级联属性。
	 * 在页面只需要填写对象的属性,无需添加对象.属性的方式;
	 * 比如:uesrName | userPass | address.cityName | address.province
	 * 错误:user.userName | user.address.cityName
	 */
	@RequestMapping("param_Entity.html")
	public String test_Entity(User user) {
		System.out.println("test Entity============>"+user);
		return success;
	} 

3、@RequestHeader:获取请求头信息

	/**
	 * 了解即可:@RequestHeader - 获取请求中的请求头信息
	 * 同@RequestParam 的作用一致
	 */
	@RequestMapping("requestHeader.html")
	public String test_Header(@RequestHeader("Accept")String info0) {
		System.out.println("header============>"+info0);
		return success;
	}

4、@CookieValue:获取请求的Cookie值

	/**
	 * 了解即可:@CookieValue - 获取请求中的Cookie值
	 * 同@RequestParam 的作用一致
	 */
	@RequestMapping("requestCookie.html")
	public String test_Cookie(@CookieValue("JSESSIONID")String info0) {
		System.out.println("cookie============>"+info0);
		return success;
	}

四、使用原生的Servlet-API入参、返回

说明: SpringMVC可以使用原生的API作为入参 、获取请求参数,和响应结果;具体使用自己扩展即可,学会举一反三;示例就这么简单,警告自己,我们只要知道用法,而不是知道固定的死套路、思维。

具体支持类型有:

  • HttpServletRequest、HttpServletResponse、HttpSession
  • java.security.Principal、Locale
  • InputStream 、OutputStream
  • Reader、Writer
	@RequestMapping("test_servletAPI.html")
	public void test_ServletAPI(HttpServletRequest request, HttpServletResponse response, Writer writer)
			throws IOException {
		System.out.println("test_ServletAPI request -----" + request);
		System.out.println("test_ServletAPI response ------ " + response);
		writer.write("hello");
		writer.flush();
		writer.close();
	}

五、将值存入request、session中

1、ModelAndView对象:设置数据,逻辑视图。

**作用:**目标方法返回值可以返回ModelAndView对象;其中包含视图还有模型信息;

SpringMVC 会把 ModelAndView 中的数据放入到 request 域中

我们也可以不设置逻辑视图名,万变不离其宗,所有返回的逻辑视图名为String类型;

	@RequestMapping("test_ModelAndView.html")
	public ModelAndView test_ServletAPI() {
		// 设置视图和添加返回的数据。
		ModelAndView mv = new ModelAndView("success");
    // mv.setViewName("success");
		mv.addObject("time",new Date());
		System.out.println(mv);
		return mv;
	}
	// 在JSP中取值
 	requset time:${requestScope.time}

2、Map、Model、ModelMap作为入参;@SessionAttribute注解

1、将值存入 request 域中:

  • Model 和 ModelMap 还有 ModelAndView 都属于Map结构;
  • 我们可以在方法使用这些对象作为方法参数传入,相当于传入了一个 HttpServletRequest 对象,但是更为推荐的是使用Map、Model、ModelMap对象;并且ModelAndView不推荐作为入参传递,更推荐主动在方法内实例化。
  • SpringMVC 会在方法执行的时候自动为我们实例化对象。

2、相同点:

  1. 结构都为Map;
  2. 数据都储存在Request域中。(重点)

3、将值存入Session域中:

在类上添加@SessionAttribute(names= {“user”},types=String.class)注解

此注解不能添加到方法上,只能添加到类上。并且通过此注解:

  1. 在方法内添加到map、model、modelandView中的对象,同时也能存入session中。
  2. 通过names、types属性指定,names表示key,types表示存入的类型。
@Controller
@RequestMapping("/view/")
@SessionAttributes(names= {"user"},types=String.class)
public class A5_ModelAndView_Controller {
  
	@RequestMapping("test_Model.html")
	public String test_ServletAPI(Model md) {
		User user = new User(1,"linux","1234pasd","[email protected]",null);
		md.addAttribute("user", user);
		md.addAttribute("str","hello 可以通过types设置放入session域中的类型");
		return success;
	}
}

四、特殊注解@ModelAtrribute

@ModelAtrribute注解作用:

1、标注在方法上:被标注 @ModelAtrribute 的方法会在此 Controller 其他方法执行前,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

2、标注在参数前: 被标注在方法前用于取出存储在Model中的值,说白了就是存储在Request中的值,如果被标注在@SessionAttributes中则会取出Session中的值。

	/**
	 * 标记为@ModelAttribute的方法,会在每个目标方法执行之前执行。
	 * 这个注解也可以修饰 Entity 对象类型的入参,然后我们将值储存在Model中。
	 */
	@ModelAttribute("user") // == model.addAttribute("user",user);
	public User getUser(@RequestParam(name="userId",required=false) Integer id) {
		System.out.println("test ModelAttribute Id:"+id);
		User user = new User(1,"linux","a12345","[email protected]",null);
		System.out.println(user);
		return user;
	}
	
	/**
	 * 运行流程:
	 *  1. 执行@ModelAtrribute 注解修饰的方法:从数据库中取出对象,把对象放到了Map中,键为:user
	 *  2. SpringMVC 从Map中取出了User对象,并把表单的请求参数赋给User对象属性。
	 *  3. SpringMVC 把上述对象传入目标方法的参数。
	 *  
	 * 注意通过:实际都是存在request中,如果标注为@SessionAtrribute的方法那么存在session中
	 */
	@RequestMapping("test_modelAtrribute.html") // 方法前标注其实也可以省略。
	public String test_ModelAtrribute(@ModelAttribute("user") User user,ModelMap map) {
		System.out.println("修改 :"+user);
		return success;
	}

你可能感兴趣的:(Java日杂记)