Spring MVC主要組件

Spring MVC是一個基於Java語言的Web框架,是Spring Framework的一部分。它提供了用於構建Web應用程序的基本架構,通過與其他Spring框架組件集成,使開發Web應用程序更加容易。

一、DispatcherServlet

DispatcherServlet是Spring MVC的核心。它是一個Servlet,用於攔截並處理所有用戶請求。當請求到達DispatcherServlet時,它會將請求路由到相應的控制器,並將響應返回給用戶。DispatcherServlet可以通過Java配置或XML配置進行配置。

Java配置:

@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {

  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Bean
  public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }

}

XML配置:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">

  <mvc:annotation-driven/>

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
  </bean>

</beans>

二、HandlerMapping

HandlerMapping是Spring MVC的另一個核心組件,它的作用是將請求映射到相應的控制器。當請求到達DispatcherServlet時,DispatcherServlet將委託HandlerMapping來尋找相應的處理程序,處理程序可以是Controller方法、Servlet、後端服務等。

Java配置:

@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {

  @Autowired
  private MyController myController;

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

  @Override
  public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseSuffixPatternMatch(false);
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor());
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
  }

  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false).favorParameter(true).parameterName("mediaType").ignoreAcceptHeader(true).useJaf(false)
        .defaultContentType(MediaType.APPLICATION_JSON).mediaType("html", MediaType.TEXT_HTML)
        .mediaType("json", MediaType.APPLICATION_JSON);
  }

  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(new MyArgumentResolver());
  }

  @Override
  public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
    returnValueHandlers.add(new MyReturnValueHandler());
  }

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MyMessageConverter());
  }

  @Bean
  public HandlerMapping handlerMapping() {
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
    Properties mappings = new Properties();
    mappings.put("/hello", myController);
    mapping.setMappings(mappings);
    return mapping;
  }

  // Other beans...

}

XML配置:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">

  <mvc:annotation-driven/>

  <mvc:view-controller path="/" view-name="index"/>
  <mvc:resources mapping="/resources/**" location="/resources/"/>
  <mvc:interceptors>
    <bean class="com.example.MyInterceptor"/>
  </mvc:interceptors>
  <mvc:path-matching suffix-pattern="false"/>
  <mvc:content-negotiation favor-parameter="true" parameter-name="mediaType" ignore-accept-header="true">
    <mvc:default-content-type value="application/json"/>
    <mvc:media-type extension="html" type="text/html"/>
    <mvc:media-type extension="json" type="application/json"/>
  </mvc:content-negotiation>
  <mvc:argument-resolvers>
    <bean class="com.example.MyArgumentResolver"/>
  </mvc:argument-resolvers>
  <mvc:return-value-handlers>
    <bean class="com.example.MyReturnValueHandler"/>
  </mvc:return-value-handlers>
  <mvc:message-converters>
    <bean class="com.example.MyMessageConverter"/>
  </mvc:message-converters>

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
  </bean>

  <bean name="/hello" class="com.example.MyController"/>

</beans>

三、Controller

Controller是處理客戶端請求並返回對應響應的組件。它包含一個或多個處理程序方法,每個方法都由 @RequestMapping注釋進行標記,以指示它們應該處理哪些URL和HTTP方法。

Java配置:

@Controller
public class MyController {

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello(Model model) {
    model.addAttribute("message", "Hello, World!");
    return "hello";
  }

}

XML配置:

<bean name="/hello" class="com.example.MyController"/>

四、ViewResolvers

ViewResolvers負責將字符串形式的視圖名解析為實際的視圖。Spring框架提供了多個實現,包括 InternalResourceViewResolver(用於JSP視圖)、TilesViewResolver(用於Tiles視圖)和 FreeMarkerViewResolver(用於FreeMarker視圖)等

Java配置:

@Bean
public InternalResourceViewResolver viewResolver() {
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setPrefix("/WEB-INF/views/");
  resolver.setSuffix(".jsp");
  return resolver;
}

XML配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
</bean>

原創文章,作者:TRIMK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/373526.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TRIMK的頭像TRIMK
上一篇 2025-04-27 15:26
下一篇 2025-04-27 15:26

相關推薦

發表回復

登錄後才能評論