美文网首页
【02】SpringMVC参数绑定及常用注解

【02】SpringMVC参数绑定及常用注解

作者: 背对背拥抱 | 来源:发表于2019-11-28 15:10 被阅读0次

    一、参数绑定:

    1)基本类型数据绑定:

    包括8大基本类型和String。
    Controller类的方法参数名必须和请求体的参数名一致

    param.jsp代码:

    <a href="/param/testParam?username=zhoulian&password=123456">测试param基本参数</a>
    

    ParaController类:

    @Controller
    @RequestMapping("param")
    public class ParamController {
    
        @RequestMapping("testParam")
        public String testParam(String username,String password){
            System.out.println("testParam。。。");
            System.out.println("用户名:"+username);
            System.out.println("密码:"+password);
            return "success";
        }
    }
    

    下面,控制类我都只写方法了,一级目录都是param

    2)POJO参数类型:

    包括实体类,及关联的实体类。

    Account实体类:

    package com.zl.controller.domain;
    
    import java.io.Serializable;
    
    public class Account implements Serializable {
    
        private String accountName;
        private String accountPassword;
        private Double money;
    
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public String getAccountName() {
            return accountName;
        }
    
        public void setAccountName(String accountName) {
            this.accountName = accountName;
        }
    
        public String getAccountPassword() {
            return accountPassword;
        }
    
        public void setAccountPassword(String accountPassword) {
            this.accountPassword = accountPassword;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account{" +
                    "accountName='" + accountName + '\'' +
                    ", accountPassword='" + accountPassword + '\'' +
                    ", money=" + money +
                    ", user=" + user +
                    '}';
        }
    }
    

    User实体类:

    package com.zl.controller.domain;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
    
        private String uname;
        private Integer uage;
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public Integer getUage() {
            return uage;
        }
    
        public void setUage(Integer uage) {
            this.uage = uage;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "uname='" + uname + '\'' +
                    ", uage=" + uage +
                    '}';
        }
    }
    

    jsp

     <form action="/param/testAccount" method="post">
            账户名:<input type="text" name="accountName"> <br />
            密码:<input type="text" name="accountPassword"> <br />
            金额:<input type="text" name="money"><br /> 
            用户名:<input type="text" name="user.uname"><br />
            用户年龄:<input type="text" name="user.uage"><br />
            <input type="submit" value="提交"/><br>
            
     </form>
    

    Controller类:

     @RequestMapping("/testAccount")
        public String testAccount(Account account){
            System.out.println("testAccount...");
            System.out.println(account);
            return "success";
        }
    
    3)数组和集合类型参数:

    如果Account实体类中包含List和Map:
    如:

    package com.zl.controller.domain;
    
    import java.io.Serializable;
    import java.util.List;
    import java.util.Map;
    
    public class Account2 implements Serializable {
    
        private String accountName;
        private String accountPassword;
        private Double money;
    
        private List<User> list;
        private Map<String,User> map;
    
        public List<User> getList() {
            return list;
        }
    
        public void setList(List<User> list) {
            this.list = list;
        }
    
        public Map<String, User> getMap() {
            return map;
        }
    
        public void setMap(Map<String, User> map) {
            this.map = map;
        }
    
        public String getAccountName() {
            return accountName;
        }
    
        public void setAccountName(String accountName) {
            this.accountName = accountName;
        }
    
        public String getAccountPassword() {
            return accountPassword;
        }
    
        public void setAccountPassword(String accountPassword) {
            this.accountPassword = accountPassword;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account2{" +
                    "accountName='" + accountName + '\'' +
                    ", accountPassword='" + accountPassword + '\'' +
                    ", money=" + money +
                    ", list=" + list +
                    ", map=" + map +
                    '}';
        }
    }
    

    jsp

    <form action="/param/testAccount2" method="post">
            账户名:<input type="text" name="accountName"><br />
            密码:<input type="text" name="accountPassword"><br />
            金额:<input type="text" name="money"><br />
            用户名1:<input type="text" name="list[0].uname"><br />
            用户年龄1:<input type="text" name="list[0].uage"><br />
            用户名2:<input type="text" name="map['one'].uname"><br />
            用户年龄2:<input type="text" name="map['one'].uage"><br />
            <input type="submit" value="提交"/><br />
        </form>
    

    Controller类:

    @RequestMapping("/testAccount2")
        public String testAccount2(Account2 account){
            System.out.println("testAccount...");
            System.out.println(account);
            return "success";
        }
    

    需要注意的是,当参数中含有Date类型,且传递的参数值如2019-11-11,而不是2019/11/11时,需要自定义类型转换器:
    第一步::定义一个类,实现Converter接口

    package com.zl.util;
    
    import org.springframework.core.convert.converter.Converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class ConvertUtil implements Converter<String, Date> {
        @Override
        public Date convert(String source) {
            try {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                return  df.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    第二步: 在spring配置文件中配置类型转换器。

    <!--配置自定义类型转换器-->
        <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="com.zl.util.ConvertUtil"></bean>
                </set>
            </property>
        </bean>
    

    第三步: 在annotation-driven标签中引用配置的类型转换服务

    <!--开启SpringMVC框架注解的支持-->
        <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
    
    4)使用ServletAPI对象作为方法参数:

    Controller类

    @RequestMapping("testServlet")
        public String testServlet(HttpServletRequest request,HttpServletResponse response){
            System.out.println("testServlet。。。");
    
            HttpSession session = request.getSession();
            ServletContext servletContext = session.getServletContext();
            System.out.println(request);
            System.out.println(session);
            System.out.println(servletContext);
            return "success";
        }
    

    二、常用注解:

    1)RequestParam

    作用: 把请求中指定名称的参数给控制器中的形参赋值。
    属性:
    value:请求参数中的名称。
    required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

    jsp:

    <a href="/anno/testRequestParam?username=张三">测试requestParam注解</a>
    

    Controller:

    @RequestMapping("testRequestParam")
        public String testRequestParam(@RequestParam("username") String name){
            System.out.println("testRequestParam...");
            System.out.println(name);
            return "success";
        }
    
    2)RequestBody

    作用: 用于获取请求体内容。
    直接使用得到是key=value&key=value...结构的数据。 get请求方式不适用。
    属性:
    required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。

    jsp

    <form action="/anno/testRequestBody" method="post">
            用户名:<input type="text" name="username" /><br />
            密码:<input type="text" name="password" /><br />
            <input type="submit" value="提交" /><br />
        </form>
    

    Controller类:

    @RequestMapping("testRequestBody")
        public String testRequestBody(@RequestBody String body){
            System.out.println("testRequestBody...");
            System.out.println(body);
            return "success";
        }
    
    3)PathVaribale

    作用: 用于绑定url中的占位符。
    例如:请求url中 /delete/{id},这个{id}就是url占位符。 url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。
    属性:
    value:用于指定url中占位符名称。
    required:是否必须提供占位符。

    jsp

    <a href="/anno/testPathVariable/50">测试PathVariable注解</a>
    

    Controller:

    @RequestMapping("testPathVariable/{sid}")
        public String testPathVariable(@PathVariable("sid") String id){
            System.out.println("testPathVariable...");
            System.out.println(id);
            return "success";
        }
    
    4)RequestHeader

    作用: 用于获取请求消息头。
    属性
    value:提供消息头名称
    required:是否必须有此消息头
    : 在实际开发中一般不怎么用。

    jsp:

    <a href="/anno/testRequestHeader">测试RequestHeader注解</a>
    

    Controller:

    @RequestMapping("testRequestHeader")
        public String testRequestHeader(@RequestHeader("Accept") String header){
            System.out.println("testRequestHeader...");
            System.out.println(header);
            return "success";
        }
    
    5)CookieValue

    作用: 用于把指定cookie名称的值传入控制器方法参数。
    属性
    value:指定cookie的名称。
    required:是否必须有此cookie。

    jsp:

    <a href="/anno/testCookieValue">测试CookieValue注解</a>
    

    Controller:

     @RequestMapping("testCookieValue")
        public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
            System.out.println("testCookieValue...");
            System.out.println(cookieValue);
            return "success";
        }
    
    6)ModelAttribute

    作用: 该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
    出现在方法上,表示当前方法会在控制器的方法执行之前,先执行.它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
    出现在参数上,获取指定的数据给参数赋值。
    属性
    value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
    应用场景
    当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。

    jsp:

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

    Controller:

    @RequestMapping("testModelAttribute")
        public String testCookieValue(@ModelAttribute("uuu") User user){
            System.out.println("testModelAttribute...");
            System.out.println(user);
            return "success";
        }
        @ModelAttribute
        public void saveUser(String uname, Map<String,User> map){
            User user = new User();
            user.setUname(uname);
            user.setUage(44);
            user.setDate(new Date());
            map.put("uuu",user);
        }
    

    或者:

    @RequestMapping("testModelAttribute")
        public String testCookieValue(User user){
            System.out.println("testModelAttribute...");
            System.out.println(user);
            return "success";
        }
        @ModelAttribute
        public User saveUser(String uname,String uage){
           User user = new User();
           user.setUname(uname);
           user.setUage(Integer.parseInt(uage));
           user.setDate(new Date());
           return user;
        }
    
    7)SessionAttribute

    作用: 用于多次执行控制器方法间的参数共享,写在类上。
    属性
    value:用于指定存入的属性名称
    type:用于指定存入的数据类型。

    jsp:

    <a href="/anno/testSessionAttributes">测试SessionAttributes注解</a>
    <a href="/anno/testGetSessionAttributes">获取Session中的msg</a>
    <a href="/anno/testRemoveSessionAttributes">删除Session中的msg</a>
    

    Controller:

     @Controller
    @RequestMapping("anno")
    @SessionAttributes("msg")
    public class AnnoController {
     
     @RequestMapping("testSessionAttributes")
        public String testSessionAttributes(Model model){
            System.out.println("testSessionAttributes...");
            model.addAttribute("msg","多啦A梦");
            return "success";
        }
    
        @RequestMapping("testGetSessionAttributes")
        public String testGetSessionAttributes(ModelMap modelMap){
            System.out.println("testGetSessionAttributes...");
            String msg = (String) modelMap.get("msg");
            System.out.println(msg);
            return "success";
        }
        @RequestMapping("testRemoveSessionAttributes")
        public String testRemoveSessionAttributes(SessionStatus status){
            System.out.println("testRemoveSessionAttributes...");
            status.setComplete();
            return "success";
        }
    

    相关文章

      网友评论

          本文标题:【02】SpringMVC参数绑定及常用注解

          本文链接:https://www.haomeiwen.com/subject/mssbwctx.html