你未看此花时,则此花与汝心同归于寂, 你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。
一. @Repository 属性
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository
{
String value() default "";
}
如 @Controller 用在 Action 层, @Repository 常常用在 Dao层。 只有一个 value的属性。
@Repository
public class UserDaoImpl implements UserDao{
}
也可以添加value 来指定实例。
@Repository(value="userDao")
public class UserDaoImpl implements UserDao{
}
也可以省略value.
@Repository(value="userDao")
public class UserDaoImpl implements UserDao{
}
二. @Service 属性
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service
{
String value() default "";
}
常常用在 Service 业务层中。 与@Repository 用法一一致。
@Service(value="userService")
public class UserServiceImpl implements UserService{
}
三. @RequestBody
@Target({java.lang.annotation.ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody
{
boolean required() default true;
}
@RequestBody ,是将HTTP 中请求体的正文插入到方法中。 作用在方法的参数上。
三.一 运行过程:
1 . 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
2 . 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
三.二 类型提交
常见的表单方式的 的Get 和POST 提交时, 会根据请求头的Content-Type 类型进行相应的判断。
提交类型为 application/x-www-form-urlencoded 时, 即form 表单的默认形式, 这个时候,可以用@RequestBody 来处理,也可以通过前面的 @RequestParam 和@ModelAttribute 来获取。 可注解,也可以不注解。
提交类型为 multipart/form-data, 即二进制的,如上传图片的,这个时候,@RequestBody 处理不了。
提交类型为 application/json, 即json形式时, 必须用@RequestBody 来进行处理。 也必须要注解。
常常是 前端传入 json 对象时,进行相应的解析,解析成字符串。 JSON的处理,会有专门的章节来讲解。
如果请求方式是 PUT 形式时,
提交类型为 application/x-www-form-urlencoded 时, 即form 表单的默认形式,必须添加。
提交类型为 multipart/form-data, 即二进制的,如上传图片的,这个时候,@RequestBody 处理不了。
提交类型为 application/json, 即json形式时, 必须用@RequestBody 来进行处理。 也必须要注解。
三.三 数据填充
如果是单个值的话
@RequestMapping(value="/register")
public String register(@RequestBody String name){
System.out.println("接收名称:"+name);
return "user/list";
}
如果是多个值的话
@RequestMapping(value="/register")
public String register(@RequestBody String name,
Integer age,
String sex,
String description){
System.out.println("接收名称:"+name);
System.out.println("接收年龄:"+age);
System.out.println("接收性别:"+sex);
System.out.println("接收描述:"+description);
return "user/list";
}
注意,只能用一个@RequestBody ,不能每一个参数都写上。
这样写,是错误的。
@RequestMapping(value="/register")
public String register(@RequestBody String name,
@RequestBody Integer age,
@RequestBody String sex,
@RequestBody String description){
System.out.println("接收名称:"+name);
System.out.println("接收年龄:"+age);
System.out.println("接收性别:"+sex);
System.out.println("接收描述:"+description);
return "user/list";
}
四 @ReponseBody 注解
@Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {}
@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用于方法上。
@RequestMapping(value="/register")
@ResponseBody
public String register(User user){
}
四.一 运行过程:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
四.二 使用时机
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。 常常是用JSON格式,后面专门讲解。
是将方法的返回结果 以JSON的方式,返回给前端。 与@RequestBody 正好相反。
五. @RequestHeader
@Target({java.lang.annotation.ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader
{
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\n\t\t\t\t\n";
}
把 请求 request 的Header 头部的内容直接绑定在参数上,方便获取浏览器头部的值。
常见的头部值有:
Host: 请求的web服务器域名地址
User-Agent: HTTP客户端运行的浏览器类型的详细信息。通过该头部信息,web服务器可以判断到当前HTTP请求的客户端浏览器类别。
Accept: 指定客户端能够接收的内容类型,内容类型中的先后次序表示客户端接收的先后次序。
Accept-Language: 指定HTTP客户端浏览器用来展示返回信息所优先选择的语言。
Accept-Encoding: 指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。而这里设置的就是客户端浏览器所能够支持的返回压缩格式
Accept-Charset: 浏览器可以接受的字符编码集。
Content-Type: 显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。
Keep-Alive: 显示此HTTP连接的Keep-Alive时间。使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。以前HTTP请求是一站式连接,从HTTP/1.1协议之后,就有了长连接,即在规定的Keep-Alive时间内,连接是不会断开的。
@RequestHeader 注解标记在方法参数上,每一个参数都要进行相应的标识。
@RequestMapping(value="/register")
public String register(@RequestHeader(value="User-Agent") String user_agent,
@RequestHeader(value="Accept") String accept ){
System.out.println("浏览器:"+user_agent);
System.out.println("接收类型:"+accept);
return "user/login";
}
请求之后,控制台打印输出:
六. @CookieValue
@Target({java.lang.annotation.ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue
{
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\n\t\t\t\t\n";
}
可以把请求 头部中的Cookie 绑定到参数里面。 对方法参数进行相应的注解。
除了常用的JSESSIONID 之外 ,再设置一个cookie,名称为 name.
@RequestMapping(value="/toLogin")
public String toLogin(HttpServletRequest request,HttpServletResponse response){
//设置一个Cookie
Cookie cookie;
cookie = new Cookie("name","yuejl");
cookie.setMaxAge(10000);
response.addCookie(cookie);
return "user/login";
}
@RequestMapping(value="/register")
public String register(@CookieValue(value="JSESSIONID") String jsessionId,
@CookieValue(value="name") String name){
System.out.println("输出jsessonid:"+jsessionId);
System.out.println("用户名"+name);
return "user/login";
}
访问之后,控制台打印输出:
可以方便的取出 Cookie 里面的值。
七. @SessionAttribute
将数据存储到Session 里面,与以前的 session.setAttribute() 相同。
@Controller
@RequestMapping(value="/user")
@SessionAttributes(value="sessionUser")
public class UserAction {
@RequestMapping(value="/toLogin")
public String toLogin(HttpServletRequest request,HttpServletResponse response,
Model model){
User user=new User();
user.setId(1);
user.setName("两个蝴蝶飞");
user.setAge(24);
user.setSex("男");
user.setDescription("一个快乐的程序员");
//放置到session里面。
model.addAttribute("sessionUser",user);
return "user/login";
}
@RequestMapping(value="/register")
public String register(HttpSession session){
User user=(User)session.getAttribute("sessionUser");
System.out.println("从session中取值:"+user.toString());
return "user/login";
}
}
前端页面 login.jsp 展示:
<h3>老蝴蝶欢迎你来到这个页面</h3>
<form action="/SpringMVC02/user/register.action" method="post">
用户名: <input type="text" name="name" value='${sessionUser.name}'/> <br/>
年龄:<input type="text" name="age" value='${sessionScope.sessionUser.age}'><br/>
性别:<input type="text" name="sex" value='${sessionUser.sex}'><br/>
描述:<input type="text" name="description" value="${sessionScope.sessionUser.description}"><br/>
<input type="submit" value="提交">
</form>
访问之后:
页面展示:
可知,这样便放置在了session 里面。
进入 register 方法测试一下,
控制台打印输出:
SpringMVC 的常用注解差不多就这么多,算是讲完了。
谢谢!!!