数组类型的参数绑定
ItemController修改queryItem方法:
/**
* 包装类型 绑定数组类型,可以使用两种方式,pojo的属性接收,和直接接收
*
* @param queryVo
* @return
*/
@RequestMapping("queryItem")
public String queryItem(QueryVo queryVo, Integer[] ids) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
System.out.println(queryVo.getIds().length);
System.out.println(ids.length);
return "success";
}
List类型的绑定
前端页面应该显示的html代码,如下图:
分析发现:name属性必须是list属性名+下标+元素属性。
Jsp做如下改造:
<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
<td><input type="checkbox" name="ids" value="${item.id}"/></td>
<td>
<input type="hidden" name="itemList[${s.index}].id" value="${item.id }"/>
<input type="text" name="itemList[${s.index}].name" value="${item.name }"/>
</td>
<td><input type="text" name="itemList[${s.index}].price" value="${item.price }"/></td>
<td><input type="text" name="itemList[${s.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
<td><input type="text" name="itemList[${s.index}].detail" value="${item.detail }"/></td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
${current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最
varStatus属性常用参数总结下:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
@RequestMapping注解的使用
通过@RequestMapping注解可以定义不同的处理器映射规则。
1.URL路径映射
@RequestMapping(value=“item”)或@RequestMapping("/item")
value的值是数组,可以将多个url映射到同一个方法
/**
* 查询商品列表
* @return
*/
@RequestMapping(value = { "itemList", "itemListAll" })
public ModelAndView queryItemList() {
// 查询商品数据
List<Item> list = this.itemService.queryItemList();
// 创建ModelAndView,设置逻辑视图名
ModelAndView mv = new ModelAndView("itemList");
// 把商品数据放到模型中
mv.addObject("itemList", list);
return mv;
}
2.添加在类上面
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头
3.请求方法限定
除了可以对url进行设置,还可以限定请求进来的方法
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过POST访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
例如:
@RequestMapping(value = “itemList”,method = RequestMethod.POST)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过GET访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported
GET和POST都可以
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})
Controller方法返回值
@Controller web层方法返回值
1.ModelAndView mav 无敌的 带着数据 返回视图路径 不建议使用
return mav
return "redirect:/itemEdit.action //重定向
return "forward:/itemEdit.action //转发
2.string 返回视图 model带数据 官方推荐此种方式 解耦 数 据 视 图 分离 MVC 建议使用
return "itemList";
3.void ajax 请求 合适 json格式数据(response 异步请求使用
@return
Springmvc中异常处理
需要创建一个实现一个HandlerExceptionResolver接口
* 异常处理器的自定义的实现类
* */
public class yichanglmpl implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,
Exception e) {
//obj:是发生异常的地方Service层的方法 包名+类名+方法名(形参)字符串
ModelAndView mav=new ModelAndView();
mav.addObject("error", "未知异常");
mav.setViewName("error");
return mav;
}
然后在springmvc.xml配置
<!--springmvc的异常处理 -->
<bean class="com.itheima.springmvc.yichang.yichanglmpl" />
图片上传处理
需要导入两个包
在springmvc.xml中配置文件上传解析器
<!-- 文件上传,id必须设置为multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件上传大小 -->
<property name="maxUploadSize" value="5000000" />
</bean>
在商品修改页面,打开图片上传功能,如下图:
设置表单可以进行文件上传,如下图:
`//提交修改页面 入参 为 Items对象
@RequestMapping(value = “/updateitem.action”)
// public ModelAndView updateitem(Items items){
public String updateitem(QueryVo vo,MultipartFile pictureFile) throws Exception{
//保存图片 replaceAll("-", “”);:之前的文件名跟之后的文件名 防止重复
String name = UUID.randomUUID().toString().replaceAll("-", “”);
//jpg
String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
pictureFile.transferTo(new File("F:\\upload\\"+name+"."+ext));
vo.getItems().setPic(name+"."+ext);
//修改
itemService.updateItemsById(vo.getItems());
//ModelAndView mav = new ModelAndView();
//mav.setViewName("success");
return "redirect:/itemEdit.action?id="+vo.getItems().getId();
//return mav;`
Json数据交互
需要导入js
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(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);
}
//json数据交互
@RequestMapping(value="/json.action")
public @ResponseBody
Items json(@RequestBody Items items) {
return items;
}
拦截器
需要实现 一个HandlerInterceptor接口
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
// TODO Auto-generated method stub
System.out.println("方法前");
//判断用户是否登入,如果没有登入 重定向到登入页面 不放行, 如果登入了 放行
//URL http://localhost:8080/springmvc-mybatis/login.action
//URI /login.action
String requestURI = request.getRequestURI();
if(!requestURI.contains("/login")){
String username = (String) request.getSession().getAttribute("USER_SESSION");
if(null==username) {
response.sendRedirect(request.getContextPath()+"/login.action");
//false不放行
return false;
}
}
在springmvc.xml中配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 所有的请求都进入拦截器 -->
<mvc:mapping path="/**" />
<!-- 配置具体的拦截器 -->
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1" />
</mvc:interceptor>
</mvc:interceptors>