spring

 新建了一个class,添加注解设定一级路径为 annotation

@RequestMapping(path = "/annotation")

里面添加了方法用来测试:

1.

RequestParam (加在controller方法的参数前)

用来规定参数名字

    @RequestMapping(path = "/RequestParam")
    public String requestParamTest(String name, String password){
        System.out.println("name = " + name);
        System.out.println("password = " + password);
        return "success";
    }

不插入注解时,前台需要传递两个参数,name 和 password

    @RequestMapping(path = "/RequestParam")
    public String requestParamTest(String name, @RequestParam(name = "p") String password){
        //插入注解后,前台需要传递的参数变为name 和 p
        System.out.println("name = " + name);
        System.out.println("password = " + password);
        return "success";
    }

插入注解后,前台需要传递的参数变为name 和 p

插入注解后的jsp部分:

<a href="annotation/RequestParam?name='yzha'&p='123456'">RequestParam test</a>

2.

RequestBody

拿到post请求的请求体(key=value的格式,处理json格式数据时会用到)

get请求:一般是超链

post请求:提交表单

RequestHeader: 获得请求头,用得比较少

CookieValue:将cookie值传回,可以用来生成浏览记录

java的controller方法:

    @RequestMapping(path = "/RequestBody")
    public String requestBodyTest(@RequestBody String body, @RequestHeader(value = "ACCEPT") String accept, @CookieValue(value = "JSESSIONID", required = false) String cookie){
        //RequestBody:将所有参数变成一个字符串传回接收
        //RequestHeader:将请求头传回,用字符串接收。
        //CookieValue:将cookie传回,用字符串接收。
        System.out.println(body);
        System.out.println("---------------------");
        System.out.println(accept);
        System.out.println("---------------------");
        System.out.println(cookie);
        return "success";
    }

jsp:

<form action="/annotation/RequestBody" method = post>
            账号信息:<br/>
            用户名:<input type="text" name = 'name'><br/>
            密码:<input type="text" name = 'password'><br/>
            用户信息:<br/>
            用户姓名:<input type="text" name = 'user.name'><br/>
            用户年龄:<input type="text" name = 'user.age'><br/>
            用户生日(yyyy-mm-dd):<input type="text" name = 'user.birthday'><br/>
            <input type ="submit" value = "提交">
        </form>

输入:

 输出:

 RequestBody的整体格式类似get的传参方法,空格变成了+,汉字变成了编码

3.

PathVariable

用来添加url的占位符,一般用来实现restful的编程风格

关于restful:

https://www.cnblogs.com/clamp7724/p/11714650.html

java的controller方法

    @RequestMapping(path = "/PathVariable", method = RequestMethod.GET)
    public String pathVariableTest1(String name){
        System.out.println("根据name = " + name + "查询");
        return "success";
    }
    @RequestMapping(path = "/PathVariable/{userid}", method = RequestMethod.GET) //{}中的参数名字需要与下面@PathVariable中name一致
    public String pathVariableTest2(@PathVariable(name = "userid") String id){ //用了PathVariable后,需要在路径格式为  /PathVariable/100 这种
        System.out.println("根据id = " + id + "查询");
        return "success";
    }

jsp部分

    <div>
        <a href="annotation/PathVariable?name='yzha'">RequestParam test1</a><br/>
        <a href="annotation/PathVariable/20?name='yzha'">RequestParam test2</a>
    </div>

后台输出:

4. ModelAttribute

修饰方法时,方法会在当前class中的controller运行前提前运行,可以接收前台传过来的参数,没有对应参数的时候为默认值(null或者0)。

因为Spring是利用反射调用对象的set方法对对象进行赋值,所以预处理的对象被之后的controller接收到后,会利用set方法进行赋值,预处理的值可以保留(返回值和controller参数的名字和类型一致),不会影响controller的正常运行。(我知道可能看不懂。。。总是这里很抽象- -)

修饰参数时,把这个注解的value的值作为key,获取map对应的value。 (map需要在@ModelAttribute修饰的方法中预先定义)

public @interface ModelAttribute {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean binding() default true;
}

这是源码。。。别被绕进去了- -虽然是ModelAttribute的value属性,但是值是作为map的key。。。

他的key才是value

场景

比如一个网站用户注册网站旗下游戏账号时,自己的信息可以直接从网站获得,不需要填写。所以可以用modelAttribute预处理数据

利用返回值预处理:

java部分:

    //ModelAttribute
    @RequestMapping(path = "/ModelAttribute")
    public String modelAttributeTest(Account account){
        System.out.println(account);
        return "success";
    }
//预处理部分
    @ModelAttribute
    public Account dealWithNullAttribute(String name){
        System.out.println("新增用户:" + name);
        //模拟查询数据库后获得了user信息
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date d = new Date();
        try {
            d = simpleDateFormat.parse("1990-05-26");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        user.setBirthday(d);
        Account account = new Account();
        account.setUser(user);
        return account;
    }

jsp部分:

    <div>
        <form action="/annotation/ModelAttribute" method = post>
            账号信息:<br/>
            用户名:<input type="text" name = 'name'><br/>
            密码:<input type="text" name = 'password'><br/>
            <input type ="submit" value = "提交">
        </form>
    </div>

输入:

 输出:

利用map (我把上面那个ModelAttribute的java部分注释掉了)

java:

    //ModelAttribute
    @RequestMapping(path = "/ModelAttribute")
    public String modelAttributeTest( @ModelAttribute("aaa") Account account){ //把map中value = aaa的 key作为预处理对象
        System.out.println(account);

        return "success";
    }

    //比如一个网站用户注册网站旗下游戏账号时,自己的信息可以直接从网站获得,不需要填写。所以可以用modelAttribute预处理数据
    //预处理部分 (不需要返回值)
    @ModelAttribute
    public void dealWithNullAttribute(String name, Map<String, Account> map){  //一个字符串 和 Account对象作为键值对的Map
        System.out.println("新增用户:" + name);
        //模拟查询数据库后获得了user信息
        User user = new User();
        user.setName("李四");
        user.setAge(20);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date d = new Date();
        try {
            d = simpleDateFormat.parse("1990-05-26");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        user.setBirthday(d);
        Account account = new Account();
        account.setUser(user);

        map.put("aaa", account);
    }

jsp:

    <div>
        <form action="/annotation/ModelAttribute" method = post>
            账号信息:<br/>
            用户名:<input type="text" name = 'name'><br/>
            密码:<input type="text" name = 'password'><br/>
            <input type ="submit" value = "提交">
        </form>
    </div>

输入:

输出:

另外,如果controller写成

public String modelAttributeTest( @ModelAttribute("aaa") Account account, Map<String, Account> map)

可以直接用

 Map<String, Account> map

接收整个预处理创建的map

原文地址:https://www.cnblogs.com/clamp7724/p/11714776.html