【SpringMVC】環境搭建、namespace、控制器跳轉、請求引數接收(時間處理)、亂碼解決、作用域
阿新 • • 發佈:2020-09-08
SpringMVC 框架
1).環境搭建---第一個SpringMVC控制器、控制器生命週期
注意:這裡的Spring MVC配置大都在mvc.xml中配置 (1)SpringMVC 特點: ① SpringMVC天然整合Spring(SpringMVC本身就是spring技術的一部分) ② SpringMVC自帶小Spring工廠,SpringMVC控制器可以使用spring工廠管理 ③ Struts2效能低於SpringMVC ④ SpringMVC對映控制器的訪問路徑,可以使用註解的方式 (2)環境搭建 編碼: 1) 匯入jar spring相關的jar(webmvc.jar) 日誌的jar 2) 匯入配置檔案 mvc.xml log4.properties; 3) 初始化配置 web.xml初始化: ① 配置DispatcherServlet核心控制器[Servlet]---org.springframework.web.servlet.DispatcherServlet】 ② 指定mvc.xml檔案路徑: mvc.xml初始化 ① 開啟註解管理物件 ② 開啟springmnv註解開發mvc;(使用註解對映訪問路徑) web.xml初始化: mvc.xml初始化 第一個Controller 核心思想 編碼步驟: ① 編寫一個控制器程式 @Controller public class FirstController{ @RequestMapping("/controller的方法路徑") public String hello(){ return “跳轉方式:/url-patton”; } } ② 交給spring工廠管理:@Controller ③ 對映控制方法的訪問路徑:@RequsetMapping(“/名”) ④ 訪問:http://ip:port/專案名/方法上的RequestMapping指定的路徑.do 控制器的生命週期: Struts2的action建立多個:每次請求都要建立新的 SpringMVC的Controller,只需要一個即可。沒有資料屬性,本質是執行緒安全的(不能再屬性中定義資料變數) 建立時機:tomcat啟動時,(初始化mvc的核心控制器,讀取mvc配置檔案,註解生效,掃描控制器),就建立了Controller,只建立一個 可以使用Servlet的API: public class XxxController{ public String xx(HttpServletRequest req,HttpServletResponse resp){ //使用req,和resp } }
2).SpringMVC的namespace、控制器跳轉、請求引數接收(時間處理)、亂碼解決
(1)namespace:@RequestMapping(“/namespace訪問名字”) 放在控制器類上面進行註解 作用: 對映訪問路徑 語法: ① 寫在方法上----表明方法的訪問路徑 ② 寫在類上------表明控制器方法訪問的namespace a: 訪問控制器方法訪問路徑: /類上的RequestMapping的路徑/方法上的RequestMapping的路徑 b: 將同一個業務模組下的多個控制器方法,放在一個控制器類 將同一個業務模組下的多個控制器方法訪問路徑,放在同一個namespace下 (2)控制器跳轉 核心思路(編碼):return "跳轉方式:/目標路徑的url-pattern"; ① 請求轉發:(伺服器內部跳轉) Controller--->JSP:return "forward:/目標jsp的url-pattern路徑"; Controller---->Controller:return "forward:/類上的RequestMapping路徑/目標跳轉方法上的Requestmapping路徑.do"; 總結:return "forward:/目標路徑的url-pattern"; ② 重定向:(伺服器外部跳轉) 方式:return "redirect:/目標路徑的url-pattern"; (3)請求引數的接收 ① 基本資料型別 + String資料資料收集 使用方式:直接在方法上宣告變數接受即可 優點:不用像struts2提供set和get、自動轉化型別 ② 接受陣列型別的值:在方法上宣告陣列型別引數即可 ③ 直接接受物件型別 使用:在方法上宣告物件型別引數、引數名必須接受控制器的方法形參的實體屬性名一致 ④ 接收物件(實體)屬性時間格式的轉換: @DateTimeFormat(pattern="yyyy-MM-dd") spring接收引數自動封裝物件時轉換,屬性宣告上使用 (4)亂碼問題 ① get請求亂碼解決辦法: 修改tomcat的conf/server.xml <Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> ② Post請求亂碼解決辦法: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); ③ Spring解決(提供過濾器,需要配置使用) post請求和響應編碼設定核心思想 Springweb提供該編碼設定的Filter:org.springframework.web.filter.CharacterEncodingFilter
3).SpringMVC作用域操作(存/取)、複雜請求引數接收(多個物件接收、日期)
(1)SpringMVC作用域操作 方式一:在方法上宣告HttpServletRequest、HttpServletResponse物件 方式二:Spring提供 1) ModelMap ① Request作用域[存]: 作用:代替request作用域,資料存入ModelMap,自動講資料放入Request作用域 獲得ModelMap:方法上引數宣告ModelMap mm 存入方法:modelMap.addAttribute("name",值 物件 資料) JSP獲取:${requestScope.name} ② Session作用域[存]: 使用:在類上新增@SessionAttribute({"modelmap資料的name","modelmap資料的name"}) 作用:對應的moldelmap中的資料,自動拷貝到Session作用域中 使用方式:ModelMap + @SessionAttributes({"modelmap中資料的name"}) 2) 其他作用操作相關的物件:Model 作用:資料存入,相當於放入request作用域(功能與ModelMap一樣) 使用:同ModelMap 3) Map (java.util.Map) 作用:相當於request作用域 獲得:方法宣告 Map map 使用:map.put("name",值); 4) ModelAndView 作用:model作用+跳轉路徑的作用 獲得:引數宣告ModelAndView 向request作用域存入:mav.addObject("作用域資料的name",值); 設定跳轉路徑:mav.setViewName("跳轉方式:/目標資源url-pattern"); 使用: public ModelAndView xxx(ModelAndView mav) { mav.addObject("name",值); //1. 向requset作用域存入一個數據 mav.setViewName("跳轉方式:/目標資源url-pattern"); //2. 跳轉到xxx.jsp return mav; } *獲得作用域值:SpringMVC作用域高階[面試+獲得作用域中的值,使用web相關物件 ① 在方法上宣告Servlet相關的物件:HttpServletRequest、HttpServletResponse、HttpSession 呼叫getAttribute(“name”)取值 ② 允許直接從spring工廠中獲得:HttpServletRequest、HttpServletResponse、HttpSession @Controller public class MyController { @Autowired private HttpServletRequest request; @Autowired private HttpServletSession session; @Autowired private HttpServletResponse response; } 原理: 從spring工廠中,獲得所謂的HttpSession/HttpServletRequest,其實是spring提供的代理物件、通過在代理物件方法內部,獲得真正的session和request,呼叫對應的方法 ③ 方式3:RequestContextHolder RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); // RequestAttributes作用:可以獲得httpServletReq HttpServletResp物件 ServletRequestAttributes attrs = (ServletRequestAttributes) attributes; attrs.getRequest();//獲得request物件 attrs.getResponse();//獲得response物件 //RequestAttributes作用:可以操作request和session作用域 attrs.setAttribute("user1", "蔣文明", RequestAttributes.SCOPE_SESSION); //將資料存入session作用域 attrs.setAttribute("user1", "蔣文明", RequestAttributes.SCOPE_REQUEST); //將資料存入request作用域 attrs.getAttribute("name",RequestAttributes.SCOPE_SESSION); //從session作用域中獲得name對應的資料 (2)SpringMVC複雜請求引數接收 1) 集合物件的收集(一次性提交多個相同型別資料,或基本資料,或實體物件) SpringMVC複雜物件型別收集核心:基於控制器方法引數的屬性名。封裝DTO(Data Transfer Object資料傳輸物件)物件,由客戶端傳遞給控制器 命名: XxxDTO 2) 日期型別的接受: 方式一:在要接受的屬性上加@DateTimeFormat (pattern=”yyyy/MM/dd”) 方式二:核心思路 型別轉化器的開發步驟: ① 自定義一個類實現,Converter介面(Spring提供) ② 將型別轉起物件管理型別轉化工廠內部(使用SpringMVC的工廠) ③ 在mvc:annotation-drive中開啟使用自定義型別轉起的使用