栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring MVC组件开发-控制器接收各类请求参数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC组件开发-控制器接收各类请求参数

使用控制器接收参数往往是Spring MVC开发业务逻辑的第一步。Spring提供了诸多的注解来解析参数,目的在于把控制器从复杂的Servlet API中剥离,这样就可以在非web容器环境中重用控制器,也方便测试人员对其进行有效测试。

1 接收普通请求参数

Spring MVC比较智能,如果传递过来的参数名称和Http的请求参数名保持一致,那么无须任何注解就可以获取参数。

@RequestMapping("/save.do")  
public String save(String title,String author,float price,String publisher) {  
    System.out.println(title);  
    System.out.println(author);  
    System.out.println(price);  
    System.out.println(publisher);  
    return "list";  
}  

图书表单:

  
  
  
  
Insert title here  
  
  
      
        title:
           author:
           price:
           publisher:
                          

通过参数名称和HTTP请求参数的名称保持一致来获取参数,如果不一致是没法获取到的,这样的方式允许参数为空。

      当然这是比较简单,但是能够满足大部分简单的表单需求。在参数很多的情况下,比如新增一个用户可能需要多达十几个字段,再用这样的方式,方法的参数就会非常多,这个时候应该考虑使用一个pojo来管理这些参数。在没有任何注解的情况下,spring mvc也有映射pojo的能力。新建一个图书pojo类。

package edu.uestc.avatar.domain;  
  
public class Book {  
    private Integer id;  
    private String title;  
    private String author;  
    private float price;  
    private String publisher;  
  
          
}  

        这个pojo的属性和HTTP参数一一对应了,在控制器中新增一个方法来通过这个pojo获取http请求参数。

@RequestMapping("/save1.do")  
public String save1(Book book) {  
    System.out.println(book.getTitle());  
    System.out.println(book.getAuthor());  
    return "list";  
}  

        注意:pojo的属性要和http请求参数名保持一致。即使没有任何注解它们也能有效传递参数,但有时候前端的参数命名规则和后台的不一样,Spring mvc也提供了诸多注解来实现各类的转换规则。

2 使用@RequestParam注解获取参数

        把表单中图书名称参数名title改为book_name,那么在没有任何注解的情况下,获取参数就会失败,好在SpringMVC提供@RequestParam来解决这个问题

@RequestMapping("/save.do")  
public String save(@RequestParam(name = "book_name") String title,String author,float price,String publisher) {  
    System.out.println(title);  
    System.out.println(author);  
    System.out.println(price);  
    System.out.println(publisher);  
    return "list";  
}  

      注意:如果参数被@RequestParam注解,那么默认的情况下该参数不能为空,如果为空则系统会抛出异常。如果希望允许它为空,那么可以指定required为false。

@RequestParam(name = "book_name",required = false) String title

 3 使用URL传递参数

     一些网站使用URL的形式传递参数,符合RESTful风格(RESTful参考文章后面另两篇博客连接),比如获取一个图书信息:/book/1,其中1就是一个参数,它代表的是图书编号,只是它在url中传递,对此SpringMVC也提供了良好的支持.现在指定一个方法,它将只支持HTTP的GET请求,通过URL:/book/1来获取图书信息并且打印出json数据。

//@RequestMapping(value ="/book/{id}",method=RequestMethod.GET)  
//{id}代表接收一个参数,@PathVariable(name = "id")表示从url的请求地址中获取参数  
@GetMapping("/book/{id}")  
//@ResponseBody  
public Book findById(@PathVariable(name = "id") Integer id) {  
    return service.findById(id);  
}  

 这样就可以通过@PathVariable注解获取各类参数。@PathVariable允许对应的参数为空。

4 传递JSON参数

         有时候参数的传递需要更多的参数,比如查询图书可以根据多种条件进行查询(名称,作者,价格,出版社信息等)以及分页,分页参数有开始页和每页显示记录数(限制返回大小的limit),那么它涉及到多个参数,封装在BookParams类进行传递,如下代码所示

package com.wise.tiger.pojo;  
  
public class BookParams{  
    private String title;  
    private String author;  
    private String publisher;  
    private float price;  
    private int pageIndex;  
    private int pageSize;  
      
}  

        客户端用JavaScript代码来模拟参数传递,往表单插入一段JavaScript代码:

$(document).ready(function(){  
    //json参数和BookParams一一对应  
    var data = {//图书查询参数  
      title: '天龙八部',  
      author: '金庸',  
      price: 500,  
      publisher: '三联出版社',  
      pageIndex: 1,  
      pageSize: 20  
    };  
    $.post({  
        url: '/book/findBooks',  
        contentType: 'application/json',//告诉传递参数类型为json,不能缺少  
        data: JSON.stringify(data),//将json转为字符串传递  
        success: function(result){}  
    });  
});  

        后台就可以使用Spring MVC提供的注解@RequestBody接受参数:

@RequestMapping("/findBooks")  
public String findBooks(@RequestBody BookParams bookParams){  
     var booklist = service.findBooks(bookParams);  
     return "";  
}  

 这样Spring Mvc把传递过来的json格式字符串参数转为pojo,就可以接收对应json的参数了。

5 接收列表数据和表单序列化

      在后台管理系统中,如果要一次性删除多个图书信息,那么肯定将一个图书编号的数组传递给后台,或需要同时新增多本图书。这都需要用到java的集合或者数组去保存对应的参数:

$(document).ready(function(){  
     //删除图书数组  
    var ids = [1,3,5,10];  
    $.post({  
       url: '/book/removeBooks',  
       contentType: 'application/json', //告诉传递参数类型为json,不能缺少
       data: JSON.stringify(ids),//将json转为字符串传递
       success: function(result){} 
    }); 
} 

 后台代码

@RequestMapping("/removeBooks")  
//将json数组数据,转换为对应的Java集合类型。把List数组转化为数组也是可行的
public String removeBooks(@RequestBody Integer[] ids){  
     var booklist = service.removeBooks(ids);  
     return "";  
}  

        通过表单序列化也可以将表单数据转换为字符串传递给后台(因为一些隐藏表单需要一定的计算),我们可以通过序列化去提交表单:

$.post({  
    url: '/book/commonParam',  
//将form数据序列化,传递给后台,则将数据以title=xxx&author=ooo传递  
    data: $('form').serialize(),  
    success: function(result){}  
});  

        由于序列化参数的规则变为了title=xxx&author=ooo,所以获取参数也是十分容易的。

@RequestMapping("/book/commonParam")  
public String commonParam(Book book){  
   //巴拉巴拉巴拉巴拉~~~~  
}  

         这样就能够获取序列化表单后的参数了,由于表单域和pojo类属性一一对应,所以将参数封装成一个pojo实例。

不推荐的方式:通过原生HttpServletRequest获取参数
@RequestMapping("/book/original")  
public String commonParam(HttpServletRequest request){  
   //这个就和servlet获取参数一致
}  

        处理器可以通过参数直接注入web上下文对象,如request对象等,只是这样的话和Servlet-api耦合在一起,不便于重用和测试,可以在方法内部使用如下方式获取request等web上下文对象。这样spring就完成了送耦合的设计

ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/978804.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号