SpringMVC基础系列(三)

电玩女神 2021-09-27 02:33 445阅读 0赞

一、高级参数绑定

1.1、数组类型的参数绑定

需求:
在商品列表页面选中多个商品,然后删除。
需求分析:
功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息。
jsp页面:

  1. <form action="${pageContext.request.contextPath }/queryItem.action" method="post">
  2. 查询条件:
  3. <table width="100%" border=1>
  4. <tr>
  5. <td>商品id<input type="text" name="item.id" /></td>
  6. <td>商品名称<input type="text" name="item.name" /></td>
  7. <td><input type="submit" value="查询"/></td>
  8. </tr>
  9. </table>
  10. 商品列表:
  11. <table width="100%" border=1>
  12. <tr>
  13. <td>选择</td>
  14. <td>商品名称</td>
  15. <td>商品价格</td>
  16. <td>生产日期</td>
  17. <td>商品描述</td>
  18. <td>操作</td>
  19. </tr>
  20. <c:forEach items="${itemList }" var="item">
  21. <tr>
  22. <td><input type="checkbox" name="ids" value="${item.id}"/></td>
  23. <td>${item.name }</td>
  24. <td>${item.price }</td>
  25. <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
  26. <td>${item.detail }</td>
  27. <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
  28. </tr>
  29. </c:forEach>
  30. </table>
  31. </form>

Controller:

  1. //删除多个
  2. @RequestMapping(value = "/deletes.action")
  3. public ModelAndView deletes(Integer[] ids){
  4. ModelAndView mav = new ModelAndView();
  5. mav.setViewName("success");
  6. return mav;
  7. }

测试的话,仿真看下数据是否传过来了。

1.2、list类型的参数绑定

需求:
实现商品数据的批量修改。
需求分析:
1、在商品列表页面中可以对商品信息进行修改。
2、可以批量提交修改后的商品数据。
定义pojo:
List中存放对象,并将定义的List放在包装类QueryVo中:

  1. public class QueryVo {
  2. //商品
  3. private Items items;
  4. Integer[] ids;
  5. private List<Items> itemsList;
  6. public List<Items> getItemsList() {
  7. return itemsList;
  8. }
  9. public void setItemsList(List<Items> itemsList) {
  10. this.itemsList = itemsList;
  11. }
  12. public Integer[] getIds() {
  13. return ids;
  14. }
  15. public void setIds(Integer[] ids) {
  16. this.ids = ids;
  17. }
  18. public Items getItems() {
  19. return items;
  20. }
  21. public void setItems(Items items) {
  22. this.items = items;
  23. }
  24. }

定义Controller:

  1. //修改
  2. @RequestMapping(value = "/updates.action",method = {RequestMethod.POST,RequestMethod.GET})
  3. public ModelAndView updates(QueryVo vo){
  4. ModelAndView mav = new ModelAndView();
  5. mav.setViewName("success");
  6. return mav;
  7. }

Jsp:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>查询商品列表</title>
  9. </head>
  10. <body>
  11. <form action="${pageContext.request.contextPath }/item/queryitem.action" method="post">
  12. 查询条件:
  13. <table width="100%" border=1>
  14. <tr>
  15. <td><input type="submit" value="查询"/></td>
  16. </tr>
  17. </table>
  18. </form>
  19. 商品列表:
  20. <%-- <form action="${pageContext.request.contextPath }/deletes.action" method="post"> --%>
  21. <form action="${pageContext.request.contextPath }/updates.action" method="post">
  22. <table width="100%" border=1>
  23. <tr>
  24. <td><input type="checkbox" name="ids" value=""></td>
  25. <td>商品名称</td>
  26. <td>商品价格</td>
  27. <td>生产日期</td>
  28. <td>商品描述</td>
  29. <td>操作</td>
  30. </tr>
  31. <c:forEach items="${itemList }" var="item" varStatus="s">
  32. <tr>
  33. <td><input type="checkbox" name="ids" value="${item.id }"></td>
  34. <td><input type="text" name="itemsList[${s.index}].name" value="${item.name }"></td>
  35. <td><input type="text" name="itemsList[${s.index }].price" value="${item.price }"></td>
  36. <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
  37. <td>${item.detail }</td>
  38. <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
  39. </tr>
  40. </c:forEach>
  41. </table>
  42. <input type="submit" value="删除">
  43. <input type="submit" value="修改">
  44. </form>
  45. </body>
  46. </html>

测试的话,仿真看下数据是否传过来了。

二、Controller方法返回值

2.1、返回void

在Controller方法形参上可以定义request和response,使用request或response指定响应结果:
使用request转发页面:

  1. request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

可以通过response页面重定向:

  1. response.sendRedirect("/springmvc-web2/itemEdit.action");

可以通过response指定响应结果,例如响应json数据如下:

  1. response.getWriter().print("{\"abc\":123}");

2.2、返回字符串

逻辑视图名:
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

  1. //指定逻辑视图名,经过视图解析器解析为jsp物理路径:
  2. //WEB-INF/jsp/itemList.jsp
  3. return "itemList";

Redirect重定向:
Contrller方法返回字符串可以重定向到一个url地址:

  1. return "redirect:/itemEdit.action?itemId=" + item.getId();

forward转发:
Controller方法执行后继续执行另一个Controller方法:

  1. //结果转发到editItem.action,request可以带过去
  2. return "forward: /itemEdit.action";

三、上传图片

3.1、配置虚拟目录

  1. tomcat上配置图片虚拟目录,在tomcatconf/server.xml中添加:
  2. <Context docBase="D:\develop\upload\temp" path="/pic" reloadable="false"/>
  3. 访问http://localhost:8080/pic即可访问D:\develop\upload\temp下的图片。

3.2、配置上传解析器

在springmvc.xml中配置文件上传解析器:

  1. <!-- 文件上传,id必须设置为multipartResolver -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!-- 设置文件上传大小 -->
  4. <property name="maxUploadSize" value="5000000" />
  5. </bean>

3.3、jsp页面

  1. <!-- 上传图片是需要指定属性 enctype="multipart/form-data" -->
  2. <!-- <form id="itemForm" action="" method="post" enctype="multipart/form-data"> -->
  3. <form id="itemForm" action="${pageContext.request.contextPath }/updateitem.action" method="post" enctype="multipart/form-data">
  4. <tr>
  5. <td>商品图片</td>
  6. <td>
  7. <c:if test="${item.pic !=null}">
  8. <img src="/pic/${item.pic}" width=100 height=100/>
  9. <br/>
  10. </c:if>
  11. <input type="file" name="pictureFile"/>
  12. </td>
  13. </tr>

3.4、Controller

  1. //提交修改页面 入参 为 Items对象
  2. @RequestMapping(value = "/updateitem.action")
  3. public String updateitem(QueryVo vo,MultipartFile pictureFile) throws Exception{
  4. //保存图片到
  5. String name = UUID.randomUUID().toString().replaceAll("-", "");
  6. //jpg
  7. String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
  8. pictureFile.transferTo(new File("D:\\upload\\" + name + "." + ext));
  9. vo.getItems().setPic(name + "." + ext);
  10. //修改
  11. itemService.updateItemsById(vo.getItems());
  12. return "redirect:/itemEdit.action?id=" + vo.getItems().getId();
  13. }

四、JSON数据交互

4.1、@RequestBody

作用:
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
使用POST请求,在请求体里面加入json数据。
现在的请求参数:

  1. {
  2. "id": 1,
  3. "name": "测试商品",
  4. "price": 99.9,
  5. "detail": "测试商品描述",
  6. "pic": "123456.jpg" }

本例子应用:
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象进行绑定。
ItemController编写:

  1. @RequestMapping("/jsom.action")
  2. public @ResponseBody Item testJson(@RequestBody Item item) {
  3. return item;
  4. }

配置json转换器:
如果不使用注解驱动,就需要给处理器适配器配置json转换器。在springmvc.xml配置文件中,给处理器适配器加入json转换器:

  1. !--处理器适配器 -->
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  3. <property name="messageConverters">
  4. <list>
  5. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
  6. </list>
  7. </property>
  8. </bean>

jsp关键代码:

  1. $(function(){
  2. var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
  3. $.ajax({
  4. url : "${pageContext.request.contextPath }/json.action",
  5. data : params,
  6. contentType : "application/json;charset=UTF-8",//发送数据的格式
  7. type : "post",
  8. dataType : "json",//回调
  9. success : function(data){
  10. alert(data.name);
  11. }
  12. });
  13. });

4.2、@ResponseBody

作用:
@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。

五、RestFul风格开发

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。分别对应 添加、 删除、修改、查询。
需求:
RESTful方式实现商品信息查询,返回json数据
从URL上获取参数:
使用RESTful风格开发的接口,根据id查询商品,接口地址是:http://127.0.0.1/item/1
我们需要从url上获取商品id,步骤如下:
(1)使用注解@RequestMapping(“item/{id}”)声明请求的url。{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
(2)使用(@PathVariable() Integer id)获取url上的数据

  1. /** * 使用RESTful风格开发接口,实现根据id查询商品 * * @param id * @return */
  2. @RequestMapping("item/{id}")
  3. @ResponseBody
  4. public Item queryItemById(@PathVariable() Integer id) {
  5. Item item = this.itemService.queryItemById(id);
  6. return item;
  7. }

如果@RequestMapping中表示为”item/{id}”,id和形参名称一致,@PathVariable不用指定名称。如果不一致,例如”item/{ItemId}”则需要指定名称@PathVariable(“itemId”)。
注意两个区别:
(1)@PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
(2)如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。如果不加,就走视图解析器,返回页面。

转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916
总结整理不容易,如果觉得本文对您有帮助,请点击顶支持一下,您的支持是我写作最大的动力,谢谢。
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读