- 1、SpringMVC
- 2、HelloWorld
- web.xml配置
- springMVC.xml
- HelloController.java
- index.jsp
- 3、 @ReuqestMapping 注解
- 用于标识类或者方法
- @ReuqestMapping 属性值:
- ant风格,路径规则、匹配
- restful风格,路径占位符、传值
- 派生注解
- 4、获取请求数据
- 原生ServletAPI获取请求参数
- 控制器方法形参获取请求参数
- @RequestParam
- @RequesHeader
- @CookieValue
- 通过POJO获取请求参数
- 解决乱码
- 4、域对象数据共享
- 1.ServletAPI向request域对象共享数据
- 2.ModelAndView向request域对象共享数据
- 3.Model向request域对象共享数据
- 4.Map向request域对象共享数据
- 5.ModelMap向request域对象共享数据
- 6.Model、ModelMap、Map的关系
- 7.向session域对象共享数据
- 8.向application域对象共享数据
- 5、视图
- 转发视图 InternalResourceView
- 重定向视图 RedirectView
- 视图控制器 InternalResourceViewResolver
- 路径只是为了跳转页面 mvc:view-controller
- 6、HttpMessageConverter 报文信息转换器
- @RequestBody
- @ResponseBody
- RequestEntity
- ResponseEntity
- @RestController
- 7、文件下载、上传
- 文件下载
- 文件上传
- 8、拦截器
- 1.拦截器的配置
- 2.拦截器的三个抽象方法
- 3.多个拦截器的执行顺序
- 9、异常处理器
- 1.基于配置的异常处理
- 2.基于注解的异常处理
- 10、注解配置SpringMVC
- 1.WebInit
- 2.WebConfig
- 11、SpringMVC的执行流程
-
什么是MVC
MVC是一种软件的构想将软 件按照模型、视图、控制器来划分
M:Model 模型, 指的是JavaBean 实体Bean和业务处理Bean(实体类和Dao、Service)
V:View 视图, 指Html或者JSP等页面
C:Controller 控制器,值工程中的Servlet,作用接收请求、响应请求
MVC工作流程:
用户通过视图发生请求到服务器,在服务器中被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller在根据请求处理的结果找到相应的View视图层,渲染数据后最终响应给游览器
2.什么是SpringMVC
SpringMVC是Spring的一个后续产品,是Spring的一个子模块,是Spring为表述层开发提供的一整套完备的解决方案
3.SpringMVC的特点
- Spring家族原生产品,与IOC容器等基础设施无缝对接
- 基于原生的Servlet,通过功能强大的DispatchServlet,对请求和响应进行统一处理
- 代码清晰简洁
- 性能卓越
spring中要求配置文件位于recesouces下,则可以在web.xml的servlet配置中,配置init-param指定配置文件的位置,如果没有配置init-param,则需要在WEB-INF下创建名称为[servlet-name]-servlet.xml的配置文件
restful风格,路径占位符、传值SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springMVC.xml 1 SpringMVC return "index"; }
路径占位符常用于restful风格,在响应的@RequestMapping注解的value属性中通过占位符{xxx}表示要传输的数据,在通过@PathVarlable注解获取占位符中的值
//在@RequestMapping注解的value属性中通过占位符{xxx}表示要传输的数据,在通过@PathVarlable注解获取占位符中的值
@RequestMapping("/restful/{id}/{pageIndex}")
public String restful(@PathVariable("id") String id,@PathVariable("pageIndex") Integer pageIndex) {
System.out.println("id:"+id);
System.out.println("pageIndex:"+pageIndex);
return "index";
}
派生注解
@GetMapping、@PostMapping、@DeleteMapping、@PutMapping
4、获取请求数据 原生ServletAPI获取请求参数 控制器方法形参获取请求参数 @RequestParam @RequesHeader @CookieValue 通过POJO获取请求参数解决请求乱码问题
@RequestMapping("index")
public String index(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:" + username);
System.out.println("password:" + password);
return "index";
}
@RequestMapping("index2")
public String index2(String username, String password) {
System.out.println("username:" + username);
System.out.println("password:" + password);
return "index";
}
@RequestMapping(value = "index3")
public String index3(@RequestParam("user_name") String username) {
System.out.println("username:" + username);
return "index";
}
@RequestMapping(value = "index4")
public String index4(@RequestHeader("Host") String host) {
System.out.println("host:" + host);
return "index";
}
@RequestMapping(value = "index5")
public String index5(@CookieValue("JSESSIONID") String JSESSIONID) {
System.out.println("JSESSIONID:" + JSESSIONID);
return "index";
}
@RequestMapping(value = "index6")
public String index6(User user) {
System.out.println(user);
return "index";
}
解决乱码
get请求乱码 由tomcat照成,修改tomcat的配置文件
post乱码 配置CharacterEncodingFilter
10、注解配置SpringMVC 1.WebInitcharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceResponseEncoding true characterEncodingFilter @ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class}) public String exceptionMethod(Exception ex, Model model) { model.addAttribute(ex); return "error"; } }
创建初始化类,代替web.xml
在Servlet3.0+环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。
Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceResponseEncoding(true);
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
2.WebConfig
代替SpringMVC的配置文件
// 1.组件扫描 2.视图解析 3.view-controller 4.default-servlet-handler
// 5.mvc注解驱动 6.文件上传解析器 7.拦截器 8.异常处理
@Configuration
// 1.组件扫描
@ComponentScan("com.potato.controller")
// 5.mvc注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
//2.视图解析
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/static/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
//3.view-controller
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
WebMvcConfigurer.super.addViewControllers(registry);
}
//4.default-servlet-handler
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
}
//6.文件上传解析器
public CommonsMultipartResolver multipartResolver(CommonsMultipartResolver commonsMultipartResolver) {
commonsMultipartResolver.setDefaultEncoding("UTF-8");
commonsMultipartResolver.setMaxUploadSize(419430400);
return commonsMultipartResolver;
}
//7.拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自己定义的拦截器
//registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
//8.异常处理 可以使用注解配置代替
@Override
public void configureHandlerExceptionResolvers(List resolvers) {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.setProperty("java.lang.ArithmeticException", "error");
//设置异常映射
resolver.setExceptionMappings(prop);
//设置共享异常信息的键
resolver.setExceptionAttribute("ex");
resolvers.add(resolver);
WebMvcConfigurer.super.configureHandlerExceptionResolvers(resolvers);
}
}
11、SpringMVC的执行流程
-
用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。
-
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:
-
根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
-
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
-
如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
-
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
-
此时将开始执行拦截器的postHandle(…)方法【逆向】。
-
根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。
-
渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
-
将渲染结果返回给客户端。



