# SpringMVC_Study **Repository Path**: thread-git/SpringMVC_Study ## Basic Information - **Project Name**: SpringMVC_Study - **Description**: Spring-MVC学习笔记,主要用于记录 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-06-02 - **Last Updated**: 2022-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringMVC MVC:模型(dao,service) 视图 (jsp) 控制器(servlet) ## 1、常规依赖 ```xml junit junit 4.12 org.springframework spring-webmvc 5.2.0.RELEASE javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2 ``` ## 2、文件导出格式异常的一般处理方式 ```xml src/main/resources **/*.properties **/*.xml src/main/java **/*.properties **/*.xml ``` ## SpringMVC执行原理 ## **3、简要分析执行流程** 1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。 我们假设请求的url为 : http://localhost:8080/SpringMVC/hello 如上url拆分成三部分: http://localhost:8080服务器域名 SpringMVC部署在服务器上的web站点 hello表示控制器 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。 2、HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。 3、HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。 4、HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。 5、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。 6、Handler让具体的Controller执行。 7、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。 8、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。 9、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。 10、视图解析器将解析的逻辑视图名传给DispatcherServlet。 11、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。 12、最终视图呈现给用户。 每次以Maven方式创建SpringMVC项目时都需要注意修改Artifacts里的lib,新建lib包 点+号导入 ![输入图片说明](img/1650289092662.png) ## 4、复用配置代码 #### web.xml ```xml springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-servlet.xml 1 springmvc / encoding org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encoding /* ``` #### 注解开发时的springmvc-servlet.xml ```xml ``` #### HelloController.java 测试代码 ```java @RestController //这样写会使得返回的hello变为字符串 @Controller public class HelloController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("msg", "Hello SpringMVC Annotation"); // 返回的结果和配置文件里拼接而成 hello.jsp return "hello"; } } ``` Restful风格一般写法记录 ```java // 普通方式 :http://localhost:8080/springmvc_04_controler_war_exploded/add?a=1&b=2 // Restful :http://localhost:8080/springmvc_04_controler_war_exploded/add/a/b // @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET) @GetMapping("/add/{a}/{b}") public String test(@PathVariable int a,@PathVariable int b,Model model){ int res=a+b; model.addAttribute("msg",res); return"test"; } ``` 关于地址栏传参 ```java @RequestMapping("/user/t1") public String test1(@RequestParam("username") String name,Model model){ System.out.println("前端参数:"+name); model.addAttribute("msg",name); return"test"; } // Restful @RequestMapping("/user/t2/{name}") public String test2(@PathVariable String name,Model model){ System.out.println("前端参数:"+name); model.addAttribute("msg",name); return"test"; } /* 接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接试用 假设传递的是一个对象,匹配对象中的字段名,名字一致则ok 不一致则为null */ @GetMapping("/user/t3") public String test3(User user){ System.out.println("前端参数:"+user); return"test"; } ```