SpringMVC中常用的注解

SpringMVC中常用的注解

1、@RequestParam注解

作用:
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

@RequestParam有三个参数:

value:参数名;

required:是否必需,默认为true,表示请求参数中必须包含该参数,如果不包含抛出异常。

defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数中没有包含该参数则使用默认值。

示例:@RequestParam(value = "userId", required = false, defaultValue = "1")

2、@RequestBody注解

作用:

用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。 get 请求方式不适用。

属性:

required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。

案例:

post 请求 jsp代码: 
<!-- request body 注解 --> 
<form action="springmvc/useRequestBody" method="post"> 
 	用户名称:<input type="text" name="username" ><br/>  
 	用户密码:<input type="password" name="password" ><br/>  
 	用户年龄:<input type="text" name="age" ><br/> 
 	<input type="submit" value=" 保存 "> 
</form> 
    get 请求 jsp代码: 
    <a href="springmvc/useRequestBody?body=test">requestBody 注解 get 请求</a> 

控制器代码块

/** 
 * RequestBody 注解  
 * @param user  
 * @return  
 */ 
@RequestMapping("/useRequestBody") 
public String useRequestBody(@RequestBody(required=false) String body){  						System.out.println(body);  
   	return "success";
 }

在这里插入图片描述

3、@PathVaribale注解

作用:

用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

属性:

value:用于指定 url 中占位符名称。 required:是否必须提供占位符

jsp代码

<!-- PathVariable 注解 --> 
<a href="springmvc/usePathVariable/100">pathVariable 注解</a> 

控制器代码块

/** 
 * PathVariable 注解  
 * @param user 
 * @return  
 */ 
@RequestMapping("/usePathVariable/{id}") 
public String usePathVariable(@PathVariable("id") Integer id){  
    System.out.println(id);  
    return "success"; 
}

运行结果:

在这里插入图片描述

4、@RequestHeader注解

作用:

用于获取请求消息头。

属性:

value:提供消息头名称

required:是否必须有此消息头

注: 在实际开发中一般不怎么用。

jsp代码块

<!-- RequestHeader 注解 --> 
<a href="springmvc/useRequestHeader">获取请求消息头</a>

控制器中的代码块

/** 
 * RequestHeader 注解  
 * @param user  
 * @return  
 */ 
@RequestMapping("/useRequestHeader") 
public String useRequestHeader(@RequestHeader(value="Accept-Language",
                   required=false)String requestHeader){  
    System.out.println(requestHeader);  
    return "success"; 
}

5、@CookieValue注解

作用:

用于把指定 cookie 名称的值传入控制器方法参数。

属性:

value:指定 cookie 的名称。

required:是否必须有此 cookie。

JSP代码

<!-- CookieValue 注解 --> 
<a href="springmvc/useCookieValue">绑定 cookie 的值</a>

控制器代码块

/** 
 * Cookie 注解注解 
 * @param user  
 * @return  
 */ @RequestMapping("/useCookieValue") 
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){  
    System.out.println(cookieValue); 
    return "success"; 
}

运行结果:

在这里插入图片描述

6、@ModelAttribute 注解

作用:

该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。

出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可 以修饰有具体返回值的方法。

出现在参数上,获取指定的数据给参数赋值。

属性:

value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。

应用场景:

当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。

例如:

我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

案例:

带有返回值的情况

jsp代码块

    <center>
        <form action="anno/testModelAttribute "  method="post">
            用户姓名:<input type="text" name="name" /><br/>
            用户年龄: <input type="text" name="age" /><br/>
            <input type="submit"  value="提交">
        </form>
    </center>

控制器代码块

 /*
     * @ModelAttribute
     * */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("testModelAttribute执行了");
        System.out.println(user);
        return "success";
    }

    /*
    * 该方法先执行,没有带返回值的
    *jsp请求之后,函数会先执行,设置完user的数据,再讲user返回给上面的函数。 
    * */
    @ModelAttribute
    public User showUser(String name){
        System.out.println("showUser执行了");
        User user=new User();
        user.setUname(name);
        user.setAge(20);
        user.setDate(new Date());
        return user;
    }

不带返回值的情况

jsp代码块

    <center>
        <form action="anno/testModelAttribute "  method="post">
            用户姓名:<input type="text" name="name" /><br/>
            用户年龄: <input type="text" name="age" /><br/>
            <input type="submit"  value="提交">
        </form>
    </center>

控制器代码块

    /*
     * @ModelAttribute
     *通过@ModelAttribute把Map集合里面的user对象取出赋值给函数中的user
     * */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute(value = "user") User user){
        System.out.println("testModelAttribute执行了");
        System.out.println(user);
        return "success";
    }

    /*
    *该方法先执行,没有带返回值的
    *请求会先执行一下的函数,将其封装到Map集合内。
    * */

    @ModelAttribute
    public void showUser(String name, Map<String,User> map){
        System.out.println("showUser执行了");
        User user=new User();

        user.setUname(name);
        user.setAge(20);
        user.setDate(new Date());
        map.put("user",user);
    }

运行结果:
在这里插入图片描述

7、@SessionAttributes注解

1、javaWeb工程通用的HttpSession

2、SpringMVC特有的@SessionAttributes

我个人比较关注@SessionAttributes的用法,毕竟现在是在用SpringMVC嘛。但是我看网上那些文章,基本都是只说明了基础用法,详细的使用和细节却基本没有,我想这是不够的,所以我自己做了一些测试,然后整理了下代码做了个demo,记录并分享下,有什么不足的欢迎提出来讨论。

好了,废话就说到这,下面正戏开始!

结论

嗯,为了给一些不喜欢看代码的客官省去翻结论的麻烦,我这里就先把我测试后的结论先列一下吧。

1、可以通过SpringMVC特有的ModelMap、Model在Controller中自动保存数据到session,也可以通过传统的HttpSession等参数保存session数据

2、保存session数据必须使用@SessionAttributes注解,该注解有2种参数声明方式(value和types),且该注解声明必须写在类上,不能在方法上

3、保存的session数据必须与@SessionAttributes注解中的参数列表对应,未被声明的参数无法保存到session中

4、使用SessionStatus可以清除session中保存的数据,注意是全部清除,无法单独删除指定的session数据。同时,清除时有效权限遵循上述第2、3条规则(借用此规则可人为达到删除指定session数据的效果)

5、通过ModelMap等读取session中数据时,也有上述的参数权限限制

6、使用ModelMap或Model等保存session数据时,ModelMap必须作为方法参数传入,在方法中新定义的无效。同时,只要把ModelMap作为参数传入,即使是被别的方法调用也能起效

7、使用@ResponseBody注解时(一般配合ajax使用),无法保存session数据

8、@SessionAttributes注解可以使用value和types 2种参数列表

9、使用HttpSession的传统方式操作没有上述注解及权限等限制,下面有简单测试,但是不做具体说明

以下还有几个应该算是常识性的知识点

10、操作session数据可以跨类,与包或者url的路径等也没有关系

11、同一个session值操作,后面的值会覆盖前面的值

jsp代码块1

    <a href="anno/testSessionAttributes">SessionAttributes</a>
    <a href="anno/getSessionAttributes">getSessionAttributes</a>
    <a href="anno/delSessionAttributes">delSessionAttributes</a>

jsp代码块2

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
${demo1}
<%--${requestScope}--%>
${sessionScope}
${sessionScope.get("demo1")}
${sessionScope.get("demo2")}
${demo3}

控制器代码块

/*这个注解必须也只能贴在类上面
* */
@SessionAttributes(value={"demo1","demo2","demo3"})


    /*
     * 因为Model中没有get的方法,而且在SessionAttributes中使用的是Map的集合,所以要通过ModelMap中的get方法取出SessionAttributes中的数据。
     * */
    @RequestMapping("/delSessionAttributes")
    public String delSessionAttributes(SessionStatus sessionStatus, HttpSession session){
        sessionStatus.setComplete();

        return "success";
    }


    /*
    * 因为Model中没有get的方法,而且在SessionAttributes中使用的是Map的集合,所以要通过ModelMap中的get方法取出SessionAttributes中的数据。
    * */
    @RequestMapping("/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){
        String msg=(String)modelMap.get("demo1");
        String msg1=(String)modelMap.get("demo2");
        String msg2=(String)modelMap.get("demo3");
        System.out.println(msg+" "+msg1+" "+msg2);
        return "success";
    }

    /*
     *SessionAttributes
     * 通过Model将数据存储到request域中 通过SessionAttributes将数据传去Session中全部的方法都可使用。
     * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model){
        model.addAttribute("demo1","妹妹");
        model.addAttribute("demo2","姐姐");
        model.addAttribute("demo3","弟弟");
        return "success";
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值