SpringMVC_day02
1. 高级参数绑定
1.1 绑定数组
需求:接收要批量删除的商品的id。
Controller方法中可以用Integer[ ]或QueryVo的private Integer[] ids属性接收,此对象属性名要与页面name属性值相同。
controller:
public ModelAndView delItems2(QueryVo vo) {}
jsp: <c:forEach items="${itemList }" var="item">
<tr><td><input type="checkbox" name="ids" value="${item.id}"/></td>...</tr>
</c:forEach>
//页面中选中多个checkbox向controller方法传递ids
1.2 绑定List集合
需求:实现对商品数据的批量修改。
Controller方法中用QueryVo的private List
接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据。
controller: public ModelAndView delItems2(QueryVo vo) {}
jsp的name属性必须是list属性名+下标+元素属性名
jsp:
<c:forEach items="${itemList }" var="item" varStatus="status">
<tr>
<td><input type="checkbox" name="itemList[${status.index }].id" value="${item.id }"/></td>
<td><input type="text" name="itemList[${status.index }].name" value="${item.name }"/></td>
...
</tr>
</c:forEach>
${current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最
varStatus属性常用参数总结下:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
2. @RequestMapping
通过@RequestMapping注解可以定义不同的处理器映射规则。
2.1 URL路径映射
2.1.1 添加到方法上
@RequestMapping(value="item")或@RequestMapping("/item")/可省略
public String delItems(QueryVo vo) {}
value的值是数组,可以将多个URL映射到同一个方法。
@RequestMapping(value={"item1", "item2"})
2.1.2 添加到类上
//在class上添加@RequestMapping(url)指定通用请求前缀,限制此类下的所有方法请求url必须以请求前缀开头
@RequestMapping("/item")
public class ItemsController {}
2.2 请求方法限定
除了可以对url进行设置,还可以限定请求进来的方法。
--限定GET方法
@RequestMapping(value="/updateitem.action",method=RequestMethod.GET)
如果通过POST访问则报错:
HTTP Status 405 - Request method 'POST' not supported
--限定POST方法
@RequestMapping(value="/updateitem.action",method=RequestMethod.POST)
--限定GET和POST方法
@RequestMapping(value="/updateitem.action",method = {RequestMethod.GET,RequestMethod.POST})
不写则默认支持RequestMethod的八种方法
3. Controller方法返回值
3.1 返回ModelAndView
详见SpringMVC_day01
3.2 返回void
在Controller方法形参上可以定义request和response,使用request或response指定响应结果。
--使用request转发页面
request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response);
--使用response重定向页面
response.sendRedirect("/14.2SpringMVC/success.jsp");
--使用response直接显示
response.getWriter().print("hahaha");
3.3 返回字符串
3.3.1 返回逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp路径:/WEB-INF/jsp/itemList.jsp
return "itemList";
3.3.2 redirect重定向
//转发到修改此商品页面
//重定向后地址栏变为重定向的地址,行了新的request和response,所以之前的请求参数都会丢失
return "redirect:/itemEdit.action?id="+item.getId();
3.3.3 forward转发
// 转发后地址栏还是原来的请求地址,没有执行新的request和response,之前的请求参数都存在
return "forward:/itemEdit.action";
3.4 三种返回值对比
1.ModelAndView 带着数据及返回视图路径。不建议使用,因为数据和视图耦合了。
2.String 返回视图路径,model携带数据。推荐使用,解耦,数据和视图分离。
3.void ajax请求,异步请求时使用。
4. 异常处理器
SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
4.1 异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException(如int i=1/0),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
4.2 自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,创建一个自定义系统异常。如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
public class MyException extends Exception {
private String msg;//存放异常信息
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MyException(String msg) {
super();
this.msg = msg;
}
}
4.3 自定义异常处理器
public class CustomHandlerException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
//自定义异常信息
String msg;
//判读异常类型
if(exception instanceof MyException) {
//如果是自定义异常,读取异常信息
msg=((MyException) exception).getMsg();
//msg=exception.getMessage();
}else {
//如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息
Writer out=new StringWriter();
PrintWriter pw=new PrintWriter(out);
exception.printStackTrace(pw);
msg=out.toString();
}
ModelAndView mav=new ModelAndView();
mav.addObject("msg", msg);
mav.setViewName("exception");
return mav;
}
4.4 异常处理器配置
在springmvc.xml中添加:
<!--配置全局异常处理器-->
<bean id="customHandlerException" class="com.itheima.exception.CustomHandlerException"/>
5. 上传图片
5.1 配置图片虚拟目录
-
在tomcat上配置
在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加: