网站后台管理系统登录,精华吧网页搜题,建设银行天津分行门户网站,商务网站建设的项目体会文章目录 SSM 整合#xff08;代码配置#xff09;1. 基本形式2. 无 web.xml 的理论基础3. WebInitializer 替代 web.xml4. SpringWebConfig 替代 spring-web.xml5. 配置『静态资源不拦截』方案一方案二 6. 配置 URL 后缀生效/失效7. 整合 Service 层8. 整合 Dao 层9. Mybati… 文章目录 SSM 整合代码配置1. 基本形式2. 无 web.xml 的理论基础3. WebInitializer 替代 web.xml4. SpringWebConfig 替代 spring-web.xml5. 配置『静态资源不拦截』方案一方案二 6. 配置 URL 后缀生效/失效7. 整合 Service 层8. 整合 Dao 层9. Mybatis 相关配置文件10. 其它 SSM 整合代码配置
1. 基本形式
Spring 的 Java 代码配置与 XML 配置文件配置有对应关系本质上太大区别。
核心关键点有两处 .xml 配置文件演变为一个配置类其头上标注 Configuation 注解 bean 配置演变为配置类中的一个方法其头上标注 Bean 注解。
2. 无 web.xml 的理论基础
为了支持脱离 web.xmlServlet 定义了一个 javax.servlet.ServletContainerInitializer 的接口并且要求在 Servlet 容器启动 web 项目时在项目的的 jar 包中的 META-INF/services 去找一个名字是它的完全限定名的文件。
在 Spring MVC 项目中spring-web 包下的 META-INF/services 目录下就存在这样一个 javax.servlet.ServletContainerInitializer 的文件。
按照约定这个文件的内容可以放 ServletContainerInitializer 接口的实现类的完全限定名在 Spring MVC 中这个实现了是 org.springframework.web.SpringServletContainerInitializer 。
Servlet 容器在启动时会创建这个文件中所记载的 ServletContainerInitializer 接口的实现类的对象并调用它的 onStartup 。
在 SpringServletContainerInitializer 的 onStartup 方法中它会去查找、调用 Spring MVC 项目中所有 WebApplicationInitializer 接口直接或间接实现类的 onStartup 方法。
所以我们需要直接或间接实现 WebApplicationInitializer并在 onStartup 方法中实现我们曾将在 web.xml 中所实现的内容。
3. WebInitializer 替代 web.xml
当然我们通常并不会直接实现 WebApplicationInitializer 接口我们可以通过继承 AbstractAnnotationConfigDispatcherServletInitializer 来间接实现 WebApplicationInitializer 接口
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {// 第一次加载配置时机所加载的配置类。Overrideprotected Class?[] getRootConfigClasses() {return new Class?[] {SpringServiceConfig.class,SpringDaoConfig.class};}// 第二次加载配置时机所加载的配置类。 Overrideprotected Class?[] getServletConfigClasses() {return new Class?[] {SpringWebConfig.class};}// 设置 DispatcherServlet 的映射Overrideprotected String[] getServletMappings() {return new String[] { / };}
}曾经在 web.xml 中配置过一个 Filter 来解决 GET 请求中文乱码问题如果要在 WebInitializer 中实现同样的效果则需要多重写一个父类的方法
Override
protected Filter[] getServletFilters() {Filter encodingFilter new CharacterEncodingFilter(UTF-8, true);return new Filter[] { encodingFilter };
}4. SpringWebConfig 替代 spring-web.xml
Configuration
EnableWebMvc // 注解驱动
ComponentScan(xxx.yyy.zzz.web) // 包扫描
public class SpringWebConfig implements WebMvcConfigurer {Bean // 视图解析器public InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver new InternalResourceViewResolver();viewResolver.setPrefix(/WEB-INF/jsp/);viewResolver.setSuffix(.jsp);return viewResolver;}
}除了上面三项关键性配置之外还有一些附加功能配置可供选择。
5. 配置『静态资源不拦截』 当然 DispatcherServlet 配置的是拦截的是 *.后缀 形式那么就不存在静态资源拦截问题。所以需要考虑静态资源拦截问题时通常意味着 DispacherServlet 配置的是 / 。另外通常不会、不建议使用 /** 。 实现静态资源不拦截的方式有两种二选一一是启用 DefaultServletHandler二是配置 ResouceHandler 。
方案一
配置启用 DefaultServletHandler 意味着像 .js、.css 这样的 URL 没有 Controller 处理则由 DefaultServletHandler 处理而它的处理方式就是在对应目录下找到这些文件并发送给客户端浏览器。
Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();
}方案二
配置 ResouceHandler 就是明确告诉 Spring MVC 当 URL 路径中出现何种关键词或后缀时去哪个路径下找静态资源文件。
Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/css/**)// 过滤静态资源路径.addResourceLocations(classpath:/css);// 定位资源registry.addResourceHandler(/js/**).addResourceLocations(classpath:/js);registry.addResourceHandler(/img/**).addResourceLocations(classpath:/img);}
}6. 配置 URL 后缀生效/失效
常规的 Java Web 一般不会考虑这个问题。在 Restful 的 Java Web 中才会针对『一个奇怪的现象』考虑这个配置。
默认情况下 Spring MVC 会忽略掉 URL 请求中的后缀。也即是说 在 URL 中使用 hello.do 能触发 RequestMapping(“/hello”) 的执行。
有时可能需要 Spring MVC 更『严谨』一些。如果是在 .xml 配置文件中是配置成这样
mvc:annotation-drivenmvc:path-matching suffix-patternfalse /
/mvc:annotation-driven在代码配置中对等的配置是如下
Override
public void configurePathMatch(PathMatchConfigurer configurer) {// 显而易见这个值默认是 true 。configurer.setUseSuffixPatternMatch(false);
}
7. 整合 Service 层
这里通过配置类 SpringServiceConfig 来等价替代 spring-service.xml 配置文件。
Configuration
ComponentScan(xxx.yyy.zzz.service) // 包扫描
EnableTransactionManagement // 激活/启用事务注解Transactional
public class SpringServiceConfig {// txManagerBeanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {DataSourceTransactionManager manager new DataSourceTransactionManager();manager.setDataSource(dataSource);return manager;}}8. 整合 Dao 层
这里通过配置类 SpringDaoConfig 来等价替代 spring-dao.xml 配置文件。
大体上以下配置类就是 spring-dao.xml 配置文件的对等转换结果。不过有一处需要注意的地方。
Configuration
PropertySource(classpath:jdbc.properties)
public class SpringDaoConfig {Value(${datasource.driver-class-name})private String driverClassName;Value(${datasource.url})private String url;Value(${datasource.username})private String userName;Value(${datasource.password})private String password;Bean // 数据库连接池public HikariDataSource dataSource() {HikariDataSource ds new HikariDataSource();ds.setDriverClassName(driverClassName);ds.setJdbcUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}Bean // sqlSessionFactorypublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws IOException {SqlSessionFactoryBean sqlSessionFactory new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);sqlSessionFactory.setConfigLocation(new ClassPathResource(mybatis/mybatis-config.xml));sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mybatis/mapper/*.xml));return sqlSessionFactory;}Bean // 包扫描public MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer configurer new MapperScannerConfigurer();configurer.setBasePackage(com.softeem.dao);return configurer;}
}如果是 spring-dao.xml 无脑改 SpringDaoConfig那么
sqlSessionFactory.setConfigLocation(...);
sqlSessionFactory.setMapperLocations(...);为 sqlSessionFactory 的 configLocation 和 mapperLocations 属性赋值时『想当然地』是提供两个字符换因为 .xml 配置文件中就是如此。
但是在实际中sqlSessionFactory 的这两个属性需要的是 Resource 对象和 Resource 对象的数组。因此需要以这两个字符串为依据生成与之对应的对象和对象的数组后再使用
new ClassPathResource(mybatis/mybatis-config.xml));new PathMatchingResourcePatternResolver().getResources(mybatis/mapper/*.xml)9. Mybatis 相关配置文件
Mybatis 的核心配置文件和映射文件还是需要以 .xml 形式提供。
略。
10. 其它
Configuration
EnableWebMvc
ComponentScan(com.xja.hemiao.web.controller) // 包扫描
public class SpringWebConfig implements WebMvcConfigurer {Bean(name multipartResolver) // bean 必须写 name 属性且必须为 multipartResolverprotected CommonsMultipartResolver multipartResolver() {CommonsMultipartResolver commonsMultipartResolver new CommonsMultipartResolver();commonsMultipartResolver.setMaxUploadSize(5 * 1024 * 1024);commonsMultipartResolver.setMaxInMemorySize(0);commonsMultipartResolver.setDefaultEncoding(UTF-8);return commonsMultipartResolver;}Overridepublic void configureMessageConverters(ListHttpMessageConverter? converters) {super.configureMessageConverters(converters);FastJsonHttpMessageConverter fastConverter new FastJsonHttpMessageConverter();FastJsonConfig fastJsonConfig new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);fastConverter.setFastJsonConfig(fastJsonConfig);converters.add(fastConverter);}
}