零配置文件搭建SpringMvc前端
SpringMvc 流程原理java
(1)用戶發送請求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到請求後,調用HandlerMapping處理器映射器,請求獲取Handle;
(3)處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet;
(4)DispatcherServlet經過HandlerAdapter處理器適配器調用處理器;
(5)執行處理器(Handler,也叫後端控制器);
(6)Handler執行完成返回ModelAndView;
(7)HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet;
(8)DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;
(9)ViewResolver解析後返回具體View;
(10)DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)
(11)DispatcherServlet響應用戶。程序員
Spring MVC的主要組鍵
(1)前端控制器 DispatcherServlet(不須要程序員開發)
做用:接收請求、響應結果 至關於轉發器,有了DispatcherServlet 就減小了其它組件之間的耦合度。
(2)處理器映射器HandlerMapping(不須要程序員開發)
做用:根據請求的URL來查找Handler
(3)處理器適配器HandlerAdapter
注意:在編寫Handler的時候要按照HandlerAdapter要求的規則去編寫,這樣適配器HandlerAdapter才能夠正確的去執行Handler。
(4)處理器Handler(須要程序員開發)
(5)視圖解析器 ViewResolver(不須要程序員開發)
做用:進行視圖的解析 根據視圖邏輯名解析成真正的視圖(view)
(6)視圖View(須要程序員開發jsp)
View是一個接口, 它的實現類支持不一樣的視圖類型(jsp,freemarker,pdf等等)
web
零配置文件搭建SpringMVC Start
spring
一、pom文件:apache
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wisely</groupId> <artifactId>highlight_springmvc4</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <!-- Generic properties --> <java.version>1.7</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- Web --> <jsp.version>2.2</jsp.version> <jstl.version>1.2</jstl.version> <servlet.version>3.1.0</servlet.version> <!-- Spring --> <spring-framework.version>4.1.5.RELEASE</spring-framework.version> <!-- Logging --> <logback.version>1.0.13</logback.version> <slf4j.version>1.7.5</slf4j.version> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- 其餘web依賴 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- Spring and Transactions --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring-framework.version}</version> </dependency> <!-- 使用SLF4J和LogBack做爲日誌 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>${logback.version}</version> </dependency> <!--對json和xml格式的支持 --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.5.3</version> </dependency> <!-- file upload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- 非必需,可簡化IO操做 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-framework.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
二、MVC 配置Beanjson
import com.wisely.mypractice.interceptor.MyInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @Configuration //開啓Mvc功能 @EnableWebMvc //掃包 @ComponentScan("com.wisely.mypractice") public class MyMvcConfig extends WebMvcConfigurerAdapter { //配置視圖解析器 @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); return viewResolver; } //配置靜態文件路徑(直接訪問) @Override public void addResourceHandlers(ResourceHandlerRegistry registry){ registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/inde/"); } //將攔截器Bean歸入spring管理 @Bean public MyInterceptor demoInterceptor(){ return new MyInterceptor(); } //配置 攔截器 @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(demoInterceptor()); } //設置文件上傳最大字節 @Bean public MultipartResolver multipartResolver(){ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(1000000); return multipartResolver; } }
三、攔截器Bean後端
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){ long startTime = System.currentTimeMillis(); request.setAttribute("startTime",startTime); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){ long startTime = (Long)request.getAttribute("startTime"); request.removeAttribute("startTime"); long endTime = System.currentTimeMillis(); System.out.println("本次請求處理時間爲:"+ new Long(endTime-startTime) + "ms"); request.setAttribute("handlingTime",endTime - startTime); } }
三、配置 WebApplicationInitializer 實現類 (項目啓動會自動加載該類的實現類)api
import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; public class WebInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(MyMvcConfig.class); context.setServletContext(servletContext); ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(context)); //映射路徑 servlet.addMapping("/"); servlet.setLoadOnStartup(1); } }
四、攔截器mvc
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor extends HandlerInterceptorAdapter { //請求前執行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){ long startTime = System.currentTimeMillis(); request.setAttribute("startTime",startTime); return true; } //請求後執行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){ long startTime = (Long)request.getAttribute("startTime"); request.removeAttribute("startTime"); long endTime = System.currentTimeMillis(); System.out.println("本次請求處理時間爲:"+ new Long(endTime-startTime) + "ms"); request.setAttribute("handlingTime",endTime - startTime); } }
五、全局配置
import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class MyAdvice { //異常處理類( Exception.class 異常類型 ) 能夠定義多個 @ExceptionHandler(value = Exception.class) public ModelAndView exception(Exception exception, WebRequest request){ ModelAndView modelAndView = new ModelAndView("error"); modelAndView.addObject("errorMessage",exception.getMessage()); return modelAndView; } //全部RequestMapping方法上 能夠經過 ModelAttribute 形式獲取值 @ModelAttribute public void addAttributes(Model model){ model.addAttribute("msg","額外信息"); } //忽略請求屬性(只針對用Bean接受) @InitBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.setDisallowedFields("id"); } }
六、Controller 控制器
import com.wisely.mypractice.domain.MyObj; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; @Controller public class HelloController { @RequestMapping("/index") public String hello(){ return "index"; } @RequestMapping("/uploadToPage") public String uploadToPage(){ return "upload"; } @RequestMapping(value = "upload",method = RequestMethod.POST) public String upload(MultipartFile file){ try{ FileUtils.writeByteArrayToFile(new File("D:\\test\\"+file.getOriginalFilename()),file.getBytes()); return "ok"; }catch (IOException e){ e.printStackTrace(); return "wrong"; } } @RequestMapping("/advice") public String getSomething(@ModelAttribute("msg") String msg, MyObj obj){ System.out.println("id:" + obj.getId()); System.out.println("name:" + obj.getName()); throw new IllegalArgumentException("很是抱歉,參數有誤來自@ModelAttribute:" + msg); } }
TODO:
1)、頁面我沒有進行 copy 到帖子裏 本身編寫一些簡單頁面就能夠了
2)、代碼暫時沒放到 GitHab 上 我研究一下 弄好了會修改帖子給出下載路徑(只要配上頁面 代碼徹底是好用的哦 )
3)、我的 QQ 1036943655 有什麼技術上看法 能夠一塊兒互相學習 畢竟本人會的也很少
4)、全部知識點借鑑於 Spring Boot 實戰 (書)