SpringMVC

一、概念

1、MVC

MVC的核心思想是业务数据抽取同业务数据呈现相分离。

  • View:视图层,为用户提供UI,重点关注数据的呈现
  • Model:模型层,业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合
  • Controller:控制层,调用业务逻辑产生合适的数据(Model),传递数据给视图层用于显示

MVC是一种架构模式,程序分层,分工合作,即相互独立又协同合作

2、Spring MVC

  • DispatcherServlet:分发器
  • HandleAdapter:
  • HandleInterceptor:过滤器
  • Controller:控制器
  • HandlerMapping:处理器映射
  • HandlerExecutionChain:执行链
  • ModelAndView
  • ViewResolver:视图解析器
  • View:视图

DispatcherServlet就是一个前端控制器,Controller调用业务逻辑生成Model的地方,DispatcherServlet通过HandleMapping找到Controller和HandleInterceptor把他们形成了一个执行链条Handler,然后DispatcherServlet来调用,然后生成模型modelandview,再把模型返还给DispatcherServlet,DispatcherServlet调用ViewResolver视图解析器返还view对象,然后看到用户界面

SpringMVC_第1张图片

二、配置

1、web.xml


  
	mvc-dispatcher
	 org.springframework.web.servlet.DispatcherServlet
	
	
	  contextConfigLocation
	  /WEB-INF/configs/spring/mvc-dispatcher-servlet.xml
	
	1


	mvc-dispatcher
	
	/

2、springmvc配置文件

  • 开启注解
  • 扫描使用注解的包
  • mvc注解驱动
  • 静态资源配
  • InternalResourceViewResolver 配置ViewResolver



	

	
	

	
	
		
	

	

	
	

	
	


	
	
		
		
		
	
	

三、使用

1、基本使用

@RequestMapping请求映射

@RequestParam请求参数:/courses/view3?courseId=123 

@PathVariable请求参数:/courses/view2/123

@ModelAttribute 对象绑定,jsp中的表单name和model保持一致

//本方法将处理 /courses/view?courseId=123 形式的URL
@RequestMapping(value="/view", method=RequestMethod.GET)
public String viewCourse(@RequestParam("courseId") Integer courseId,
		Model model) {
	
	
	log.debug("In viewCourse, courseId = {}", courseId);
	Course course = courseService.getCoursebyId(courseId);
	model.addAttribute(course);
	return "course_overview";
}

//本方法将处理 /courses/view2/123 形式的URL
@RequestMapping("/view2/{courseId}")
public String viewCourse2(@PathVariable("courseId") Integer courseId,
		Map model) {
	
	log.debug("In viewCourse2, courseId = {}", courseId);
	Course course = courseService.getCoursebyId(courseId);
	model.put("course",course);
	return "course_overview";
}

//本方法将处理 /courses/view3?courseId=123 形式的URL
@RequestMapping("/view3")
public String viewCourse3(HttpServletRequest request) {
	
	Integer courseId = Integer.valueOf(request.getParameter("courseId"));		
	Course course = courseService.getCoursebyId(courseId);
	request.setAttribute("course",course);
	
	return "course_overview";
}

@RequestMapping(value="/admin", method = RequestMethod.GET, params = "add")
public String createCourse(){
	return "course_admin/edit";
}

@RequestMapping(value="/save", method = RequestMethod.POST)
public String  doSave(@ModelAttribute Course course){		
	
	log.debug("Info of Course:");
	log.debug(ReflectionToStringBuilder.toString(course));
	
	//在此进行业务操作,比如数据库持久化
	course.setCourseId(123);
	return "redirect:view2/"+course.getCourseId();
}

2、文件上传

配置文件解析、增加相关依赖


	
	
	

	commons-fileupload
	commons-fileupload
	1.3.1

使用

@RequestMapping(value="/doUpload", method=RequestMethod.POST)
public String doUploadFile(@RequestParam("file") MultipartFile file) throws IOException{
	
	if(!file.isEmpty()){
		log.debug("Process file: {}", file.getOriginalFilename());
		FileUtils.copyInputStreamToFile(file.getInputStream(), new File("c:\\temp\\imooc\\", System.currentTimeMillis()+ file.getOriginalFilename()));
	}
	
	return "success";
}

3、JSON

配置文件解析、增加相关依赖



	
	
		
			
			
			
		
	

	
		
			
			
			
		
	
	

	com.fasterxml.jackson.core
	jackson-databind
	${jackson.version}

使用

@RequestMapping(value="/{courseId}",method=RequestMethod.GET)
public @ResponseBody Course getCourseInJson(@PathVariable Integer courseId){
	return  courseService.getCoursebyId(courseId);
}


@RequestMapping(value="/jsontype/{courseId}",method=RequestMethod.GET)
public  ResponseEntity getCourseInJson2(@PathVariable Integer courseId){
	Course course =   courseService.getCoursebyId(courseId);		
	return new ResponseEntity(course, HttpStatus.OK);
}

四、MVC拦截器

1、什么是拦截器

是拦截器指通过统一拦截从浏览器发往服务器的请求来完成功能的增强

使用场景:解决请求的共性问题,如:乱码问题、权限验证问题等

2、工作原理

工作原理和过滤器相似,可以用来解决乱码问题

Spring MVC默认提供了CharacterEncodingFilter过滤器类,来对客户端的请求进行编码设置

  • 过滤器依赖于sevrlet容器,基于回调函数,过滤范围大。
  • 拦截器依赖于spring框架容器,基于反射机制,只过滤请求

3、实现

  • 编写拦截器类,实现HandlerInterceptor接口
  • 注册拦截器  
  • 配置拦截规则

4、拦截方法

  • preHandle()方法是否将当前请求拦截下来。(返回true请求继续运行,返回false请求终止(包括action层也会终止),Object arg代表被拦截的目标对象。)
  • postHandle()方法的ModelAndView对象可以改变发往的视图或修改发往视图的信息。
  • afterCompletion()方法表示视图显示之后在执行该方法。(一般用于资源的销毁)

5、多个拦截器

多个拦截器时,拦截器方法的执行顺序

SpringMVC_第2张图片

 

你可能感兴趣的:(Web框架及插件)