springmvc常用注解的详解

一.  @RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。

@RequestMapping 注解包含的参数如图:既可以定义在类上,也可以定义在方法上

1、常用:value,path,  method

value 和 path 是一样的: 指定请求的实际地址

method:默认会自动匹配GET或POST请求,可以指定请求的method类型 取值可以是GET、POST、PUT、DELETE等;

2. 不常用:params, consumes,produces,headers:name(不常用) 

params: 指定request中get或post请求时,必须包含某些参数值,才让该方法处理

consumes: 指定处理请求提交的内容类型(Content-Type)。

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

状态码415表示:由于媒介类型不被支持

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

补充: RequestMapping 注解中的映射请求可以支持3中通配符:

1、?:匹配文件中的一个字符

2、* :匹配任意字符

3、** :匹配多层路径

二,@RequestParam 注解

@RequestParam 注解是在SpringMvc后台进行获取页面参数数据get/post提交都可以,定义在方法参数中

login.jsp 页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> 
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>登录页面</h3>
	<form action="<%=path %>/login/in" method="post" >
		<input type="text" name="username" />	<br/>
		<input type="password" name="password" /> <br/>
		<input type="submit" value="提交" /> 
		<input type="reset" value="重置" /><br/>
	</form>
</body>	
</html>

controller类 

1.  springmvc会自动根据参数名字来注入,所以要名字一致,不然不会注入

@Controller
@RequestMapping("/login")
public class LoginAction {

	//http://localhost:8080/springmvcdemo/login/
	@RequestMapping(value="/")
	public String login() {
		return "login";
	}
	@RequestMapping(value="/in")
	public String login1(@RequestParam String username, @RequestParam int password) {
		System.out.println("username=" + username + ", password=" + password);
		return "success";
	}
}

2.  参数名字不一致的话,需要在 @RequestParam 后面指定 name="页面name的值"。

如果参数为 int 类型,页面提交直接报错,可通过 defaultValue 设置默认值,或使用包装类型,或通过required=false,那么默认为参数赋值为 null。

@RequestMapping(value="/in")
	public String login1(@RequestParam(name="username",defaultValue="admin") String un, @RequestParam(required=false) int password) {
		System.out.println("username=" + un + ", password=" + password);
		return "success";
	}

-------
username=admin, password=123456

三、 @RequestHeader和@CookieValue 注解(了解)

@RequestHeader 和 @CookieValue 也是在 SpringMvc 后台进行获取数据的注解,只不过不是前端传来的参数,而是前端请求的 heade 头部信息和 Cookie 信息。

@RequestHeader 把Request请求header部分的值绑定到方法的参数上。

@CookieValue  把Request header中关于cookie的值绑定到方法的参数  

     

	@RequestMapping(value="/index")
	public String index(@RequestHeader(name="Accept-Language") String al,@CookieValue(name="JSESSIONID") String ck) {
		System.out.println("Accept-Language = " + al + ", Cookie = " + ck);
		return "success";
	}
----
Accept-Language = zh-CN,zh;q=0.9, Cookie = 66DB4BA3B42151803254D24F57C47F9F

四、从JSP页面里传数据到SpringMVC中的Controller处理

1.  在控制器里的方法里,通过原始的 servlet 直接读取表单的数据(了解),

	@RequestMapping(value="/in")
	public String login1(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
		req.setCharacterEncoding("utf-8");
		String un = req.getParameter("username");
		String ps = req.getParameter("password");
		System.out.println("username=" + un + ", password=" + ps);
		return "success";
	}

2. 从JSP页面或者说url路径的参数同SpringMVC的控制器里方法的参数映射对应

   1)第一种映射方式:

表单元素的name名字或者url的参数名字 同 控制器里的方法的形参名一致/不一致, 同上面二、三步一样使用。

   2)第二种映射方式: 采取 POJO类 传值方式

jsp页面里的表单元素的 name 名字为 java对象的字段名

	@RequestMapping(value="/in")
	public String login1(User user) {
		System.out.println("username=" + user.getUsername() + ", password=" + user.getPassword());
		return "success";
	}
----
username=asd, password=asd123

五、响应到 jsp 的数据 ModelAndView ,Map ,Model 和 ModelMap参数类型

ModelAndView 对象中包含了一个 model 属性和一个 view 属性。

        model:是一个 ModelMap 的类型。而ModelMap又是一个LinkedHashMap的子类。

        view:包含了一些视图信息。

实现原理:

     当视图解释器解析ModelAndVIew类型的参数时,其中model是一个Map的实现类的子类,视图解析器将model中的每个元素都通过request.setAttribute(name, value)方法,添加request请求域中。这样就可以在JSP页面中通过EL表达式来获取对应的值。

 1、 MoelAndView 类型

	@RequestMapping(value="/in")
	public ModelAndView login1(User user) {
		//创建视图模型对象 该对象中既包含了模型数据 又包含了视图名称
		ModelAndView mv = new ModelAndView();
		mv.setViewName("success");//设置相应视图的名字
		///添加模型数据, 各种类型都可以
		mv.addObject(user);
		mv.addObject("hello", "你好");
		
		return mv; //返回视图模型对象
	}

----jsp

<body>
	访问成功<br>
	${hello }, ${user.username }<br>
	${user }
</body>

         

2、 Map 类型

	@RequestMapping(value="/in")
	public String login1(User us, Map<String, Object> map) {
		//添加模型数据
		map.put("user", us);
		map.put("hello", "你好");
		return "success"; //返回视图的名字
	}

3. Model 类型

	@RequestMapping(value="/in")
	public String login1(User us, Model model) {
		//添加模型数据
		model.addAttribute("user", us);
		model.addAttribute("hello", "你好");
		
		return "success"; //返回视图的名字
	}

4、ModelMap 类型

	@RequestMapping(value="/in")
	public String login1(User us, ModelMap modelmap) {
		//添加模型数据
		modelmap.addAttribute("user", us);
		modelmap.put("hello", "你好");
		
		return "success"; //返回视图的名字
	}

Map<String,Object> map 和 Model model 等价

ModelMap,即可以使用Map的put()方法,也可以使用Model的addAttribute()方法,但本质差不多的,都是Map的实现

六、 @SessionAttributes 注释

@SessionAttributes: 将值放到 session作用域 中,只能写在类上面。

如果我们希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将把模型中对应的属性暂存到 HttpSession 的域中。

使用方法:

@SessionAttributes(value={"xxx"}, types={xxxx.class})

value:可通过键来指定放入HttpSession 的域中的值;

types:也可通过类型指定放入HttpSession 的域中的值;

使用举例:

@SessionAttributes(types=User.class)

      这个注解会将类中所有放入Request域中的User类型的实例放进HttpSession的域空间中。

七、@ModelAttribute 注释

使用方式:

1、@ModelAttribute 定义在方法上,Springmvc在调用目标处理方法前,会先逐个调用标注了@ModelAttribute 的方法。

2、@ModelAttribute 在方法的参数上使用 ,主要是和使用 @ModelAttribute 注解的方法上中数据模型的Key匹配一致,可省略。

注意:@ModelAttribute注释的方法和被@RequestMapping注释的方法一样也支持@RequestParam参数,但是它不能直接被请求映射。实际上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被调用之前调用的。

初步了解:

当同一个controller中有任意一个方法被@ModelAttribute注解标记,页面请求只要进入这个控制器,不管请求那个方法,均会先执行被@ModelAttribute标记的方法,所以我们可以用@ModelAttribute注解的方法做一些初始化操作。当同一个controller中有多个方法被@ModelAttribute注解标记,所有被@ModelAttribute标记的方法均会被执行,按先后顺序执行,然后再进入请求的方法。

    

八、@PathVariable

用于将请求URL中的参数映射到功能处理方法的参数上,即取出uri模板中的传入的参数作为处理方法的参数。

//restful风格删除一条记录:http://localhost:8080/sshweb/delete/12	
//url="<%=path%>/delete/${obj.id}"
        @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
	public String delete(@PathVariable("id") Integer id) {
		userService.delete(id);
		return "redirect: /sshweb/users";
	}

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/82085529