1. 組件介紹
1.1 DispatcherServlet
統(tǒng)一收口,接收請求,響應結果,相當于轉發(fā)器,中央處理器。
有了 DispatcherServlet 減少了其它組件之間的耦合度。
1.2 HandlerMapping-處理器映射器
根據(jù)請求的url查找Handler,既負責完成客戶請求到 Controller 映射。
SpringMVC提供了不同的映射器實現(xiàn)不同的映射方式,
例如:配置文件方式、實現(xiàn)接口方式、注解方式等。
1.3 HandlerAdapter-處理器適配器
按照特定規(guī)則去執(zhí)行Handler。
1.4 Handler-處理器 也叫 Controller
Handler 是繼 DispatcherServlet 前端控制器的后端控制器,
在 DispatcherServlet 的控制下,Handler對具體的用戶請求進行處理。
1.5 視圖解析器ViewResolver
進行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據(jù)邏輯視圖名解析成物理視圖名,即具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結果通過頁面的展示給用戶。
SpringMVC框架提供了很多View視圖類型,
包括:JSTLView、freemarkerView、pdfView等等.
1.6 視圖View
View是一個接口,實現(xiàn)類支持不同的View類型(jsp、freemarker…),
一般情況下需要通過頁面標簽或者頁面模板技術將模型數(shù)據(jù)通過頁面展示給用戶,需要由程序員根據(jù)業(yè)務需求開發(fā)具體的頁面。
總結: 需要我們開發(fā)的工作只有處理器 Handler 的編寫以及視圖比如JSP頁面的編寫。
2. 組件配置說明
2.1 配置前端控制器(DispatcherServlet)
在web project的web.xml中配置:
<!-- 配置前端控制器DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--springmvc.xml 是自己創(chuàng)建的SpringMVC全局配置文件,用contextConfigLocation作為參數(shù)名來加載
如果不配置 contextConfigLocation,那么默認加載的是/WEB-INF/servlet名稱-servlet.xml,在這里也就是
springmvc-servlet.xml 參數(shù)多個值使用逗號隔開,如:a.xml,b.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
?
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--第一種配置:*.do,還可以寫*.action等等,表示以.do結尾的或者以.action結尾的URL都由前端控制器DispatcherServlet來解析
第二種配置:/,所有訪問的 URL 都由DispatcherServlet來解析,但是這里最好配置靜態(tài)文件不由DispatcherServlet來解析,需要對靜態(tài)資源單獨處理
錯誤配置:/*,注意這里是不能這樣配置的,因為如果這樣寫,最后轉發(fā)到 jsp 頁面的時候,仍然會由DispatcherServlet進行解析, 而這時候會找不到對應的Handler,從而報404?。。?-->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.2 配置處理器映射器(HandlerMapping)
在 springmvc.xml 文件中配置,是請求的 URL 怎么能被 SpringMVC 識別,從而去執(zhí)行我們編寫好的 Handler。
(1) 第一種方法
<!-- 配置Handler 通過name的值為url來請求-->
<bean name="/hello2" class="com.beiyou.controller.HelloController2" />
//Handler
//我們的這個controller 就是一個Handler(執(zhí)行器)
public class HelloWord2 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
//如果xml統(tǒng)一配置路徑,可以簡寫程文件名
mv.setViewName("success");
mv.addObject("msg","今天天氣很冷");
return mv;
}
}
這樣配置的話,那么請求的 URL,必須為 http://ip:port/hello2
(2) 第二種方法
<!-- 配置Handler 通過key值做為url來訪問對應的bean-->
<bean id="hello2" class="com.beiyou.controller.HelloController2" />
<bean id="hello3" class="com.beiyou.controller.HelloController3" />
<!-- 簡單URL配置處理器映射器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello2">hello2</prop>
<prop key="/hello3">hello3</prop>
</props>
</property>
</bean>
這種配置請求的 URL可以為 http://ip:prot/項目名/hello,或者http://ip:port/項目名/hello2
2.3 配置處理器適配器(HandlerAdapter)
在 springmvc.xml 文件中配置,用來約束我們所需要編碼的 Handler類。
第一種
編寫 Handler 時必須要實現(xiàn) Controller,否則不能被適配器解析。
<!-- 配置處理器適配器,所有適配器都得實現(xiàn) HandlerAdapter接口 處理器必須實現(xiàn)controller接口的handler-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
第二種
編寫 Handler 時必須要實現(xiàn) HttpRequestHandler
<!-- 配置處理器適配器第二種方法,這樣配置所有Handler都必須實現(xiàn) HttpRequestHandler接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
??
1、如果沒有指明,則可以同時處理實現(xiàn)Controller接口和HttpRequestHandler接口的handler。
2、如果指明其中一種,則要求所有的hander類都必須實現(xiàn)對應的接口,否則無法訪問。
2.4 處理器(Handler,即我們的Controller)
在 springmvc.xml 文件中配置.,就是請求的 URL
到我們這里所編寫的 Handler 類的某個方法進行一些業(yè)務邏輯處理。
兩個處理器適配器來約束 Handler,通過上面兩種配置分別編寫兩個 Handler:
(1) 第一種
實現(xiàn)Controller 接口
//Handler
//我們的這個controller 就是一個Handler(執(zhí)行器)
public class HelloWord implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
//如果xml統(tǒng)一配置路徑,可以簡寫程文件名
mv.setViewName("success");
mv.addObject("msg","今天天氣很冷");
return mv;
}
}
(2) 第二種 HttpRequestHandler
public class HelloController2 implements HttpRequestHandler {
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("msg", "測試數(shù)據(jù)");
request.getRequestDispatcher("/WEB-INF/success.jsp").forward(request, response);
}
}
? 通常我們使用第一種方式來編寫 Handler ,但是第二種如果不需要渲染視圖,我們可以通過 response 修改相應內容,比如返回 json 數(shù)據(jù):如下圖:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json字符串");
//controller示例
public class HelloWord2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
?
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json字符串");
}
}
2.5 配置視圖解析器(ViewResolver)
1.簡單配置:
<!-- 配置視圖解析器 進行jsp解析,默認使用jstl標簽,classpath下得有jstl的包-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
<!--如果這樣配,那么在 Handler 中返回的必須是完整路徑(含完整文件名)。-->
2.完整配置:
<!--配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 返回視圖頁面的前綴 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 返回頁面的后綴 -->
<property name="suffix" value=".jsp"></property>
</bean>
如果這樣配,那么在 Handler 中只需要返回在 pages 文件夾下的jsp 頁面名稱就可以了。
3. 基本配置
3.1 常規(guī)配置(Controller加載控制)
- SpringMVC的處理器對應的bean必須按照規(guī)范格式開發(fā),未避免加入無效的bean可通過bean加載過濾器進行包含設定或排除設定,表現(xiàn)層bean標注通常設定為@Controller
xml方式
<context:component-scan base-package="com.by">
<!--指定包掃描的包含controller-->
<context:include-filter
type="annotation"
expression="org.springframework.stereotype.Controller"/>
<!--開啟注解掃描-->
</context:component-scan>
context:include-filter有兩個必須的屬性:
type: 配置filter的類型,這個類型一共有以下五個值:
assignable — 指定掃描某個接口派生出來的類
annotation — 指定掃描使用某個注解的類
aspectj — 指定掃描AspectJ表達式相匹配的類
custom — 指定掃描自定義的實現(xiàn)了
expression: 根據(jù)type的不同,這個表達式的配置方式也不同。
1、assignable 的用法
創(chuàng)建接口類:
//標簽
public interface Label {
}
Seller類: 注意,我們在Seller類上方添加了標準注解@Component,所以Seller類會被spring加載
//供應商
@Component
public class Seller {
}
ManuFacture類:ManuFacture類沒有標注注解,理論上不會被Spring加載。但是ManuFacture類實現(xiàn)了接口Lable
//廠商
public class ManuFacture implements Label{
}
spring-mvc.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
?
<context:component-scan base-package="com.by.pojo">
<!-- 通知spring將實現(xiàn)接口Label的類也加載進來 -->
<context:include-filter type="assignable"
expression="com.by.pojo.Label"/>
</context:component-scan>
<!--開啟注解掃描-->
<mvc:annotation-driven/>
</beans>
測試類:
public class AppTest {
?
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-mvc.xml");
System.out.println(ac.getBean(Seller.class));
System.out.println(ac.getBean(ManuFacture.class));
}
}
加入servlet-api: 使用完刪除
<dependency>
<groupId>tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>5.5.23</version>
</dependency>
2、annotation — 指定掃描使用某個注解的類
創(chuàng)建一個注解接口類: 類似@Controller
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnno {
}
ManuFacture加上我們配置的注解
@DemoAnno
public class ManuFacture {
}
spring-mvc.xml配置:
<!-- 通知spring將有指定注解的類加載進來 -->
<context:include-filter type="annotation" expression="com.by.pojo.DemoAnno"/>
測試類不變:直接運行
**3、aspectj-**指定掃描AspectJ表達式相匹配的類:比如要求加載某個類的派生類
這里需要添加AspectJ的依賴:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.20</version>
</dependency>
我們添加一個新的CommBar類:
public class CommBar {
}
繼續(xù)修改我們的ManuFacture類,不實現(xiàn)接口,不需要注解,只要繼承CommBar類即可。
public class ManuFacture extends CommBar{
}
mvc.xml配置
<!-- 通知spring所有繼承和擴展自指定類的類全部加載進來 -->
<context:include-filter type="aspectj" expression="com.by.pojo.CommBar+"/>
直接測試運行
**4、custom—**指定掃描自定義的實現(xiàn)了org.springframework.core.type.filter.TypeFilter接口的類
繼續(xù)修改我們的ManuFacture類,不實現(xiàn)接口,不需要注解,不繼承任何類。
public class ManuFacture {
}
我們添加一個MyFilter實現(xiàn)TypeFilter接口:
public class MyFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
//這里判斷讀取的類型是否是ManuFacture,如果是就返回true,否則返回false;
// 返回true就會被spring加載,否則不加載
if(metadataReader.getClassMetadata().getClassName().equals(ManuFacture.class.getName())){
return true;
}
return false;
}
}
mvc配置類:
<!-- 通知spring根據(jù)我們配置的MyFilter類進行加載 這里的 expression要配置我們自己的MyFilter -->
<context:include-filter type="custom" expression="com.by.pojo.MyFilter"/>
直接運行即可
回到之前的配置:
<context:component-scan base-package="com.by">
<!--指定包掃描的包含controller-->
<context:include-filter
type="annotation"
expression="org.springframework.stereotype.Controller"/>
<!--開啟注解掃描-->
</context:component-scan>
controller中編寫:
@Controller
public class HelloWord2 {
@RequestMapping("/hello2")
public ModelAndView handleRequest() throws ServletException, IOException {
ModelAndView mv=new ModelAndView();
mv.setViewName("success");
mv.addObject("msg","給不了的永遠都是空的");
return mv;
}
}
使用 @EnableWebMvc 注解 代替配置
<mvc:annotation-driven> 和 @EnableWebMvc 解析
這兩個起到的作用是類似的(避免重復注冊,二選一即可), 都是注冊了大部分spring mvc開發(fā)所需的bean(HandlerMapping,HandlerAdapter等等),
還有根據(jù)包存在添加messageConverter(例如jackson,以支持@ResponseBody).
配置類編寫文章來源:http://www.zghlxwxcb.cn/news/detail-538468.html
@Configuration
//開啟 Spring MVC注解驅動
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
/*
配置視圖解析器
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
//注冊到視圖配置中
registry.viewResolver(resourceViewResolver());
}
/**
* 配置請求視圖映射
*/
private InternalResourceViewResolver resourceViewResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
//請求視圖的前綴
viewResolver.setPrefix("/WEB-INF/");
//請求視圖的后綴
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
controller編寫:文章來源地址http://www.zghlxwxcb.cn/news/detail-538468.html
@Controller
public class HelloWord3 {
@RequestMapping("/hello3")
public ModelAndView query() {
ModelAndView mv=new ModelAndView();
//如果xml統(tǒng)一配置路徑,可以簡寫程文件名
mv.setViewName("success");
mv.addObject("msg","使用配置類操作");
return mv;
}
}
到了這里,關于Spring mvc 組件介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!