一、高级参数绑定
1,数组类型的参数绑定
需求分析:
要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息。
jsp中实现
<c:forEach items="${itemList}" var="item">
<tr>
<td>${item.name}</td>
<td>${item.price}</td>
<td><fmt:formateDate 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>
Controller实现
Controller方法中可以用String[]接收,或者pojo的String[]属性接收。
两种方法任选其一即可。
方法一、
@RequestMapping("/queryitem")
public String queryItem(String[] ids) {
System.out.println(ids.toString());
return null;
}
方法二、
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
}
public class QueryVo{
private String[]ids;
}
2,参数绑定到List
需求,实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改。
jsp页面
<c:forEach items="${itemList }" var="item" varStatus="status">
<tr>
<!--
name的属性名称要与接收参数的pojo类的属性名称要一致
-->
<!--
如果批量删除,可以用List<pojo>来接收,
页面上input框的name属性值=vo中接收的集合属性名称+List泛型类的属性名称
-->
<td><input type="checkbox" name="ids" value="${item.id }">
<input type="hidden" name="listItem[${status.index}].id" value="${item.id }">
</td>
<td>
<input type="text" name="listItem[${status.index}].name" value="${item.name}">
</td>
<td><input type="text" name="listItem[${status.index}].price" value="${item.price }">
</td>
<td><input type="text" name="listItem[${status.index}].createtime"
value="<fmt:formatDate value="${item.createtime}"
pattern="yyyy-MM-dd HH:mm:ss" />">
</td>
<td><input type="text" name="listItem[${status.index}].detail" value="${item.detail }">
</td>
<td>
<a href="${pageContext.request.contextPath }/items/itemEdit/${item.id}">修改</a>
</td>
</tr>
</c:forEach>
Controller 代码
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
}
public class QueryVo{
// 批量修改使用
private List<Items> listItem;
}
注意:属性name必须是包装pojo的list属性+下标+元素属性
二、请求方法限定
1,限定GET方法
@RequestMapping(method = RequestMethod.GET)
2,限定Post方法
@RequestMapping(method = RequestMethod.POST)
3,GET和POST方法都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
三、controller方法返回值
1,返回值ModleAndView
@RequestMapping(value="/itemLists",method=RequestMethod.GET)
public ModelAndView getItemList() throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList", listItems);
modelAndView.setViewName("itemList");
return modelAndView;
}
2,返回void
在方法形参上定义request,response,使用request或response
指定响应结果
(1)使用request转向页面
//指定返回页面(如果controller返回值为void,
//则不走springMvc组件,所以要写页面的完整路径)
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").
forward(request, response);
(2)使用response重定向页面(传递不了数据)
response.sendRedirect("url")
3,返回字符串
(1)方法返回字符串可以指定视图名
// 如果springMvc方法返回一个简单的string字符串,
//那么springMvc就会认为这个字符串就是页面的名称
//即:/WEB-INF/jsp/item/editItem.jsp
return "/item/editItem";
(2)Redirect重定向
//注意:"redirect:/items/itemEdit/"+items.getId();
//通过url重定向过去,url参数数据可以保持,通过域重定向url数据不保存
return "redirect:/items/itemEdit/"+items.getId();
(3)forward转发
//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";
四、请求json,响应json实现
Springmvc默认用MappingJacksonHttpMessageConverter
对json数据进行转换,需要加入jackson的包
配置Json转换器
<mvc:annotation-driven />
五、拦截器(比如用于:用户登录)
SpirngMVC 的处理器类似Servlet过滤器用于对处理器
进行预处理和后处理
1,实现HandlerInterceptor接口
public class HandlerIntecepter2 implements HandlerInterceptor{
/**
* 返回boolean 如果返回true放行,返回false则被拦截
* 执行时机,controller方法已经执行,ModleAndView已经返回
* 使用场景,记录操作日志,记录用户登录的时间,日期等。
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
/**
* 返回boolean 如果返回true放行,返回false则被拦截
* 执行时机,controller方法已经执行,ModleAndView没有被返回
* 使用场景,可以在此方法中可以设置全局的的数据处理业务
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
/**
* 返回boolean 如果返回true放行,返回false则被拦截
* 执行时机,controller方法没有被执行,ModleAndView没有被返回
* 使用场景,权限验证
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
return false;
}
}
2,拦截器配置:
(1)针对某一种拦截器进行配置
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="com.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="com.intercapter.HandlerInterceptor2"/>
(2), 针对所有mapping配置全局拦截器
<!--配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器的执行顺序,等于配置文件中配置的顺序 -->
<mvc:interceptor>
<!-- 拦截请求路径,要拦截所有路径 配置成/**代表所有 -->
<mvc:mapping path="/**" />
<!-- 指定拦截器位置 -->
<bean class="cn.itheima.intecepter.HandlerIntecepter"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- 拦截请求路径,要拦截所有路径 配置成/**代表所有 -->
<mvc:mapping path="/**" />
<!-- 指定拦截器位置 -->
<bean class="cn.itheima.intecepter.HandlerIntecepter2"></bean>
</mvc:interceptor>
</mvc:interceptors>
六、代码