一、高级参数的绑定
1、创建工程,复制之前的工程作为新的工程使用
设置通过根目录访问
2、修改itemList.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 }/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input type="text" name="item.name"></td>
<td>商品价格:<input type="text" name="item.price"></td>
</tr>
<tr>
<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>
</body>
</html>
3、修改ItemController.java当中的queryItem方法的参数
@RequestMapping("queryItem")//绑定请求地址
public String queryItem(QueryVo vo,Integer[] ids, Model model){
if(vo.getItem() != null){
System.out.println(vo.getItem().toString());
}
//模拟搜索商品
List<Item> itemList = itemService.getItemList();
model.addAttribute("itemList", itemList);
return "itemList";
}
4、运行并测试
http://localhost:8080/itemList.action
选择1和3提交
点击查询后台显示内容
5、修改QueryVo类,添加数组列表
package com.itzheng.springmvc.pojo;
/**
* 包装的pojo传递
* @author Steven
*/
public class QueryVo {
private Item item;
private Integer[] ids;
public Integer[] getIds() {
return ids;
}
public void setIds(Integer[] ids) {
this.ids = ids;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
6、运行并测试项目
在QueryVo当中的
http://localhost:8080/itemList.action
选择1和3提交
点击查询后台显示内容
两种QueryVo当中的Integer[] ids和方法参数Integer[] ids当中的内容都有值,无论是类当中变量和方法的参数只要和参数的名称所对应上,就可以绑定数据
二、完成编辑页面直接提交并显示数据
1、List参数绑定
(1)修改itemList.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 }/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input type="text" name="item.name"></td>
<td>商品价格:<input type="text" name="item.price"></td>
</tr>
<tr>
<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" varStatus="status" >
<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>
--%>
<input type="hidden" name="items[${ status.index }].id" value="${item.id}" />
<td><input type="text" name="items[${ status.index }].name" value="${item.name }" ></td>
<td><input type="text" name="items[${ status.index }].price" value="${item.price }" ></td>
<td>
<input type="text" name="items[${ status.index }].createtime" value='<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>' >
</td>
<td><input type="text" name="items[${ status.index }].detail" value="${item.detail }" ></td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
(2)修改QueryVo类
package com.itzheng.springmvc.pojo;
import java.util.List;
/**
* 包装的pojo传递
* @author Steven
*/
public class QueryVo {
private Item item;
private Integer[] ids;
private List<Item> items;
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
public Integer[] getIds() {
return ids;
}
public void setIds(Integer[] ids) {
this.ids = ids;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
(3)访问页面http://localhost:8080/queryItem.action
(4)测试项目
a、修改ItemController.java
@RequestMapping("queryItem")//绑定请求地址
public String queryItem(QueryVo vo,Integer[] ids, Model model){
if(vo.getItem() != null){
System.out.println(vo.getItem().toString());
}
if(ids != null && ids.length > 0) {
for (Integer id : ids) {
System.out.println(id);
}
}
if(vo.getItem() != null && vo.getItems().size() > 0) {
for (Item item : vo.getItems()) {
System.out.println(item);
}
}
//模拟搜索商品
List<Item> itemList = itemService.getItemList();
model.addAttribute("itemList", itemList);
return "itemList";
}
b、访问页面测试并提交参数
访问页面http://localhost:8080/queryItem.action
修改内容并提交表单
页面报错
修改jsp页面内容
重新提交页面
三、@RequestMapping注解的用法
1、配置多个请求地址
(1)修改ItemController当中的itemList方法
@RequestMapping(value = {"itemList","itemList2"})
public ModelAndView itemList() {
ModelAndView mav = new ModelAndView();
List<Item> itemList = itemService.getItemList();
mav.addObject("itemList", itemList);
// mav.setViewName("/WEB-INF/jsp/itemList.jsp");
mav.setViewName("itemList");
return mav;
}
(2)运行并测试
http://localhost:8080/itemList.action
使用绑定的第二个访问http://localhost:8080/itemList2.action
2、@RequestMapping加在类的上面:分目录管理
@Controller
@RequestMapping("item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping(value = {"itemList","itemList2"})
public ModelAndView itemList() {
ModelAndView mav = new ModelAndView();
List<Item> itemList = itemService.getItemList();
mav.addObject("itemList", itemList);
// mav.setViewName("/WEB-INF/jsp/itemList.jsp");
mav.setViewName("itemList");
return mav;
}
运行并访问项目
新的访问地址:http://localhost:8080/item/itemList.action
演示完注释一下
3、设置固定的提交请求方式
(1)设置为只接收post请求
修改ItemController.java当中的updateItem方法
@RequestMapping(value="updateItem",method = RequestMethod.POST)
public String updateItem(Item item,Model model){
itemService.updateItem(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品信息成功");
return "itemEdit";
}
(2)设置为接收post和get请求
修改ItemController.java当中的updateItem方法
/**
* 修改商品
* 演示pojo参数绑定
* @param item
* @return
*/
@RequestMapping(value="updateItem",method = {RequestMethod.POST,RequestMethod.GET})
public String updateItem(Item item,Model model){
itemService.updateItem(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品信息成功");
return "itemEdit";
}
(3)在Tomcat的server.xml文件当中配置get请求的编码格式
四、Controller方法返回值
1、返回void
(1)创建新页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>温馨提示</title>
</head>
<body>
${ msg }
</body>
</html>
(2)在ItemController当中创建queryVoid方法
a、request响应用户请求
@RequestMapping("queryVoid")
public void queryVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
request.setAttribute("msg", "这个是request响应的消息");
request.getRequestDispatcher("/WEB-INF/jsp/msg.jsp").forward(request, response);
}
运行并测试
http://localhost:8080/queryVoid.action
b、response响应用户请求
@RequestMapping("queryVoid")
public void queryVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
//request响应用户请求
/*
* request.setAttribute("msg", "这个是request响应的消息");
* request.getRequestDispatcher("/WEB-INF/jsp/msg.jsp").forward(request,
* response);
*/
//response的响应用户请求
response.sendRedirect("/itemList.action");
}
运行并测试http://localhost:8080/itemList.action
c、response打印消息
@RequestMapping("queryVoid")
public void queryVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
//request响应用户请求
/*
* request.setAttribute("msg", "这个是request响应的消息");
* request.getRequestDispatcher("/WEB-INF/jsp/msg.jsp").forward(request,response);
*/
//response的响应用户请求
//response.sendRedirect("/itemList.action");
PrintWriter printwriter = response.getWriter();
printwriter.println("response");
}
http://localhost:8080/queryVoid.action
2、返回String
(一)SpringMVC请求转发
(1)修改ItemController类当中updateItem方法:
/**
* 修改商品
* 演示pojo参数绑定
* @param item
* @return
*/
@RequestMapping(value="updateItem",method = {RequestMethod.POST,RequestMethod.GET})
public String updateItem(Item item,Model model){
itemService.updateItem(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品信息成功");
//return "itemEdit";
return "forward:itemEdit.action";
}
(2)修改itemList.jsp页面
点击提交修改信息
(二) SpringMVC重定向
(1)修改ItemController,设置对应更新方法的跳转到列表页面,当中的updateItem方法
/**
* 修改商品
* 演示pojo参数绑定
* @param item
* @return
*/
@RequestMapping(value="updateItem",method = {RequestMethod.POST,RequestMethod.GET})
public String updateItem(Item item,Model model){
itemService.updateItem(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品信息成功");
//return "itemEdit";
//return "forward:itemEdit.action";
return "redirect:itemList.action";
}
(2)运行测试并访问:http://localhost:8080/itemEdit.action
跳转成功
(三)方法返回值乱码问题
请求乱码问题{
提交的问题{
post乱码:过滤器解决;
get乱码:tomcat当中配置URIEncoding="utf-8"
}
响应乱码{
获取getWriter之前:response.setCharacterEncoding("utf-8");
}
}
五、SpringMVC当中的异常处理
1、异常演示:运行时异常
(1)在ItemController当中queryVoid方法当中设置一个异常
int i = 1 / 0;
(2)运行项目测试该方法
http://localhost:8080/queryVoid.action
抛出异常
2、处理异常
思想:做一个全局异常处理器,处理所有没有处理过的运行时异常用于更友好的提示用户
(1)创建全局异常处理器
创建一个CustomerExecptionResolver类实现HandlerExceptionResolver接口
package com.itzheng.springmvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
/*
* 全局异常处理器
*/
public class CustomerExecptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,
Exception ex) {
ModelAndView mav = new ModelAndView();
mav.addObject("msg","系统发生异常,请联系管理员!");
mav.setViewName("msg");
return mav;
}
}
(2)配置全局异常处理器
<!-- 配置全局异常处理器 -->
<bean class="com.itzheng.springmvc.CustomerExecptionResolver" />
运行项目测试该方法
http://localhost:8080/queryVoid.action
3、更智能,更友好的提示,解决方案
(1)新建自定义异常类:MyException
package com.itzheng.springmvc.exception;
/*
* 自定义异常
*/
public class MyException extends Exception {
private String msg;
public MyException() {
super();
}
public MyException(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
创建exception包并将创建的异常,并将上诉创建好的两个异常放入到exception包当中
修改配置全局异常处理器
(2)修改异常处理器,加上异常:
a、CustomerExecptionResolver
package com.itzheng.springmvc.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
/*
* 全局异常处理器
*/
public class CustomerExecptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,
Exception ex) {
String result = "系统发生异常,请联系管理员!";
//instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
//自定义异常处理
if(ex instanceof MyException) {//判断当前发生的异常是否是MyException类对象的实例
result = ((MyException)ex).getMsg();
}
ModelAndView mav = new ModelAndView();
mav.addObject("msg",result);
mav.setViewName("msg");
return mav;
}
}
b、修改ItemController当中的queryVoid方法
@RequestMapping("queryVoid")
public void queryVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
//request响应用户请求
/*
* request.setAttribute("msg", "这个是request响应的消息");
* request.getRequestDispatcher("/WEB-INF/jsp/msg.jsp").forward(request,
* response);
*/
//response的响应用户请求
//查询根据id查询商品信息,搜索不到商品
if(true) {
throw new MyException("你查找的商品不存在请确认信息");
}
int i = 1 / 0;
//response.sendRedirect("/itemList.action");
response.setCharacterEncoding("utf-8");
PrintWriter printwriter = response.getWriter();
printwriter.println("这是response的请求");
}
(3)测试访问queryVoid.action
http://localhost:8080/queryVoid.action