В этой статье в основном кратко объясняется идея интеграции фреймворка.
1. Построение фреймворка Spring
Это очень просто, просто нужно зарегистрировать org.springframework.web.context.ContextLoaderListener в веб-контейнере и указать файл конфигурации загрузки Spring, после чего контейнер Spring будет создан. (Конечно, необходимо представить основной пакет jar для org.springframework)
Конечно, чтобы упростить поддержку приложений J2EE, обычно мы добавим следующее:
Spring отслеживает событие HTTP-запроса: org.springframework.web.context.Request.RequestContextListener
<!-- spring配置文件开始 -->
<context-param>
<param-name>contextConfigLocation</param-name><!-- spring配置文件,请根据需要选取 -->
<param-value>classpath*:webconfig/service-all.xml</param-value>
</context-param>
<listener><!-- Spring负责监听web容器启动和关闭的事件 --><!-- Spring ApplicationContext载入 -->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener><!-- Spring监听HTTP请求事件 -->
<!-- 使spring支持request与session的scope,如: -->
<!-- <bean id="loginAction" class="com.foo.LoginAction" scope="request"/> -->
<!-- 使用: -->
<!-- 1、注解获取:@Autowired HttpServletRequest request; -->
<!-- 2、java代码:HttpServletRequest request =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); -->
<!-- 3、直接在参数中传递:public String sayHi(HttpServletRequest request) -->
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener><!-- Spring 刷新Introspector防止内存泄露 -->
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring配置文件结束 -->
2. Построение Spring MVC
Во-первых, мы знаем, что ядром Spring MVC является org.springframework.web.servlet.DispatcherServlet, поэтому без его регистрации в веб-контейнере не обойтись. (Конечно, веб-пакеты, mvc-пакеты org.springframework и их зависимые пакеты jar необходимо импортировать)
<!-- spring mvc配置开始 -->
<servlet>
<servlet-name>Spring-MVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/spring-mvc.xml</param-value><!-- spring mvc配置文件 -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring-MVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- spring mvc配置结束 -->
В то же время, чтобы лучше использовать MVC, spring-mvc.xml необходимо настроить следующее:
1) (Необязательно) Конфигурация MultipartResolver, связанная с загрузкой файлов, требует библиотеки классов commons-io, commons-fileupload
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property><!-- 默认编码-->
<property name="maxUploadSize" value="104857600"></property><!-- 文件大小最大值-->
<property name="maxInMemorySize" value="40960"></property><!-- 内存中的最大值-->
</bean>
2) (Необязательно) Конфигурация локали (LocaleResolver)
3) (Необязательно) Конфигурация преобразователя тем (ThemeResolver)
4) (Обязательно) Конфигурация HandlerMapping, вы можете настроить несколько, обычно используйте RequestMappingHandlerMapping или пользовательский
Здесь мы настраиваем сопоставитель обработчика, наследуем и переписываем RequestMappingHandlerMapping, поддерживаем @RequestMapping без каких-либо параметров пути, чтобы автоматически загружать имена классов или методы в качестве сопоставления пути URL.
<bean id="handlerMapping"
class="io.flysium.framework.web.servlet.mvc.method.annotation.CustomHandlerMapping">
<property name="order" value="-1" />
</bean>
Реализация CustomHandlerMapping:
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class handlerType) {
RequestMappingInfo info = createRequestMappingInfoDefault(method);
if (info != null) {
RequestMappingInfo typeInfo = createRequestMappingInfoDefault(handlerType);
if (typeInfo != null)
info = typeInfo.combine(info);
}
return info;
}
private RequestMappingInfo createRequestMappingInfoDefault(AnnotatedElement element) {
RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element,
RequestMapping.class);
RequestCondition condition = (element instanceof Class)
? getCustomTypeCondition((Class) element)
: getCustomMethodCondition((Method) element);
/**
* 以类名和方法名映射请求,参照@RequestMapping
* 默认不需要添加任何参数(如:/className/methodName.do)
*/
String defaultName = (element instanceof Class)
? ((Class) element).getSimpleName()
: ((Method) element).getName();
return requestMapping == null
? null
: createRequestMappingInfo(requestMapping, condition, defaultName);
}
protected RequestMappingInfo createRequestMappingInfo(RequestMapping annotation,
RequestCondition<?> customCondition, String defaultName) {
String[] patterns = resolveEmbeddedValuesInPatterns(annotation.value());
if (patterns != null && (patterns.length == 0)) {
patterns = new String[]{defaultName};
}
return new RequestMappingInfo(
new PatternsRequestCondition(patterns, getUrlPathHelper(), getPathMatcher(),
this.useSuffixPatternMatch, this.useTrailingSlashMatch,
this.fileExtensions),
new RequestMethodsRequestCondition(annotation.method()),
new ParamsRequestCondition(annotation.params()),
new HeadersRequestCondition(annotation.headers()),
new ConsumesRequestCondition(annotation.consumes(), annotation.headers()),
new ProducesRequestCondition(annotation.produces(), annotation.headers(),
this.contentNegotiationManager),
customCondition);
}
5) (обязательно) Конфигурация HandlerAdapter, вы можете настроить несколько, в основном настроить messageConverters, основной функцией которых является сопоставление параметров внешней передачи для участия в методе обработки обработчика. Обычно расширяйте RequestMappingHandlerAdapter или настраивайте его. Если нам нужна обработка json-запросов, это нужно расширить. В то же время нам нужно обратить внимание на преобразование формата даты.
Кроме того, новые функции Spring 4.2 плюс аннотации автоматически вводят @ControllerAdvice, вы можете определить RequestBodyAdvice, ResponseBodyAdvice, вы можете более легко настроить обработку параметров.
<bean id="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="order" value="-1" />
<property name="messageConverters">
<list>
<!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"
/> -->
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
<property name="webBindingInitializer">
<bean
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService">
<!-- 针对普通请求(非application/json) 前台的日期字符串与后台的Java Date对象转化,
此情况,应使用spring
mvc本身的内置日期处理 -->
<!-- 可以在VO属性上加注解:@DateTimeFormat 需要类库joda-time -->
<bean
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
</bean>
</property>
</bean>
</property>
</bean>
<!-- json请求(application/json)返回值Date转String,全局配置 -->
<bean name="jacksonObjectMapper"
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="featuresToDisable">
<array>
<util:constant
static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
</array>
</property>
<!-- 如果想自定义,可以在VO属性上加注解:@JsonFormat(shape = JsonFormat.Shape.STRING, pattern
= Consts.DATE_PATTERN.DATE_PATTERN_OBLIQUE,timezone = "GMT+8") -->
<property name="simpleDateFormat">
<value>yyyy-MM-dd HH:mm:ss</value>
</property>
</bean>
<!--避免IE执行Ajax时,返回JSON出现下载文件 -->
<!-- 自定义 -->
<bean id="mappingJacksonHttpMessageConverter"
class="io.flysium.framework.http.converter.json.CustomJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
6) (Необязательно) Конфигурация HandleRexceptionResolver, вы можете настроить несколько, после настройки исключения контроллера, как мы обрабатываем, обычно журнал или обратную связь можно настроить.
7) (Необязательно) Запрос на просмотр конфигурации транслятора имен (RequestToViewNameTranslator), RequestToViewNameTranslator можно использовать для получения viewName в соответствии с запросом, когда представление, возвращаемое процессором, пусто.
8) (Необязательно) Конфигурация преобразователя представления (ViewResolver), вы можете настроить несколько, определить префикс и суффикс файла для перехода, конфигурацию режима просмотра, в основном для @Controller, чтобы вернуть анализ пути просмотра ModelAndView, и метод для перейти к следующему контроллеру Возвращаемая строка имеет префикс и суффикс, чтобы стать пригодным для использования URL-адресом.
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</bean>
Наконец, добавьте сканирование компонентов в контроллер, чтобы уменьшить конфигурацию xml и добавить аннотации непосредственно в код Java.
<!-- 自动扫描类包,将标志Spring注解的类自动转化为Bean,同时完成Bean的注入 -->
<!-- 扫描控制器 -->
<context:component-scan base-package="io.flysium" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.RestController" />
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
3. Интеграция Mybatis
Чтобы интегрировать mybatis в среду Spring, нам понадобится пакет jar mybatis и пакет jar интеграции mybatis-spring. Затем зарегистрируйте и настройте org.mybatis.spring.SqlSessionFactoryBean (требуется источник данных и указывает файл конфигурации Mybatis) и org.mybatis.spring.SqlSessionTemplate в контейнере Spring.
Дополнительные сведения об интеграции см. в проекте Git: https://git.oschina.net/svenaugustus/app-ss4m-less.
В настоящее время, в дополнение к SSM, он также интегрирует Redis (поддерживает переключение конфигурации одного узла, конфигурации Master-Plave Sentinel, конфигурацию кластера) и Spring Sessions.
Он включает в себя простую демонстрацию Spring MVC для обучения и общения.
У меня есть общедоступная учетная запись WeChat, и я часто делюсь галантерейными товарами, связанными с технологией Java; если вам нравится мой обмен, вы можете использовать WeChat для поиска «Java Head» или «javatuanzhang», чтобы подписаться.