SpringMVC基础系列(三)

一、高级参数绑定

1.1、数组类型的参数绑定

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

<form action="${pageContext.request.contextPath }/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品id<input type="text" name="item.id" /></td>
<td>商品名称<input type="text" name="item.name" /></td>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
    <td>选择</td>
    <td>商品名称</td>
    <td>商品价格</td>
    <td>生产日期</td>
    <td>商品描述</td>
    <td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
    <td><input type="checkbox" name="ids" value="${item.id}"/></td>
    <td>${item.name }</td>
    <td>${item.price }</td>
    <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
    <td>${item.detail }</td>

    <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

</table>
</form>

Controller:

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

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

1.2、list类型的参数绑定

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

public class QueryVo {
    //商品
    private Items items;

    Integer[] ids;

    private List<Items> itemsList;

    public List<Items> getItemsList() {
        return itemsList;
    }
    public void setItemsList(List<Items> itemsList) {
        this.itemsList = itemsList;
    }
    public Integer[] getIds() {
        return ids;
    }
    public void setIds(Integer[] ids) {
        this.ids = ids;
    }
    public Items getItems() {
        return items;
    }
    public void setItems(Items items) {
        this.items = items;
    }
}

定义Controller:

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

Jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
</head>
<body> 
<form action="${pageContext.request.contextPath }/item/queryitem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
</form>
商品列表:
<%-- <form action="${pageContext.request.contextPath }/deletes.action" method="post"> --%>
<form action="${pageContext.request.contextPath }/updates.action" method="post">
<table width="100%" border=1>
<tr>
    <td><input type="checkbox" name="ids" value=""></td>
    <td>商品名称</td>
    <td>商品价格</td>
    <td>生产日期</td>
    <td>商品描述</td>
    <td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
    <td><input type="checkbox" name="ids" value="${item.id }"></td>
    <td><input type="text" name="itemsList[${s.index}].name" value="${item.name }"></td>
    <td><input type="text" name="itemsList[${s.index }].price" value="${item.price }"></td>
    <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
    <td>${item.detail }</td>

    <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>
</table>
<input type="submit"  value="删除">
<input type="submit"  value="修改">
</form>
</body>
</html>

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

二、Controller方法返回值

2.1、返回void

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

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

可以通过response页面重定向:

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

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

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

2.2、返回字符串

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

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

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

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

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

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

三、上传图片

3.1、配置虚拟目录

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

3.2、配置上传解析器

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

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

3.3、jsp页面

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

3.4、Controller

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

四、JSON数据交互

4.1、@RequestBody

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

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

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

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

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

!--处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
    <list>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    </list>
    </property>
</bean>

jsp关键代码:

$(function(){
    var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';

    $.ajax({
        url : "${pageContext.request.contextPath }/json.action",
        data : params,
        contentType : "application/json;charset=UTF-8",//发送数据的格式
        type : "post",
        dataType : "json",//回调
        success : function(data){
            alert(data.name);
        }   
    });
});

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上的数据

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_41835916/article/details/80922291
今日推荐