zoukankan      html  css  js  c++  java
  • SpringMVC的控制器接收前端数据的方式

    1.请求处理方法中可以出现以下几种参数类型,直接在controller方法形参上定义默认类型的对象,就可以使用这些对象。可以通过下列对象来获取前台传来的参数:

      ①HttpServletRequest对象:通过request对象可以获取参数信息

      ②HttpservletResponse对象:通过response对象可以处理响应信息

      ③HTTPSession对象:获取session中存储的对象

      ④Model/ModelMap:Model是一个接口,ModelMap是一个接口的实现。作用是将模型数据填充到request域

        模型对象(ModelMap)的特定属性具有Session范围的作用域。  我们在②处添加了一个ModelMap属性,其属性名为currUser,

    而①处通过@SessionAttributes注解将ModelMap中名为currUser的属性放置到Session中,所以我们不但可以在login()请求所对应的JSP视图

    页面中通过request.getAttribute("currUser")和session.getAttribute("currUser")获取user对象,还可以在下一个请求所对应的JSP视图页面中

    通过session.getAttribute("currUser")或者ModelMap.get("currUser")访问到这个属性。

    @Controller  
    @RequestMapping("/user")  
    @SessionAttributes("currUser") //①将模型对象(ModelMap)中currUser属性放到Session属性列表中,以便这个属性可以跨请求访问  
    public class UserLoginController{  
       @RequestMapping(value="/login")  
       public String login(@RequestParam("id") int id, User user, ModelMap model){  
           // ②往ModelMap中存放currUser属性,该属性将被转存到Session属性列表中  
           model.addAttribute("currUser", user);  
           return "success";  
       }  
    }
    

      ⑤使用IO对象作为入参 ,如 java.io.InputStream/java.io.Reader 及java.io.OutputStream/java.io.Writer 

      ⑥使用其他类型的参数,java.util.Locale/java.security.Principal ,也可以通过Servlet的HttpServletRequest的getLocale()及getUserPrincipal() 

      ⑦使用表单对象绑定请求参数值

        非常简单,只需将对象的属性名和input的name值一一匹配即可。

        User对象中有ContactInfo属性,在表单代码中,需要使用“属性名(对象类型的属性).属性名”来命名input的name。

        除此之外,对于基本数据类型和包装数据类型,表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。

        需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者”"的话,会出现数据转换的异常。

        也就是必须保证表单传递过来的数据不能为null或”",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型。

    @RequestMapping("saysth.do")
    public void test(User user) {
        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());
        System.out.println(user.getContactInfo().getTel());
        System.out.println(user.getContactInfo().getAddress());
    }
    <form action="saysth.do" method="post">
    <input name="firstName" value="张" /><br>
    <input name="lastName" value="三" /><br>
    <input name="contactInfo.tel" value="13809908909" /><br>
    <input name="contactInfo.address" value="北京海淀" /><br>
    <input type="submit" value="Save" />
    </form>

    2.注解方式

      @RequestParam直接标注在方法的变量名上

       参数有以下三个:

        • value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
        • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
        • defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。

     使用@CookieValue绑定请求中的Cookie值
      @CookieValue的参数和@RequestParam一样

     使用@RequestHeader绑定请求报文头的属性值

    @RequestMapping(value="/method3")  
        public String method3(  
                @RequestHeader("Accept-Encoding") String encoding,  
                @RequestHeader("Keep-Alive") long keepAlive){  
            return "methodSignature";  
        }

      使用@PathVariabl获取路径中传递参数

    @RequestMapping(value="/users/{userId}/topics/{topicId}")
    public ModelAndView helloWorld(
                  @PathVariable String userId, 
                  @PathVariable Long topicId) {  
            System.out.println(id);  
            System.out.println(str);  
            return new ModelAndView( " /helloWorld " );  
    }  

      如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通 过@PathVariable注解的同名参数上,即入参后userId=123、    topicId=456。代码在 PathVariableTypeController中。

     

  • 相关阅读:
    illegal line end in String Iiteral错误
    mavem的tomcat插件热加载
    解决IntelliJ IDEA启动缓慢
    进行JDBC连接时增加以下代码:
    基于Reflect将List泛型数据源转换为Json字符串
    数据库还原至指定时间节点
    EF关系配置之N:N关系
    EF关系配置之1:N
    EF+Lambda查询性能测试
    EntityFramework基础框架搭建
  • 原文地址:https://www.cnblogs.com/liuyk-code/p/7301389.html
Copyright © 2011-2022 走看看