SpringMVC 常用注解 及 其用法 (上)

时间:2020-12-08 05:50:32
个人学习笔记,这里只记录注解相关,springmvc配置方面就不再赘述了
个人理解,有误请指出,谢谢
1.在springmvc配置文件头中加入
xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

SpringMVC 常用注解 及 其用法 (上)

SpringMVC 常用注解 及 其用法 (上)

SpringMVC 常用注解 及 其用法 (上)

2.
说明要扫描哪个包 (注意spring是扫描包,不能写具体到类,否则会出错)

<context:component-scan base-package="cn.test.controller" />


3.常用注解一般用法

@Controller 写在控制类上面,注册控制类,告诉spring容器,这个是控制类

------
@RequestMapping(value="/login", method=RequestMethod.POST)
可写在类上面或者方法上面,value是访问路径,method是只允许method方法访问


------
@RequestParam(value="")
用于绑定前端传送过来的参数,有三个属性
value:入参的请求参数名字
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式

对于有同名参数,则参数类型是集合或数组

比如url?role=admin&role=user,要用@RequestParam(value="role")  String[] roleList 接收

只能绑定基本类型和其包装类和String,不能绑定对象,对象只能用@ModelAttribute绑定,如果用@RequestParam绑定对象,会报错

一般情况下要写,并且要指明value的值,不写的话会报异常
因为Java的反射机制生成的对象并不会保存包含方法的参数,即参数名不会保留在class文件中,所以spring不能反射绑定。
@PathVariable和@RequestParam 都要写value的值

eg.
@Controller
@RequestMapping(value="/login")
public class LoginAction {
@RequestMapping(value="/login1.action")
public String login1(@RequestParam(value="name",required=false) String name,
@RequestParam(value="password",required=false) String password,
@RequestParam(value="address") String address,
Model model){

System.out.println(id);
System.out.println(name);
System.out.println(password);
System.out.println(address);
return "/success.jsp";
}
}
前端页面
<%
pageContext.setAttribute("basePath", request.getContextPath());
%>
<form action="${basePath}/login/login1.action" method="post">
<input type="hidden" name="id" value="233333333333" >
用户名:<input type="text" name="name"><br>
公司地址:<input type="text" name="address"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登陆">
</form>


-----
@PathVariable 用于将请求URL中的模板变量映射到功能处理方法的参数上
这里可以了解一下什么叫Restful
eg
@RequestMapping(value="/{id}/login2.action")
public String login1( @RequestParam(value="name",required=false) String name,
@RequestParam(value="password",required=false) String password,
@PathVariable(value="id") String id,
Model model){

System.out.println(id);//打印的是23232323
System.out.println(name);
System.out.println(password);
return "/success.jsp";
}
前端页面
<form action="${basePath}/login/23232323/login2.action" method="post">
<input type="hidden" name="id" value="233333333333" >
用户名:<input type="text" name="name"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登陆">
</form>


-----
@ModelAttribute(value="对象名")
将多个参数绑定到对象上,基本类型和String不起作用
不同于之前的@RequestParam,这个比如有 url?uear.id=xxx&user.passwd=xx&company=xx,直接将这三个参数绑定到user中

在页面上可以通过 对象名.属性 来展示数据

写在 方法 参数表里,相当于 request.setAttribute()

注意,如果前端页面数据类型和对象数据类型不对应会出现400的错误,因为类型不对导致参数绑定不到对象上
例如,前端页面是数字,后台上使用Integer的话就会出现400,因为默认String类型
eg
@RequestMapping(value="/login3.action")
public String login3( @ModelAttribute(value="user") User u,
@RequestParam(value="name",required=false) String name,
@RequestParam(value="password",required=false) String password,
@ModelAttribute(value="company") Company c,
Model model){

System.out.println(u.toString());
System.out.println(name + " " + password);
System.out.println(c.toString());
return "/success.jsp";
}
前端页面
<form action="${basePath}/login/login3.action" method="post">用户名:<input type="text" name="name"><br>密码:<input type="password" name="password"><br>公司名:<input type="text" name="comName" ><br>公司地址:<input type="text" name="address" ><br><input type="submit" value="登陆"></form>

写在一般方法上面, 作用:在执行该方法前,返回值将会进入到模型对象的属性列表中,用于视图页面展示时使用

写在功能方法的返回值前, 作用:暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用


------
@SessionAttributes(value={"user"})
写在类上面


充当 存 的作用
意思是:将模型对象ModelMap,Model,ModelAndView中的名字为“user”的对象存储到session中
所以要先有model.addAttribute("user",u); 只有这里的"user"和value中的值一样,才行,如果没有,会报错

充当 取 的作用
@ModelAttribute和@SessionAttributes合用的意思是:
需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 方法 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在设置方法的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。

注意:当@ModelAttribute和@SessionAttributes同时出现时,@ModelAttribute使用的是@SessionAttributes里的对象,此时前端数据绑定不进来

SessionStatus status;
status.setComplete();表示该session被摧毁
只清除@SessionAttributes的session,不会清除HttpSession的数据


-----
@initBinder 这个注解表示类型转换器,比如用于日期格式转换

eg,某个控制器中有这个方法
@InitBinder
protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}

经过此控制器都会执行这个方法,转换接收到的日期参数

文章太长保存老是格式错误,就把它分成两半了,还有一部分看SpringMVC 常用注解 及 其用法 (下)