//spring 基礎
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> //spirng mvc 2個 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
//servlet <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
<!--配置前端控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--配置解決中文亂碼的過濾器--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<!-- 開啓註解掃描 --> <context:component-scan base-package="cn.itcast"/> <!-- 視圖解析器對象 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--配置自定義類型轉換器,好比:後端mode是日期date類型,而文本輸入的是格式爲2010-10-10的string類型,搞個類型轉換會幫忙把string轉換爲date--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.utils.StringToDateConverter"/> </set> </property> </bean>
<!--前端控制器,哪些靜態資源不攔截-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 開啓SpringMVC框架註解的支持 --> <mvc:annotation-driven conversion-service="conversionService"/>
DispatcherServlet:前端控制器css
HandlerMapping:處理器映射器,url和action的映射關係html
Handler:處理器:它就是咱們開發中要編寫的具體業務控制器。前端
HandlAdapter:處理器適配器java
ViewResolver:視圖解析器web
View:視圖:SpringMVC 框架提供了不少的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是 jsp。ajax
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
/** * 模擬異步請求響應 */ @RequestMapping("/testAjax") public @ResponseBody User testAjax(@RequestBody User user){ System.out.println("testAjax方法執行了..."); // 客戶端發送ajax的請求,傳的是json字符串,後端把json字符串封裝到user對象中 System.out.println(user); // 作響應,模擬查詢數據庫 user.setUsername("haha"); user.setAge(40); // 作響應 return user; }
A form 表單的 enctype 取值必須是:multipart/form-data (默認值是:application/x-www-form-urlencoded) enctype:是表單請求正文的類型spring
B method 屬性取值必須是 Post數據庫
C 提供一個文件選擇域<input type=」file」 />json
<form action="/user/fileupload1" method="post" enctype="multipart/form-data"> 選擇文件:<input type="file" name="upload" /><br/> <input type="submit" value="上傳" /> </form>
/** * 傳統文件上傳 * @return */ @RequestMapping("/fileupload1") public String fileuoload1(HttpServletRequest request) throws Exception { System.out.println("文件上傳..."); // 使用fileupload組件完成文件上傳 // 上傳的位置 String path = request.getSession().getServletContext().getRealPath("/uploads/"); // 判斷,該路徑是否存在 File file = new File(path); if(!file.exists()){ // 建立該文件夾 file.mkdirs(); } // 解析request對象,獲取上傳文件項 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // 解析request List<FileItem> items = upload.parseRequest(request); // 遍歷 for(FileItem item:items){ // 進行判斷,當前item對象是不是上傳文件項 if(item.isFormField()){ // 說明普通表單向 }else{ // 說明上傳文件項 // 獲取上傳文件的名稱 String filename = item.getName(); // 把文件的名稱設置惟一值,uuid String uuid = UUID.randomUUID().toString().replace("-", ""); filename = uuid+"_"+filename; // 完成文件上傳 item.write(new File(path,filename)); // 刪除臨時文件 item.delete(); } } return "success"; }
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
<!--配置文件解析器對象--> <!-- id 的值是固定的--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760" /> </bean>
/** * SpringMVC文件上傳 * @return */ @RequestMapping("/fileupload2") public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception { System.out.println("springmvc文件上傳..."); // 使用fileupload組件完成文件上傳 // 上傳的位置 String path = request.getSession().getServletContext().getRealPath("/uploads/"); // 判斷,該路徑是否存在 File file = new File(path); if(!file.exists()){ // 建立該文件夾 file.mkdirs(); } // 說明上傳文件項 // 獲取上傳文件的名稱 String filename = upload.getOriginalFilename(); // 把文件的名稱設置惟一值,uuid String uuid = UUID.randomUUID().toString().replace("-", ""); filename = uuid+"_"+filename; // 完成文件上傳 upload.transferTo(new File(path,filename)); return "success"; }
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency>
/** * 跨服務器文件上傳 * @return */ @RequestMapping("/fileupload3") public String fileuoload3(MultipartFile upload) throws Exception { System.out.println("跨服務器文件上傳..."); // 定義上傳文件服務器路徑,uploads就是文件服務器一個目錄,文件服務器不須要實現上傳的邏輯 String path = "http://localhost:9090/uploads/"; // 說明上傳文件項 // 獲取上傳文件的名稱 String filename = upload.getOriginalFilename(); // 把文件的名稱設置惟一值,uuid String uuid = UUID.randomUUID().toString().replace("-", ""); filename = uuid+"_"+filename; // 建立客戶端的對象 Client client = Client.create(); // 和圖片服務器進行鏈接 WebResource webResource = client.resource(path + filename); // 上傳文件 webResource.put(upload.getBytes()); return "success"; }
/** * 異常處理器 */ public class SysExceptionResolver implements HandlerExceptionResolver{ /** * 處理異常業務邏輯 * @param request * @param response * @param handler * @param ex * @return */ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 獲取到異常對象 SysException e = null; if(ex instanceof SysException){ e = (SysException)ex; }else{ e = new SysException("系統正在維護...."); } // 建立ModelAndView對象 ModelAndView mv = new ModelAndView(); mv.addObject("errorMsg",e.getMessage()); mv.setViewName("error"); return mv; } }
<bean id="handlerExceptionResolver" class="com.itheima.exception.CustomExceptionResolver"/>
後端
@RequestMapping("/testException") public String testException() throws SysException{ System.out.println("testException執行了..."); try { // 模擬異常 int a = 10/0; } catch (Exception e) { // 打印異常信息 e.printStackTrace(); // 拋出自定義異常信息 throw new SysException("查詢全部用戶出現錯誤了..."); } return "success"; }
Spring MVC 的處理器攔截器相似於 Servlet 開發中的過濾器 Filter,用於對處理器進行預處理和後處理。
攔截器鏈:攔截器鏈就是將攔截器按必定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其以前定義的順序被調用。
過濾器是 servlet 規範中的一部分,任何 java web 工程均可以使用。
攔截器是 SpringMVC 框架本身的,只有使用了 SpringMVC 框架的工程才能用。
過濾器在 url-pattern 中配置了/*以後,能夠對全部要訪問的資源攔截。
攔截器它是隻會攔截訪問的控制器方法,若是訪問的是 jsp,html,css,image 或者 js 是不會進行攔截的。
/** * 自定義攔截器 */ public class MyInterceptor1 implements HandlerInterceptor{ /** * 預處理,controller方法執行前 * return true 放行,執行下一個攔截器,若是沒有,執行controller中的方法 * return false不放行 * @param request * @param response * @param handler * @return * @throws Exception */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor1執行了...前1111"); // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); return true; } /** * 後處理方法,controller方法執行後,success.jsp執行以前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor1執行了...後1111"); // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); } /** * success.jsp頁面執行後,該方法會執行 * @param request * @param response * @param handler * @param ex * @throws Exception */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor1執行了...最後1111"); } }
<!--配置攔截器--> <mvc:interceptors> <!--配置攔截器--> <mvc:interceptor> <!--要攔截的具體的方法--> <mvc:mapping path="/user/*"/> <!--不要攔截的方法 <mvc:exclude-mapping path=""/> --> <!--配置攔截器對象--> <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor1" /> </mvc:interceptor> <!--配置第二個攔截器--> <mvc:interceptor> <!--要攔截的具體的方法--> <mvc:mapping path="/**"/> <!--不要攔截的方法 <mvc:exclude-mapping path=""/> --> <!--配置攔截器對象--> <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor2" /> </mvc:interceptor> </mvc:interceptors>