SpringMVC_day02

高级参数绑定

参数绑定数组

直接在前台遍历出多个参数,然后提交之后springmvc 会自动封装为一个数组, 我们只用接受就行了, 代码如下

	@RequestMapping(value="/item/deletes.action")
	public  ModelAndView deletes(Integer[] ids){
		System.out.println(ids.toString());
		ModelAndView mv = new ModelAndView(); 
		mv.setViewName("success");
		return mv ; 
		
	}
注意: 数组的名称要和前台提交数据的名称一致

通过debug 我们可以看到后台收到的参数


也可以把数组放入包装类中,然后进行存取

参数绑定List 集合

在包装类中封装List 集合 ,注意jsp页面的书写

<td><input type="text" value="${item.name }" name="itemList[${vs.index}].name"></td>
	<td><input type="number" value="${item.price }" name="itemList[${vs.index}].price" >  </td>

springmvc 不支持直接参数绑定 list  直接形参接受

结果如下

然后就可以啦!

@RequestMapping

 1.URl 路径映射

	@RequestMapping(value="/item/deletes.action")

这里的value 是一个参数是个数组, 可以写多个访问路径 ,比如

@RequestMapping(value={"/item/deletes.action","item/update.action"}

两个路径都可以访问到的

如果只有value 这个属性 ,value 可以省略

2.添加在类上面

在class 上直接写上整个类中所有方法的访问路径 的共同路径 ,

//@RequestMapping("item")
public class ItemController  // 共同的路径为 item 上

3.请求方法限制

限制请求方式只能为get

@RequestMapping(value="/item/deletes.action",method=RequestMethod.GET)

限制 方式可以是post 可以是get

@RequestMapping(value="/item/deletes.action",method={RequestMethod.GET,RequestMethod.POST})

如果访问的方式不对就会报错

HTTP Status 405 - Request method 'GET' not supported

  Controller 层方法返回值

1.返回ModelAndView  模型视图对象    , 全局异常处理要用
    直接在此对象中添加视图和模型 即可

2. 返回字符串string    , 体现了mvc 思想, 官方建议使用 

    2.1 。直接返回视图的名字 ,如果相带数据直接在接受参数的形参中定义model 对象 ,然后再方法中, addAttrbute()直接添加要加的pojo或者是数据即可

    2.3.  redirect 重定向  再返回的路径前加上 redirect :  就可以实现重i定向

return "redirect:/itemEdit.action?itemId=" + item.getId();

    2.4 .  forword 转发 , 再路径前加上froward  : 即可

return "forward: /itemEdit.action";

3. void  没有返回值, 用户ajax 前后台交换数据,

    1, 可以用转发 和重定向啊, 就原始的servlet 的一套

getRequestDispatcher().forword(request,response);

response.sendRedirect 

     2 . 可以用ajax 用json 进行前后台互换数据

response.getWriter().print("{\"abc\":123}");

异常处理器

系统中的异常分为两类, 预期异常和运行时异常, RuntimeException  ,前者通过不加异常从而获取异常信息, 后者通过规范代码开发, 测试通过手段减少运行时异常发生

spring 为我们提供了一个 异常处理器接口, HandlerExceptionResolver 我们如果要完成异常的处理我们就要实现接口, 实现接口中的方法, 然后把实现的异常处理器类,实例化, 放入spring容器中,

package com.itheima.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 ExcuptionResolver implements HandlerExceptionResolver {

	
	
	public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			Exception arg3) {
		// TODO Auto-generated method stub  obj
		// obj 发生异常的地方, 日志 : 发布war包,  Eclipse  2. 发布tomcat 服务器上的linux log4j日志,  
		/**
		 * exception 指的是, 什么异常 ? 
		 * 
		 */
		ModelAndView mv = new ModelAndView() ; 
		mv.addObject("error","未知异常"); 
		mv.setViewName("error");
		return mv;
	}

	
	
	
}

在xml中进行配置

	
	<!-- SpringMvc 的异常处理器 -->
	<bean class="com.itheima.springmvc.exception.ExcuptionResolver">	</bean>
	
  预期异常

我们提前加以判断如果不满足条件 就抛出异常 如下

自定义异常类 , 继承 execption

package com.itheima.springmvc.exception;

public class MassageExcuption extends Exception {

	
	private String msg ; 
	
	private static final long serialVersionUID = 1L;
	
	

	public MassageExcuption(String msg) {
	
		this.msg = msg;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	
	
	
}

然后直接进行编辑异常处理器  判断异常类型

package com.itheima.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 ExcuptionResolver implements HandlerExceptionResolver {

	
	
	public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			Exception ex) {
		// TODO Auto-generated method stub  obj
		// obj 发生异常的地方, 日志 : 发布war包,  Eclipse  2. 发布tomcat 服务器上的linux log4j日志,  
		/**
		 * exception 指的是, 什么异常 ? 
		 * 
		 */
		ModelAndView mv = new ModelAndView() ; 
		if(ex instanceof MassageExcuption){
			MassageExcuption me = (MassageExcuption)ex; 
			mv.addObject("error",me.getMsg()); 
		}else {
			
			mv.addObject("error","未知异常"); 
		}
		
		mv.setViewName("error");
		return mv;
	}

	
	
	
}

上传图片

jsp :

jsp要from 提交开启文件提交的哪个属性

然后name要和后台的方法上的形参对应

controller  :

接受参数用形参, 参数的名字和前台的name 对应

	@RequestMapping(value = "/updates.action")
//	public ModelAndView updateitem(Items items){
	public String updateitem(QueryVo vo, MultipartFile pictureFile) throws Exception{

		//保存图片到 
		String name = UUID.randomUUID().toString().replaceAll("-", "");
		//jpg
		String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
		
		pictureFile.transferTo(new File ("E:\\upload\\" + name + "." + ext));
		
		vo.getItems().setPic("E:\\upload\\" + name + "." + ext);
		//修改
		itemService.update(vo.getItems());
		
//		ModelAndView mav = new ModelAndView();
//		mav.setViewName("success");
		return "redirect:/itemEdit.action?id=" + vo.getItems().getId();
//		return "forward:/item/itemlist.action";
		
	}

配置文件中要配置文件上传实现类

 	<!-- 配置文件上串 -->
 	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 		<property name="maxUploadSize" value="500000"></property>
 	</bean>
 

导包 : upload  和   io包

json 数据交换

导包 : spring官方声明用这三个包

前台 :

用jquery 进行 编写ajax  ,

 
  <script type="text/javascript">
  	$(function(){
	alert(1);
	var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';

// 	$.post(url,params,function(data){
		//回调
// 	},"json");//
	$.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);
		}
		
	});
	alert(2); 
	
});
  </script>
  

记得导入 js 库,

后端  : 直接用spring封装好的方法进行, 直接把json 字符串转换为对象

@RequestMapping(value="/json.action")
	public @ResponseBody 
	Items ajax(@RequestBody Items items ){
		System.out.println(items.getName());
		return items; 
	}

@requestMapping  不用解释

@responseBody 返回参数用这个注解

@requestBody  接受spring 把json 转换为的对象使用 ,

RESTful  开发风格

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

资源:互联网所有的事物都可以被抽象为资源

资源操作:使用POSTDELETEPUTGET,使用不同方法对资源进行操作。

      分别对应 添加、 删除、修改、查询。

传统方式操作资源

http://127.0.0.1/item/queryItem.action?id=1 查询,GET

http://127.0.0.1/item/saveItem.action 新增,POST

http://127.0.0.1/item/updateItem.action 更新,POST

http://127.0.0.1/item/deleteItem.action?id=1 删除,GETPOST

使用RESTful操作资源

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE

从url 上获取参数
	
	@RequestMapping(value="item/itemEdit{id}.action")
	public ModelAndView toEdit2( @PathVariable Integer id  ,   
			HttpServletRequest request,HttpServletResponse response,
			HttpSession session ,Model model){

直接把参数绑定在路径上 ,然后再参数上添上注解 @pathVariable 然后可以了

拦截器

再进入controller之前,进行数据的一些处理,拦截

<mvc:interceptors>
 		<mvc:interceptor>
 			<mvc:mapping path="/**"/>
 			<bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean>
 		</mvc:interceptor>
 		<!-- <mvc:interceptor>
 			<mvc:mapping path="/**"/>
 			<bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean>
 		</mvc:interceptor> -->
 	</mvc:interceptors>

配置之后 ,创建 普通的java类, 然后要实现接口, 实现接口中的三个方法, HandlerInterceptor 这个接口,

preHandle  controller层之前的拦截  对请求进行拦截

afterCompletion  controller 之后的拦截

postHandle 渲染后拦截





































猜你喜欢

转载自blog.csdn.net/qq_39148187/article/details/80036975