0
点赞
收藏
分享

微信扫一扫

SpringMVC的常用注解(四)


你未看此花时,则此花与汝心同归于寂, 你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。


一. @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";
}

请求之后,控制台打印输出:

SpringMVC的常用注解(四)_json

六. @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";
}

访问之后,控制台打印输出:

SpringMVC的常用注解(四)_@ResponseBody_02

可以方便的取出 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>

访问之后:

SpringMVC的常用注解(四)_json_03

页面展示:

SpringMVC的常用注解(四)_客户端_04

可知,这样便放置在了session 里面。

进入 register 方法测试一下,
控制台打印输出:

SpringMVC的常用注解(四)_json_05

SpringMVC 的常用注解差不多就这么多,算是讲完了。

谢谢!!!



举报

相关推荐

0 条评论