SpringMVC的学习总结(二)

SpringMVC的学习总结

学习要点

@RequestHeader注解的使用(请求头信息与方法参数之间的映射)
@CookieValue注解的使用(将请求的cookie数据映射到响应方法的参数中)
@SessionAttributes注解的使用(可以有选择性的将Model的属性添加到HttpSession中)
@ModelAttribute注解的使用(同一个控制器,先于调用方法前调用,把模型数据添加到Model中从RequestScope取出)

@RequestHeader注解的使用(请求头信息与方法参数之间的映射)

    @RequestHeader注解用于将请求的头信息区数据映射到功能处理方法的参数上.
    作用域:作用于方法上参数中
    特性重点讲解:
        required:指定参数是否必须绑定,默认为true(必须含有该参数,否则报错),可选false
    所有属性总结如下:

这里写图片描述
代码举例如下:

@RequestMapping(value = "/requestHeaderTest")
    /*所请求的头文件必须包含Accept,因为requried默认为truem否则报错,或设置requried为false,之后获取的Accept会主动映射到accepts数组中去*/
    public String requestHeaderTest(@RequestHeader(value = "Accept") String[] accepts, Model model) {
        System.out.println("获取的用户请求头accepts信息为:" + Arrays.toString(accepts));
        model.addAttribute("message", "获取的用户请求头accepts信息为:" + Arrays.toString(accepts));
        return "modelAttribute4";
    }

@CookieValue注解的使用(将请求的cookie数据映射到响应方法的参数中)

    用于将请求的Cookie数据映射到功能处理方法的参数中
    作用域:作用于方法上参数中
    特性重点讲解:
        required:指定参数是否必须绑定,默认为true(必须含有该参数,否则报错),可选false
    所有属性总结如下:

这里写图片描述

代码举例如下:

@RequestMapping(value = "/cookieValueTest")
    /*所获取cooki必须包含JSESSIONID,因为requried默认为truem否则报错,或设置requried为false,之后获取的Accept会主动映射到accepts数组中去*/
    public String cookieValueTest(@CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId, Model model) {
        System.out.println("获取的cookie的session信息为:" + sessionId);
        model.addAttribute("message", "获取的cookie的session信息为:" + sessionId);
        return "modelAttribute5";
    }

@SessionAttributes注解的使用(可以有选择性的将Model的属性添加到HttpSession中)

    用于将Model的数据选择性的添加到HttpSession中进行储存
    作用域:作用于类上,不可作用于方法上
    特性重点讲解:
        types:数组类型,用于指定存放的数据类型,指定参数是否必须绑定
        names:和Model中的属性名称一样,我测试了一下,当value为与Model不一样的值的时候,这时候访问session的value值时,无法访问到,但是访问session数据时。使用的是Model储存的attributeName值时,可以访问到。
        value:同names.
    所有属性总结如下:

这里写图片描述

代码举例如下:

请求地址:http://localhost:8081/springmvc1/modelAttribute/sessionAttributesTest.action?username=用户名称&deptname=部门名称


代码:

@Controller
@RequestMapping(value = "modelAttribute")
/*将Model中的属性名为user,和dept属性存放在HttpSession中*/
@SessionAttributes(types = {User.class, Dept.class}, value = {"user", "dept"})
public class ModelAttributeController {

    @RequestMapping(value = "/sessionAttributesTest")
    /*获取前台传递的username,和deptname,使用required = false设置为并非含有此字段,分别赋值给userName和deptName*/
    public String sessionAttributesTest(@RequestParam(value = "username", required = false) String userName, @RequestParam(value = "deptname", required = false) String deptName, Model model) {
        System.out.println("使用@sessionAttributes将参数设置到session中");

        User user = new User();
        user.setUsername(userName);

        Dept dept = new Dept();
        dept.setDeptname(deptName);

        model.addAttribute("user", user);
        model.addAttribute("dept", dept);
        return "modelAttribute6";
    }

}


页面modelAttribute6.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
modelAttribute6的jsp页面<br>
${message}

从Model中获取的参数(request)username为:${requestScope.user.username}<br>
从Model中获取的参数(request)deptname为:${requestScope.dept.deptname}<br>

从SessionAttribute中获取的参数(session)username为:${sessionScope.user.username}<br>
从SessionAttribute中获取的参数(session)deptname为:${sessionScope.dept.deptname}<br>
</body>
</html>

当输入中文得时候有可能出现乱码,乱码解决见 springMVC中文乱码解决


@ModelAttribute注解的使用(同一个控制器,先于调用方法前调用,把模型数据添加到Model中从RequestScope取出)

    "同一个控制器,先于调用方法前调用,把模型数据添加到Model中从RequestScope取出"
    作用域:作用于方法上
    只有一个value属性,String类型,表示绑定的属性名称

    使用@ModelAttribute注解标注的方法,返回类型很多种,使用方式如下:
        1.返回具体类的方法
            @ModelAttribute(value = "username")
    /*首先ModelAttribute会先于请求方法调用,请求的username会寻找到(@RequestParam(value = "username"),然后username匹配,之后把username映射到userName中,同时自动把username添加到Model中去
    * 注意,这里存入Model中的属性值为username,并不是后面起的参数属性值:userName,*/
    public String modelAttributeTest(@RequestParam(value = "username") String userName) {
        System.out.println("modelAttributeTest中的username为:" + userName);
        return userName;
    }


    2.void返回值的方法
        @ModelAttribute(value = "username")
    /*首先ModelAttribute会先于请求方法调用,请求的username会寻找到(@RequestParam(value = "username"),然后username匹配,之后把username映射到userName中,
    同时手动把username添加到Model中去*/
    public void modelAttributeTest1(@RequestParam(value = "username") String userName, Model model) {
        System.out.println("modelAttributeTest中的username为(返回值为void):" + userName);
        model.addAttribute("username", userName);
    }


    3.返回一个实体类
    @ModelAttribute(value = "username")
    /*首先ModelAttribute会先于请求方法调用,请求的username会寻找到(@RequestParam(value = "username"),然后username匹配,之后把username映射到userName中,
    同时手动把username添加到Model中去*/
    public User modelAttributeTest1(@RequestParam(value = "username") String userName) {
        System.out.println("modelAttributeTest中的username为(返回值为void):" + userName);
        User user = new User();
        user.setUsername(userName);
        /*返回的时候,属性默认为实体类首字母小写如User返回的key为user,值为user这个对象*/
        return user;
    }



    4.ModelAttribute和RequestMapping同时作用于一个方法上
        /*请求地址为modelAttribute7,设置请求方法为post或get的才会调用此方法*/
    @RequestMapping(value = "modelAttribute7", method = {RequestMethod.GET, RequestMethod.POST})
    @ModelAttribute(value = "username")
    /*首先ModelAttribute会先于请求方法调用,请求的username会寻找到(@RequestParam(value = "username"),然后username匹配,之后把username映射到userName中,
    同时自动把username添加到Model中去*/
    public String modelAttributeTest4(@RequestParam(value = "username") String userName) {
        System.out.println("modelAttributeTest中的username为(返回值为void):" + userName);
        /*注意还是首先执行的是@ModelAttribute注解,只是相当于两个方法重复了,一样,所以先执行ModelAttribute标志的方法,请求的username参数映射之后返回username的值,也就是相当于request内部封装了username=username[不固定前台传过来的值],然后再执行RequestMapping的方法进行页面跳转*/
        /*但是值得注意的是,此时跳转的是当前路径的../modelAttribute7.jsp页面而不是返回的userName的页面,这要特此注意*/
        return userName;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值