欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC的学习总结(二)

程序员文章站 2022-06-11 22:41:35
...

SpringMVC的学习总结

学习要点

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

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

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

SpringMVC的学习总结(二)
代码举例如下:

@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
    所有属性总结如下:

SpringMVC的学习总结(二)

代码举例如下:

@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.
    所有属性总结如下:

SpringMVC的学习总结(二)

代码举例如下:

请求地址: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;
    }