JavaEE学习日志(九十四): SpringMVC的@RequestMapping注解参数,请求参数的绑定

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

SpringMVC

@RequestMapping注解参数

  • path:默认,表示访问路径
  • method:必须使用GET或POST方法访问
 @RequestMapping(value = "/test3",method = RequestMethod.POST)
  • params:必须携带某个参数
@RequestMapping(value = "/test4",params = "username" )
  • headers:必须携带某个请求头
@RequestMapping(value = "/test4",headers = "user-agent")

请求参数的绑定

简单参数的绑定

简单参数的绑定:

@RequestMapping(value = "/test6",headers = "user-agent")
    public ModelAndView test6(ModelAndView modelAndView, int id, String username, double price){
        System.out.println(id+"+"+username+"+"+price);

        //将当前时间显示给用户
        Date date = new Date();
        //resp.getWriter().print(date.toLocaleString());
        String content = "当前时间"+date.toLocaleString();
        //类似于写的req.setAttribute("content",content);
        modelAndView.addObject("content",content);
        //等同于req.getRequestDispatcher("/WEB-INF/pages/hello/list.jsp").forward(req,resp);
        modelAndView.setViewName("user/list");
        return modelAndView;
    }
<form action="/user/test6" method="post">
        <input type="text" name="id"><br>
        <input type="text" name="username"><br>
        <input type="text" name="price"><br>
        <input type="submit" value="提交">
    </form>

没有设置编码,获取中文时会报错,所以使用过滤器来设置编码

spirngmvc的编码过滤器CharacterEncodingFilter

<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

注意如果idea的设置中没有勾选这一项,则编译后生成的class文件中,形参只会有参数类型,不会有参数名,就会导致参数绑定失败
在这里插入图片描述
如果没有勾选也能使用参数绑定,则需要添加注释@RequestParam(name="")
该注解解决两个问题:

  • 前后端参数名不一致
  • 默认值
  • 解决编译导致的无参数名问题
public ModelAndView test6(ModelAndView modelAndView, @RequestParam(name="id") int id,@RequestParam(name="username") String username,@RequestParam(name="price") double price)

该注解还有第二个参数defaultValue,可以在页面没有传递参数时给服务器传递一个默认参数。

public ModelAndView test6(ModelAndView modelAndView, @RequestParam(name="id",defaultValue = "123") int id,@RequestParam(name="username") String username,@RequestParam(name="price") double price)

javabean参数的绑定

绑定user对象

 @RequestMapping(value = "/test7")
    public ModelAndView test7(ModelAndView modelAndView, User user){
        System.out.println(user);

        //将当前时间显示给用户
        Date date = new Date();
        //resp.getWriter().print(date.toLocaleString());
        String content = "当前时间"+date.toLocaleString();
        //类似于写的req.setAttribute("content",content);
        modelAndView.addObject("content",content);
        //等同于req.getRequestDispatcher("/WEB-INF/pages/hello/list.jsp").forward(req,resp);
        modelAndView.setViewName("user/list");
        return modelAndView;
    }
<form action="/user/test7" method="post">
        id:<input type="text" name="id"><br>
        用户名:<input type="text" name="username"><br>
        描述:<input type="text" name="desc"><br>
        <input type="submit" value="提交">
    </form>

复合对象的属性绑定

QueryVo对象中有user对象

package com.itheima.domain;

public class QueryVo {
    private User user;
    private String age;

    @Override
    public String toString() {
        return "QueryVo{" +
                "user=" + user +
                ", age='" + age + '\'' +
                '}';
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

@RequestMapping(value = "/test8")
    public ModelAndView test8(ModelAndView modelAndView, QueryVo queryVo){
        System.out.println(queryVo);

        //将当前时间显示给用户
        Date date = new Date();
        //resp.getWriter().print(date.toLocaleString());
        String content = "当前时间"+date.toLocaleString();
        //类似于写的req.setAttribute("content",content);
        modelAndView.addObject("content",content);
        //等同于req.getRequestDispatcher("/WEB-INF/pages/hello/list.jsp").forward(req,resp);
        modelAndView.setViewName("user/list");
        return modelAndView;
    }

使用层级结构来写name属性

<form action="/user/test8" method="post">
        id:<input type="text" name="user.id"><br>
        用户名:<input type="text" name="user.username"><br>
        描述:<input type="text" name="user.desc"><br>
        年龄:<input type="text" name="age">
        <input type="submit" value="提交">
    </form>

简单类型的数组、list和set集合属性的绑定

简单类型的数组、list和set集合的绑定:和简单属性一样

<form action="/user/test9" method="post">
        id:<input type="text" name="user.id"><br>
        用户名:<input type="text" name="user.username"><br>
        描述:<input type="text" name="user.desc"><br>
        年龄:<input type="text" name="age">
        爱好:<input type="checkbox" name="hobbies" value="1">1
        <input type="checkbox" name="hobbies" value="2">2
        <input type="checkbox" name="hobbies" value="3">3
        <input type="submit" value="提交">
    </form>

map类型的参数绑定

注意map集合的参数名不能写map,否则无法得到结果

public class QueryVo {
    private User user;
    private String age;
    private String[] hobbies;
    private Map xmap;
    ...省略
    }
收款人:
        <input type="text" name="xmap['name']">
        <input type="text" name="xmap['tel']">

装对象的list集合绑定

private List<User> userList;
收货人列表:<br>
        收货人1:<input type="text" name="userList[0].id"><input type="text" name="userList[0].username">
        收货人2:<input type="text" name="userList[1].id"><input type="text" name="userList[1].username">
        收货人3:<input type="text" name="userList[2].id"><input type="text" name="userList[2].username">

参数绑定请求头或cookie值

使用两个注解
@RequestHeader
@CookieValue

@RequestMapping(value = "/test10")
    public ModelAndView test10(ModelAndView modelAndView, @RequestHeader(name="user-agent") String userAgent){
        System.out.println(userAgent);

        //将当前时间显示给用户
        Date date = new Date();
        //resp.getWriter().print(date.toLocaleString());
        String content = "当前时间"+date.toLocaleString();
        //类似于写的req.setAttribute("content",content);
        modelAndView.addObject("content",content);
        //等同于req.getRequestDispatcher("/WEB-INF/pages/hello/list.jsp").forward(req,resp);
        modelAndView.setViewName("user/list");
        return modelAndView;
    }
@RequestMapping(value = "/test11")
    public ModelAndView test11(ModelAndView modelAndView, @CookieValue(name="JSESSIONID") String jSessionId){
        System.out.println(jSessionId);

        //将当前时间显示给用户
        Date date = new Date();
        //resp.getWriter().print(date.toLocaleString());
        String content = "当前时间"+date.toLocaleString();
        //类似于写的req.setAttribute("content",content);
        modelAndView.addObject("content",content);
        //等同于req.getRequestDispatcher("/WEB-INF/pages/hello/list.jsp").forward(req,resp);
        modelAndView.setViewName("user/list");
        return modelAndView;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值