目录
一次性工作
- //web容器配置类
- //AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
- public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
- //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
- protected WebApplicationContext createServletApplicationContext() {
- //初始化WebApplicationContext对象
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- //加载指定配置类
- ctx.register(SpringMvcConfig.class);
- return ctx;
- }
-
- //设置由springmvc控制器处理的请求映射路径,即SpringMVC拦截哪些请求
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
-
- //加载spring配置类
- protected WebApplicationContext createRootApplicationContext() {
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- ctx.register(SpringConfig.class);
- return ctx;
- }
- }
-
- //定义表现层控制器bean
- @Controller
- public class UserController {
-
- //设置当前方法映射路径为/save,即外部访问路径
- @RequestMapping("/save")
- //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
- @ResponseBody
- public String save(){
- System.out.println("user save ...");
- return "{'info':'springmvc'}";
- }

- @Configuration
- //@ComponentScan({"com.itheima.service","com.itheima.dao"})
- //设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
- //excludeFilters属性:设置扫描加载bean时,排除的过滤规则
- //type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
- //classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
- @ComponentScan(value="com.itheima",
- excludeFilters = @ComponentScan.Filter(
- type = FilterType.ANNOTATION,
- classes = Controller.class
- )
- )
- public class SpringConfig {
- }
建议为不同模块设置模块名作为请求路径前置以减少命名冲突
1、普通参数:使用@RequestParam注解解决地址参数名与形参变量名不同的问题
2、POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数,否则无法封装
3、数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
4、集合保存普通参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
5、json数据传输参数:先开启json数据类型自动转换 @EnableWebMvc,再使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
- 请求数据
- [
- {"name":"itcast","age":15},
- {"name":"itheima","age":12}
- ]
- 后台接收
- @RequestMapping("/listPojoParamForJson")
- @ResponseBody
- public String listPojoParamForJson(@RequestBody List
list) { - System.out.println("list pojo(json)参数传递 list ==> "+list);
- return "{'module':'list pojo for json param'}";
- }
6、日期类型参数:SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd。传递其他格式需要使用@DateTimeFormat
- @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
- @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2
- @RestController //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
- @RequestMapping("/books")
- public class BookController {
- // @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)
- @DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置
- public String delete(@PathVariable Integer id){
- System.out.println("book delete..." + id);
- return "{'module':'book delete'}";
- }
所有的异常均抛出到表现层进行处理,SpringMVC提供了异常处理器,集中的、统一的处理项目中出现的异常
- //@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
- @RestControllerAdvice
- public class ProjectExceptionAdvice {
- //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
- @ExceptionHandler(Exception.class)
- public void doException(Exception ex){
- System.out.println("嘿嘿,异常你哪里跑!")
- return new Result(666,null,"嘿嘿,异常你哪里跑!");
- }
- }
异常解决方案:
- //模拟业务异常,包装成自定义异常
- if(id == 1){
- throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
- }
- //模拟系统异常,将可能出现的异常进行包装,转换成自定义异常
- try{
- int i = 1/0;
- }catch (Exception e){
- throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
- }
- //@ExceptionHandler用于设置当前处理器类对应的异常类型
- @ExceptionHandler(SystemException.class)
- public Result doSystemException(SystemException ex){
- //记录日志
- //发送消息给运维
- //发送邮件给开发人员,ex对象发送给开发人员
- return new Result(ex.getCode(),null,ex.getMessage());
- }


步骤一:创建拦截器类
-
- @Component
- //定义拦截器类,实现HandlerInterceptor接口
- //注意当前类必须受Spring容器控制
- public class ProjectInterceptor implements HandlerInterceptor {
- @Override
- //原始方法调用前执行的内容
- //返回值类型可以拦截控制的执行,true放行,false终止
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- String contentType = request.getHeader("Content-Type");
- HandlerMethod hm = (HandlerMethod)handler;
- System.out.println("preHandle..."+contentType);
- return true;
- }
-
- @Override
- //原始方法调用后执行的内容
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("postHandle...");
- }
-
- @Override
- //原始方法调用完成后执行的内容
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("afterCompletion...");
- }
- }
步骤二:配置拦截器类
- @Configuration
- @ComponentScan({"com.itheima.controller"})
- @EnableWebMvc
- //实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
- public class SpringMvcConfig implements WebMvcConfigurer {
- @Autowired
- private ProjectInterceptor projectInterceptor;
- @Autowired
- private ProjectInterceptor2 projectInterceptor2;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //配置多拦截器
- registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
- registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
- }
- }
