springmvc高级篇

数组类型的参数绑定

在这里插入图片描述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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值