SpringMVC学习第二天

1.搭建项目环境

web.xml配置和spring-mvc.xml的配置。同第一天

2.ModelAndView

与Model接口不同的是,这是一个类。
用法:返回一个ModelAndView对象
常用方法:
addObject() 添加对象(键值对)
setViewName 设置响应视图,底层交由spring视图解析器。

	@RequestMapping("/testmodel")
	public ModelAndView hi(ModelAndView mav){
		mav.addObject("message", "ModelAndView组件你好");
		mav.setViewName("helloworld");
		return mav;
	}

3.使用关键字来控制跳转

前面已经学习过Springmvc两种方式跳转,
第一种是有返回值:返回一个字符串通过视图解析器自动转发到对应路径下的页面。
第二种是无返回值时:方法体中声明request和response对象,调用转发和重定向完成操作
第三种就是使用关键字:同样返回一个字符串,

public String helloWorld(){
		//特殊语法   forward:	或redirect:		
		//return "forward:/WEB-INF/jsp/helloworld.jsp";
		//注意重定向不能到web-inf目录下,此处不用拼加项目路径,spring底层帮我们加了。
		return "redirect:/success.jsp";
		
	}

4.使用ResponseBody响应json数据

4.1 前端控制器DispatcherServlet会默认拦截所有的资源请求,导致静态资源不能被访问到,需要在spring-mvc.xml中添加如下配置
<!--设置静态资源请求不拦截  -->
	<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
	<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
4.2 使用ajax发送请求

ajax发送请求的属性格式是json格式的字符串。

$(function(){
		$("#btn").click(function(){
			//alert("hello guy!");
			//发送ajax请求数据
			$.ajax({
				//编写json格式,设置属性和值
				url:"user/testAjax",
				contentType:"application/json;charset=UTF-8",
				//请求参数数据
				data:'{"uname":"cch","date":"2019-09-12"}',
				//响应格式
				dataType:"json",
				//请求方式
				type:"post",
				//响应成功后的回调函数(data是返回的json数据)
				success:function(data){	
					alert(data.uame);
				}	
			});
		});	
	});
4.3 ResponseBody响应json数据

@ResponseBody注解实现了将controller方法的返回对象转换为json格式响应给客户端
需要导入jackson的包
springmvc提供的自动转json的jar
同时springmvc可以自动封装json类型的数据到参数对象中。
通过前端传来的json字符串,按照对应属性自动封装为user对象

@RequestMapping("/testAjax")
	public @ResponseBody User testAjax(@RequestBody User user){
		System.out.println(user);
		return user;	
	}

Response响应json数据效果如图
获取到了后台传来的json对象字符串的uname属性。
在这里插入图片描述

5.SpringMVC文件上传和下载

1.使用fileupload工具包上传,传统代码步骤如下。

public String fileupload(HttpServletRequest req) throws Exception{
		// 1.设置上传文件的路径
		String uploadpath = req.getServletContext().getRealPath("/upload/");
		// 2.判断该路径是否存在
		File f1 = new File(uploadpath);
		if (!f1.exists()) {
			f1.mkdirs();
		}
		//3.获取磁盘文件项工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//4.获取核心上传对象
		ServletFileUpload upload = new ServletFileUpload(factory);
		//5 解析request对象,返回一个文件项对象
		List<FileItem> items= upload.parseRequest(req);
		//6.遍历items
		for(FileItem fi:items){
			//判断是否是文件域
			if(fi.isFormField()){
				int count=0;
				count++;
				System.out.println("共有"+count+"个非文件项");
			}
			else{
				//获取文件名称
				String filename = fi.getName();
				//完成文件上传
				fi.write(new File(uploadpath,filename));
				//删除临时文件
				fi.delete();
			}
		}
		return "success";
	}

2.SpringMVC文件上传原理图
在这里插入图片描述
注意
1)spring提供了一个类MultipartFile,帮助我们解析request对象,只需要调用响应的方法即可完成上传操作,但是文件域中的name属性值必须要和参数属性名称相同(红线)。
2)我们还需要在spring-mvc-xml中配置spring的文件解析器对象,且此对象 的id必须是multipartResolver.不允许修改。

//SpringMVC的文件上传
	@RequestMapping("/springmvcUpload")
	public String springmvcUpload(HttpServletRequest req,MultipartFile upload) throws Exception{
		// 1.设置上传文件的路径
		String uploadpath = req.getServletContext().getRealPath("/upload/");
		// 2.判断该路径是否存在
		File f1 = new File(uploadpath);
		if (!f1.exists()) {
			f1.mkdirs();
		}
		//spring拿到了上传的对象,自动解析是否是文件域,调用上传的方法即可
		//3.获取文件名称
		String filename = upload.getOriginalFilename();
		//4.上传文件
		upload.transferTo(new File(uploadpath,filename));
		return "success";
	}

非常方便就完成了文件的上传。
3.springmvc之跨服务器的文件上传
从项目服务器上传到存放文件的服务器。此处模拟的是本地tomcat的跨服务器上传文件。步骤如下。
在这里插入图片描述

6.springmvc之异常处理

原理图
在这里插入图片描述
代码示例图
1).编写自定义异常类
设置提示属性message,和构造方法。
2).编写异常处理器实现类并设置错误页面信息。
知识点:if(实例 instanceof 类),该语法是检验一个对象是否是该类的实例或者是其子类孙类,或者是实现类,是返回true。

@Component
//编写系统异常处理器(解析器),实现springmvc异常处理器接口。
public class myExceptionResolver implements HandlerExceptionResolver {
	public ModelAndView resolveException(HttpServletRequest req,
			HttpServletResponse resp, Object obj, Exception ex) {
		SysException se = null;
		//如果异常处理器捕捉的异常对象是右边类的实例(或子类和实现类),则强转。
		if(ex instanceof SysException){
			se=(SysException)ex;
		}//不是指定异常则抛出一个服务器异常信息。
		else{
			se= new SysException("服务器异常,请联系管理员");
		}
		//设置异常跳转相关信息。
		ModelAndView mv = new ModelAndView();
		mv.addObject("errorMsg", se.getMessage());
		mv.setViewName("error");
		return mv;
	}

7.SpringMVC拦截器

拦截器和过滤器的区别
拦截器是Springmvc自己的工具,只能拦截Controller中 方法,不拦截静态资源;过滤器可以拦截所有请求,所有web项目都可以使用。
使用拦截器的步骤:
1.编写自定义拦截器类,必须实现Springmvc的拦截器接口HandlerInterceptor。
可以看出,拦截器的操作是Spring经典的AOP切面编程思想

	//方法执行预处理,返回值为true才执行方法体,执行下一个拦截器
	/* 判断用户权限,是否登录等*/
	public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
			Object arg2) throws Exception {
		System.out.println("Interceptor预处理执行了");
		return true;
	}
	//后处理方法,在方法体执行后执行,但在方法转发页面加载之前执行
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("拦截方法执行后");
	}
	//完成(最终)方法
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception{
	}

2.在springmvc配置文件中配置拦截器

<!--配置拦截器 (可以配置多个) -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!--设置拦截方法的请求路径  -->
			<mvc:mapping path="/user/*"/>
			<!--不拦截的(二选其一) <mvc:exclude-mapping path=""/> -->
			<!--配置自定义拦截器的类-->
			<bean class="com.borened.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

当有多个拦截器时,
按照定义的拦截器链,第一个拦截器的前处理方法执行后转发到第二个拦截器,在到Controller类的执行,再按顺序返回后方法和最终方法。
一个方法请求的执行路线如图所示:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值