springmvc小結(上)
1.springmvc的整體結構以及流程
①.前端控制器:只需要在web.xml檔案中配置即可
作用:接受請求,處理響應結果,轉發器,中央處理器
②.處理器對映器:根據請求的url找到相應的Handler
③.處理器介面卡:呼叫處理器Handler/controller的方法
④.處理器Handler(Controller)後端控制器,接受使用者請求的資料,呼叫業務方法處理請求
⑤.檢視解析器ViewResolver:檢視解析,把邏輯檢視轉換為真正的物理檢視
⑥.檢視View:把資料展現給使用者
2.預設的註解
在不進行配置的的時候有預設配置的在此檔案中,預設進行配置。
# Default implementation classes for DispatcherServlet's strategy interfaces. # Used as fallback when no matching beans are found in the DispatcherServlet context. # Not meant to be customized by application developers. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解對映器。
在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解對映器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter註解介面卡。
在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解介面卡。
3.<mvc:annotation-driven>
預設是:基於註解對映器和基於註解的介面卡
支援型別轉換ConversionService
@NumberFormat,DateTimeFormate
@Validdate,JSR303校驗
@RequestBody,@ResponseBody
4.@RequestMapping
用來處理請求地址(URL)對映的註解,可以在類或者方法上面
如果在類上就代表所有的請求方法URL都必須有類上的URL地址作為父路徑
屬性:
①.value和path一樣,指定請求的URL
method:指定請求的不同方式:GET,POST,PUT,DELETE....
②.指定請求和響應的MedlaType
consumes:指定請求內容格式:Content-Type=application/json
produces:指定響應內容格式:application/json;charset=UTF-8
③.
params:指定request中必須包含某些引數值,包含方法處理
handlers:指定request中必須包含指定的header,包含才能處理
同時還可以窄化請求對映:即把其寫在類上面
@RequestMapping("/user") public classuser{ @RequestMapping("/login") public String login(){ ... } }
5.前端控制器url-pattern
前端控制器的配置:
①. * .副檔名,比如*.action,不會導致靜態的資原始檔被攔截的問題。但是不支援RESTFULL風格的編碼 ②. /支援RESTFull風格,但是會導致靜態的資原始檔被攔截 ③./* ,錯誤的方式,可以請求到Controller方法,但是跳轉到JSP時會被攔截,JSP不能正常顯示
②. /支援RESTFull風格,但是會導致靜態的資原始檔被攔截
因為在tomcat檔案中處理靜態檔案資源的servlet叫default,二default的對映路徑就是 /.
啟動專案的時候:
1.啟動Tomcat載入web.xml檔案 /
2.啟動i專案時候 載入web.xml檔案 /
專案中的web.xml檔案覆蓋了 Tomcat中的web.xml配置檔案對映規則
解決方法:
1.在專案總的web.xml檔案
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern> *.jsp</url-pattern> <servlet-mapping> ... jsp png
2.使用mvc中的標籤
在springmvc.xml檔案中
<!--處理預設的靜態資源的檔案請求 --> <mvc:default-servlet-handler/>
將mvc上下文中定義一個DefaultServletHttpRequestHandler,對所有的前端控制器的請求組篩選和盤查,
如果發現沒有經過對映請求,就交給Tomcat的預設servlet來處理
3.資源對映
<!--資源對映 --> <mvc:resourceslocation=""mapping=“”/>
自己來處理靜態的資源,而且還多了很多的功能
方法2.是交給Servlet來處理
6.請求和響應
1.響應處理:
①.返回為void
@RequestMapping("/test1") public void test1(HttpServletRequestreq,HttpServletResponse resp) throws ServletException,IOException{ //請求轉發 req.getRequestDispatcher("").forward(req, resp); //請求的重定向 resp.sendRedirect(""); //設定共享資料 req.setAttribute("", ""); //輸出json resp.setContentType("text/json;charset=utf-8"); resp.getWriter().append(""); }
//返回為void檔案下載 @RequestMapping("/test2") public void test2(OutputStream out) throws IOException{ Files.copy(Paths.get("D:/Photo/bg.jpg"), out); }
②.返回ModelAndView
@RequestMapping("/test3") public ModelAndView test3(){ ModelAndView mv = new ModelAndView(); mv.setViewName("/WEB-INF/views/test.jsp"); //設定共享的資料的key和value mv.addObject("msg", "test3...."); //設定共享資料的value,此時會把value型別的首字母小寫作為keykey=string mv.addObject("只有值的共享資料"); return mv; }
③.返回String
//返回String //需要結合Model進行結合使用 @RequestMapping("/test4") public String test4(Model model){ model.addAttribute("msg", "return string"); return "test"; }
2.請求跳轉
①.請求轉發
原理:req.getRequestDispatcher("").forward(req, resp);
//請求轉發 //瀏覽器的地址不變還可以共享資料 @RequestMapping("/test5") public String test5(Model model){ model.addAttribute("msg", "請求轉發"); return "forward:/index.jsp"; }
②.URL重定向
位址列改變,資料不能共享
//重定向 @RequestMapping("/test6") public String test6(Model model){ model.addAttribute("msg", "請求重定向"); return "redirect:/index.jsp"; }
請求轉發和重定向:
區別:
轉發:位址列不變,可共享資料
重定向:地址 改變,不能共享資料
訪問資源的時候前面帶上 / 表示絕對路徑 從根路徑去尋找資源
訪問資源的時候不帶 / 表示相對路徑, 從上一級上下文進行尋找資源
③.傳統開發中,重定向的時候,進行兩次的不同請求,所以不能進行資料的共享
假設要求重定向還要共享資料
note: Flash屬性,只能使用從contrlooer 重定向到controller,不能到jsp
3.請求引數處理
①.陣列
//陣列的形式 //接受一個引數有多個值得情況 @RequestMapping("/test4") public void test4(Long [] ids){ System.out.println(Arrays.asList(ids)); }
②.pojo
@RequestMapping("/test4") public void test4(User user){ System.out.println(Arrays.asList(user)); }