SpringMVC快速入门(5)高级参数的绑定,@RequestMapping注解的用法,Controller方法返回值,SpringMVC当中的异常处理

SpringMVC快速入门(1)SpringMVC介绍、SpringMVC入门创建工程,SpringMVC执行流程
SpringMVC快速入门(2)商品列表的加载
SpringMVC快速入门(3)默认组件加载
SpringMVC快速入门(4)SpringMVC整合Mybatis,SpringMVC参数绑定
SpringMVC快速入门(5)高级参数的绑定,@RequestMapping注解的用法,Controller方法返回值,SpringMVC当中的异常处理
SpringMVC快速入门(6)图片上传,配置虚拟目录,文件上传
SpringMVC快速入门(7)JSON数据交互,RESTful支持(直接通过id访问对应的页面)
SpringMVC快速入门(8)拦截器,拦截器案例应用,登录拦截器

一、高级参数的绑定

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
在这里插入图片描述
在这里插入图片描述

SpringMVC快速入门(1)SpringMVC介绍、SpringMVC入门创建工程,SpringMVC执行流程
SpringMVC快速入门(2)商品列表的加载
SpringMVC快速入门(3)默认组件加载
SpringMVC快速入门(4)SpringMVC整合Mybatis,SpringMVC参数绑定
SpringMVC快速入门(5)高级参数的绑定,@RequestMapping注解的用法,Controller方法返回值,SpringMVC当中的异常处理
SpringMVC快速入门(6)图片上传,配置虚拟目录,文件上传
SpringMVC快速入门(7)JSON数据交互,RESTful支持(直接通过id访问对应的页面)
SpringMVC快速入门(8)拦截器,拦截器案例应用,登录拦截器
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值