`
Adan-Chiu
  • 浏览: 21664 次
社区版块
存档分类
最新评论

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

 
阅读更多

控制器接收各类请求参数

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

1.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";
}

      图书表单:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="book/save.do" method="get">
		title:<input type="text" name="title"/><br/>
		author:<input type="text" name="author"/><br/>
		price:<input type="text" name="price"/><br/>
		publisher:<input type="text" name="publisher"/><br/>
		<input type="submit"/>
	</form>
</body>
</html>

 

 

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

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

 

package com.wise.tiger.domain;

public class Book {
	private Integer id;
	private String title;
	private String author;
	private float price;
	private String publisher;

        /**********setter and getter*******************/
}

       这个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也提供了诸多注解来实现各类的转换规则。

 

 

1.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

 1.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允许对应的参数为空。

 

1.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;
    /********************setter and getter**************/
}

    客户端用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的参数了。

 

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

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

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

 后台代码

@RequestMapping("/removeBooks")
//接受数组类型参数必须使用@RequestParam注解
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实例。

 

分享到:
评论
4 楼 Adan-Chiu 2019-06-04  
原生HttpServletReqest方式不推荐,因为这样的话会和servlet发生耦合,spring给我们提供了丰富的注解以及工具类来消除这些耦合,当然使用原生HttpServletReqest的话只需通过参数的形式接收该request对象即可,也可以通过RequestContextHolder获取当前请求对象。其它使用方式同javaweb。
3 楼 Adan-Chiu 2019-06-03  
对的,多谢指出
2 楼 迷茫的眼 2019-06-03  
挺详细的,可以再补充一个用原生HttpServletReqest接收的方式
1 楼 迷茫的眼 2019-06-03  
这里的参数应该是数组或者集合吧
    @RequestMapping("/removeBooks") 
    public String removeBooks(Integer ids){ 
         var booklist = service.removeBooks(ids); 
         return ""; 
    } 

相关推荐

    translation-spring-mvc-4-documentation, Spring MVC 4.2.4 RELEASE 中文文档完整翻译稿.zip

    DispatcherServlet作为整个流程的起点,它是Spring MVC的前端控制器,负责接收HTTP请求,然后根据配置的映射规则将请求分发到相应的处理器。 控制器是处理用户请求并返回相应视图的组件,通常由实现了Controller...

    Spring MVC step-by-step 源码

    它基于Spring框架,提供了模型-视图-控制器(MVC)架构,简化了开发过程。本资源"Spring MVC step-by-step 源码"是针对初学者准备的入门教程,通过实际项目"springapp"来帮助理解Spring MVC的工作原理。 在...

    spring-mvc-test-sample-master.zip_spring mvc_springmvc-test

    1. **DispatcherServlet**:它是Spring MVC的前端控制器,负责接收所有的HTTP请求,并根据配置的映射规则分发到相应的处理器。 2. **Controller**:控制器是业务逻辑和视图层之间的桥梁。开发者可以创建自定义的...

    spring-webmvc-5.0.9 jar包、源码和javadoc

    Spring Web MVC是Spring框架的核心模块之一,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。在Spring 5.0.9这个版本中,它延续了Spring对开发者友好、灵活且高性能的设计原则,为开发人员提供了强大的...

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    Spring Web MVC的注解驱动能力使得控制器的编写更加简洁。比如,@RequestMapping注解可以用来映射URL到特定的方法,@GetMapping和@PostMapping等用于处理HTTP的GET和POST请求。@RequestParam用于获取请求参数,而...

    外文翻译Spring的MVC构架模式-CSDN下载

    - **控制器(Controller)**: 控制器接收HTTP请求,处理用户输入,调用模型进行业务逻辑处理,并将结果传递给视图进行展示。在Spring MVC中,控制器通常由实现了`Controller`接口或注解了`@Controller`的Java类实现...

    spring-mvc-showcase

    Spring MVC 是 Spring 框架的重要组成部分,它为构建基于模型-视图-控制器(MVC)模式的Web应用程序提供了强大的支持。"spring-mvc-showcase"项目是Spring官网提供的一个实战示例,旨在帮助开发者深入理解和运用...

    Spring-MVC-step-by-step.zip_Java MVC spring_Java spring mvc_sp

    Spring MVC是Spring框架的一个模块,主要用于构建模型-视图-控制器(MVC)架构的Web应用。它提供了处理HTTP请求、数据绑定、验证、国际化等功能,简化了Web应用的开发流程。 二、环境搭建 首先,你需要安装Java ...

    spring-webmvc-struts.jar

    1. **DispatcherServlet**:Spring MVC的前端控制器,负责接收HTTP请求,然后根据请求信息找到相应的处理器(Controller)进行处理。 2. **Model-View-Controller**:模型-视图-控制器架构,Spring MVC的核心设计...

    Spring-MVC-step-by-step2.rar

    1. DispatcherServlet:前端控制器,负责接收所有请求,并根据配置分发到相应的处理器。 2. Controller:控制器,处理用户请求,调用业务逻辑,返回ModelAndView对象。 3. HandlerMapping:处理器映射器,根据请求...

    Spring MVC--------我在创智软件的面试

    DispatcherServlet作为前端控制器,负责接收请求并分发到相应的处理器;Controller处理业务逻辑,Model存储数据模型,View负责渲染视图,ViewResolver则解析视图名以决定显示哪个页面。 2. **请求处理流程**: 一...

    spring-mvc-showcase-case1-client

    AngularJS的控制器、服务和指令等概念与Spring MVC的控制器和服务对应,实现了前后端的解耦。 RequireJS在项目中的角色是管理AngularJS模块的加载。在初始化阶段,它会根据配置加载必要的库和应用模块,如AngularJS...

    spring MVC快速入门-深入分析.pdf

    - **数据绑定**:Spring MVC 自动将请求参数绑定到 Controller 方法的参数上。 #### 九、Spring MVC 配置文件组织 - **多配置文件**:可以将不同的配置分开到多个文件中,以提高代码的可读性和可维护性。 #### 十...

    spring mvc-mybatis-lib

    Spring MVC通过DispatcherServlet接收HTTP请求,然后根据请求信息分发到相应的控制器(Controller)。控制器处理业务逻辑后,可以将数据模型传递给视图(View),最后由视图负责呈现用户界面。Spring MVC还支持数据...

    spring-mvc-04-master.zip

    1. DispatcherServlet:作为Spring MVC的前端控制器,负责接收所有请求,并根据配置分发到相应的处理器。 2. HandlerMapping:负责映射请求到对应的处理器(Controller)。 3. HandlerAdapter:处理处理器适配,使得...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    在Spring MVC中,每个请求都会经过DispatcherServlet,这是一个前端控制器,它会根据请求的URL和配置的映射规则将请求分发到合适的处理器。处理器可以是自定义的Controller类,Controller通过方法注解(如@...

    Maven-Spring-Spring-MVC-MyBatis-MySQL

    SSM整合是Java Web开发中常见的一种框架集成方式,它结合了Maven、Spring、Spring MVC和MyBatis四个核心组件,以及MySQL作为后端数据库。这个项目名为"Maven-Spring-Spring-MVC-MyBatis-MySQL",旨在演示如何在实际...

    spring-mvc-documentation-linesh-translation

    - **定义处理方法**: 控制器类中的方法可以通过参数接收请求参数,并通过返回值指定视图名称或视图对象。 #### 异步请求 - **异步请求处理**: 可以通过异步请求处理来改善用户体验,提高服务器响应速度。 #### ...

    spring-mvc-官方中文文档

    3. **HandlerMapping**:该接口负责将请求与处理器(Controller)进行匹配,Spring MVC 提供了多种实现,如基于注解的 HandlerMapping,可以根据 @RequestMapping 注解将 URL 映射到控制器方法。 4. **...

Global site tag (gtag.js) - Google Analytics