一.手動配置方式
1.web.xml中DispatcherServlet控制器的的配置
SpringMVC也是一種基於請求驅動的WEB框架,並且使用了前端控制器的設計模式。前端控制器就是DispatcherServlet控制器,只要滿足web.xml文件中的【url-pattern】的規則,這個請求就會交給這個前端控制器(DispatcherServlet),然而前端控制器在收到請求后自己不進行任何處理,根據相應的【URL的映射規則】委托給其他的頁面控制器進行處理請求。前端控制器只作為一個統一的訪問點,進行全局的流程控制。
contextConfigLocation的值指定springmvc的配置文件位置
Servlet攔截匹配規則可以自已定義,攔截哪種URL合適?
當映射為@RequestMapping("/user/add")時,為例
1、攔截*.do、*.htm, 例如:/user/add.do
這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。
2、攔截/,例如:/user/add
可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。
弊端:會導致靜態文件(jpg,js,css)被攔截后不能正常顯示。想實現REST風格,事情就是麻煩一些。后面有解決辦法還算簡單。
3、攔截/*,這是一個錯誤的方式,請求可以走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。
<!-- springMVC前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- contextConfigLocation配置springmvc加載的配置文件;如果不配置默認加載的是/WEB-INF/servlet名稱-servlet.xml --> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 第一種:*.action 以.action結尾的由DispatcherServlet解析 --> <!-- <url-pattern>*.action</url-pattern> --> <!-- 第二種:/ 所有的訪問地址都由DispatcherServlet解析,對於靜態文件的解析需要配置不讓DispatcherServlet解析;使用此種方式可以實現RESTful風格的url--> <url-pattern>/</url-pattern> </servlet-mapping>
手動指定spring配置文件的位置,需要使用ServletContext的初始化參數
<!-- 手動指定spring配置文件的位置,需要使用ServletContext的初始化參數 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/application-dao.xml,classpath:spring/application-service.xml,classpath:spring/application-transaction.xml</param-value> </context-param>
配置spring提供的監聽器,用於監聽servletContext對象的創建,同時為我們創建spring容器放在servletContext中
<listener> <!-- 配置spring提供的監聽器,用於監聽servletContext對象的創建,同時為我們創建spring容器放在servletContext中,需導spring-web-4.3.8.RELEASE.jar 默認情況下:這個配置只能加載位置是在WEB-INF目錄中的spring配置文件,同時文件名必須是applicationContext.xml(所以spring配置文件在其它位置時需要手動指定配置文件位置) --> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
2.在springmvc.xml中配置1.處理器映射器 2.處理器適配器 3.視圖解析器(注意默認使用了jstl,所以必須導入jstl包)
上述視圖解析器配置了前綴和后綴兩個屬性,因此控制器類的視圖路徑僅需提供文件名,視圖解析器將會自動添加前綴和后綴。
例如:1.視圖解析器中設置了這兩個屬性時
<property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property>
2.Controller類中返回的ModelAndView設置了放回視圖名:modelAndView.setViewName("items");
3.則訪問controller成功后訪問的url為...../WEB-INF/jsp/items.jsp
<!-- 配置處理器映射器 在配置Controller時需要指定bean的name;bean的name作為url進行查找 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 配置處理器適配器 ;所有的處理器適配器都實現了HandlerAdapter接口 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- 視圖解析器 ;解析jsp,默認使用jstl標簽,所以必須導jstl包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 設置view的前綴 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 設置view的后綴 --> <property name="suffix" value=".jsp"></property> <!-- 指定前后綴后modelAndView.setViewName("");自動在前后加上前后綴 --> </bean>
3.編寫controller的java代碼
手動配置controller時對應的java類需實現Controller接口,並重寫實現方法
public class ItemController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String name = "普通name"; //返回ModelAndView ModelAndView modelAndView = new ModelAndView(); //相當於request的setAttribute(); modelAndView.addObject("name",name); //指定視圖 modelAndView.setViewName("items"); return modelAndView; } }
4.在springmvc.xml中配置controller
<!-- 配置Controlle --> <bean name="/queryItems.action" class="cn.controller.ItemController"></bean>
二.注解方式
1.web.xml配置與以上手動配置controller的web.xml一樣
2.springmvc.xml中配置注解映射器和注解適配器
方式一:
<!-- (注解)映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <!-- (注解)適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
方式二:
<!-- 使用<mvc:annotation-driven>可以代替上邊注解映射器和注解適配器 ,它默認加載很多參數綁定方法 比如json轉換解析器就默認加載了,實際開發用這個--> <mvc:annotation-driven></mvc:annotation-driven>
3.編寫通過注解實現的controller的java代碼
//使用@Controller說明此類是一個控制器 @Controller //為了對url進行分類管理,可以在這里定義根路徑,比如此例子訪問url為/item/queryItems @RequestMapping("/item") public class AnnotationController { @Autowired private ItemService itemService; /** * 查詢item * @param itemQueryVo * @return */ //@RequestMapping實現方法和url的映射,一個方法對應一個url,一般值設置和方法名一樣 @RequestMapping("/queryItems") public ModelAndView queryItems(ItemQueryVo itemQueryVo) { ModelAndView modelAndView = new ModelAndView(); List<ItemCustom> itemsList = itemService.findItemsList(itemQueryVo); //相當於request的setAttribute(); modelAndView.addObject("itemsList",itemsList); //指定視圖 modelAndView.setViewName("item/itemsList"); return modelAndView; }
4.springmvc.xml中配置注解的controller
<!-- 掃描單個 --> <!-- <bean class="cn.controller.AnnotationController"></bean> -->
<!-- 掃描包下的 --> <context:component-scan base-package="cn.controller"></context:component-scan>