1. 完成web.xml配置(不会的请参考springMVC入门篇)javascript
2. 使用Controller完成先后端参数传递html
2.1 接收普通请求参数前端
/** * @RequestMapping 能够标注在类上或者方法上:指定URI。若标注在类上,则访问该类下面的每一个方法路径都会加上该前缀,如访问list方法的完整URL是book/list.do */ //注解@Controller表示它是一个控制器 @Controller @RequestMapping("book") public class FirstController { //映射URI请求为/list.do @RequestMapping("/list.do") public ModelAndView list(String name) { var ret = new ModelAndView();//模型和视图 System.out.println(name); ret.addObject("name", "这是从前端发送过来的name");//添加模型到视图上 ret.setViewName("list");//添加视图名称(即本身定义的html或jsp页面的名称,注意会去加上配置的视图解析器前缀) return ret;//返回模型和视图,它会自动去找视图页面 } }
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%> <html> <head> <title></title> </head> <body> <a href="/book/list.do?name=peppa">这是第一个springMVC测试</a> </body> </html>
Spring MVC比较智能,若是传递过来的参数名称和Http的请求参数名保持一致,那么无须任何注解就能够获取参数。可是,若是不一致是无法获取到的,这样的方式容许参数为空。java
当参数名称不一致时使用@RequestParam注解获取参数,将上图中前端那页面的name改为username,再在后端方法参数前面添加@RequestParam注解
注意:一旦添加@RequestParam注解,系统默认该参数不能为空,若是找不到该参数(为空或命名不一致)就会报错,required = false表示能够为空web
@Controller @RequestMapping("book") public class FirstController { @RequestMapping("/list.do") public ModelAndView list(@RequestAttribute(name = "username",required = false) String name) { var ret = new ModelAndView(); System.out.println(name); ret.addObject("name", "这是从前端发送过来的name"); ret.setViewName("list"); return ret; } }
固然这是比较简单,可是可以知足大部分简单的表单需求。在参数不少的状况下,好比新增一个用户可能须要多达十几个字段,再用这样的方式,方法的参数就会很是多,这个时候应该考虑使用一个pojo来管理这些参数。在没有任何注解的状况下,spring mvc也有映射pojo的能力。spring
2.2 接收pojo实例 json
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*******************/ }
前端表单数组
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><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>
后端控制器mvc
@RequestMapping("/save.do") public String save1(Book book) { System.out.println(book.getTitle()); System.out.println(book.getAuthor()); return "list"; }
pojo的属性要和http请求参数名保持一致,即便没有任何注解它们也能有效传递参数。
注意:若是pojo中包含其余pojo时,如
public class Book { private Integer id; private String author; private String title; private Float price; private String publisher; private User user;//pojo类user包含字段name和password /*******setter and getter********/ }
前端页面须要改写为
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><br/> author:<input type="text" name="author"><br/> price:<input type="text" name="price"><br/> publisher:<input type="text" name="publisher"><br/> username:<input type="text" name="user.name"><br/> password:<input type="password" name="user.password"><br/> <input type="submit"> </form>
2.3 list、map等特殊参数传递
假如pojo类中包含list或map等引用类型时,如
public class Book { private Integer id; private String author; private String title; private Float price; private String publisher; private List<User> list; private Map<String,User> map; /*******setter and getter********/ }
前端页面须要改写
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><br/> author:<input type="text" name="author"><br/> price:<input type="text" name="price"><br/> publisher:<input type="text" name="publisher"><br/> username:<input type="text" name="list[0].name"><br/> password:<input type="password" name="list[0].password"><br/> username:<input type="text" name="map['key'].name"><br/> password:<input type="password" name="map['key'].password"><br/> <input type="submit"> </form>
命名规则:list[index].pojo属性名 map["key值"].pojo属性名
2.4 使用URL传递参数
一些网站使用URL的形式传递参数,符合RESTful风格(参考转载的RESTful博客),好比获取一个图书信息:/book/1,其中1就是一个参数,它表明的是图书编号,只是它在url中传递,对此SpringMVC也提供了良好的支持。
如今指定一个方法,它将只支持HTTP的GET请求,经过URL:/book/1来获取图书信息而且打印出json数据。
@GetMapping("/book/{id}")//等价于注解@RequestMapping(value ="/book/{id}",method=RequestMethod.GET) //{id}表明接收一个参数,@PathVariable(name = "id")表示从url的请求地址中获取参数 public Book findById(@PathVariable(name = "id") Integer id) { return service.findById(id); }
这样就能够经过@PathVariable注解获取各种URL参数。@PathVariable容许对应的参数为空。
2.5 传递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接受参数:@RequestBody会将参数封装成key=value键值对进行参数传递,这样Spring Mvc把传递过来的json格式字符串参数转为pojo,就能够接收对应json的参数了。
@RequestMapping("/findBooks") public String findBooks(@RequestBody BookParams bookParams){ var booklist = service.findBooks(bookParams); return ""; }
2.6 接收列表数据和表单序列化
在后台管理系统中,若是要一次性删除多个图书信息,那么确定将一个图书编号的数组传递给后台,或须要同时新增多本图书。这都须要用到java的集合或者数组去保存对应的参数
$(document).ready(function(){ //删除图书数组 var ids = [1,3,5,10]; $.post({ url: '/book/removeBooks', data: ids, success: function(result){} }); }
@RequestMapping("/removeBooks") public String removeBooks(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){ System.out.println(book); return "list"; }
这样就可以获取序列化表单后的参数了,因为表单域和pojo类属性一一对应,因此将参数封装成一个pojo实例。