springMVC初级篇

1. 完成web.xml配置(不会的请参考springMVC入门篇)

2. 使用Controller完成前后端参数传递

    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的请求参数名保持一致,那么无须任何注解就可以获取参数。但是,如果不一致是没法获取到的,这样的方式允许参数为空。

当参数名称不一致时使用@RequestParam注解获取参数,将上图中前端那页面的name改成username,再在后端方法参数前面添加@RequestParam注解
注意:一旦添加@RequestParam注解,系统默认该参数不能为空,如果找不到该参数(为空或命名不一致)就会报错,required = false表示可以为空

@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的能力。

   2.2 接收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*******************/  
}  

     前端表单

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

     后端控制器

@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实例。

 

转载于:https://my.oschina.net/u/4134962/blog/3055402

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值