SSM-整合

SSM的整合,可以用一个xml就完事,但是这里还是分隔以下彼此业务
模板引擎使用Thymeleaf,如果不是Thymeleaf,改改视图解析器就好了。

pom.xml
<!-- SpringMVC -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>${spring.version}</version>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring5</artifactId>
	<version>${thymeleaf-spring5.version}</version>
</dependency>
<!-- Spring支持jdbc的jar包(会依赖 spring-tx事务jar包) -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${spring.version}</version>
</dependency>
<!-- spring面向切面编程 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aspects</artifactId>
	<version>${spring.version}</version>
</dependency>

<!-- ServletAPI -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>${javax.servlet-api.versoin}</version>
	<scope>provided</scope>
</dependency>
<!--Mybatis-->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>${mybatis.version}</version>
</dependency>
<!--mybatis整合spring-->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>${mysql.version}</version>
</dependency>
<!-- jackson依赖jar包 -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>${jackson.version}</version>
</dependency>
<!-- druid -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>${druid.version}</version>
</dependency>


<!-- lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.20</version>
	<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>${junit.version}</version>
	<scope>test</scope>
</dependency>

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.10.0</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.10.0</version>
</dependency>

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-web</artifactId>
	<version>2.9.1</version>
</dependency>
web.xml

里面的CORS可以不用这么麻烦,这里完全可以省去,然后复制个配置类就直接OK,在我博客中有。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
		 version="4.0">

	<!-- 跨域请求
		com.du.filter.SimpleCORSFilter:为配置类全路径
	 -->
	<filter>
		<filter-name>SimpleCORSFilter</filter-name>
		<filter-class>com.du.filter.SimpleCORSFilter</filter-class>
		<init-param>
			<param-name>IsCross</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>SimpleCORSFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!--启动Spring的容器-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- log4j2-begin
		spring5之后推荐使用Log4j2
	-->
	<listener>
		<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
	</listener>
	<filter>
		<filter-name>log4jServletFilter</filter-name>
		<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>log4jServletFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>
	<!-- log4j2-end -->


	<!--配置springMVC的编码过滤器
		字符编码过滤器一定要在所有过滤器之前,request
	-->
	<filter>
		<filter-name>CharacterEncodingFilter</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>forceResponseEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!--使用Rest风格的URL,将post请求转换为指定的delete请求-->
	<filter>
		<filter-name>hiddenHttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>hiddenHttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!--前端控制器,对浏览器发送的请求统一进行处理-->
	<servlet>
		<servlet-name>springMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springMVC.xml</param-value>
		</init-param>
		<!--
			作为框架的核心组件,在启动过程中有大量的初始化操作要做
			而这些操作放在第一次请求时才执行会严重影响访问速度
			因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
	 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springMVC</servlet-name>
		<!--设置springMVC的核心控制器所能处理的请求路径
		/所匹配的请求可以是/login或.html或.js.css的请求路径
		但是/不能匹配.jsp路径
		-->
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>
applicationContext.xml

事物这块也不用这么麻烦,推荐使用注解。
AOP这快也使用注解比较好。

<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans 
						   http://www.springframework.org/schema/beans/spring-beans.xsd 
						   http://www.springframework.org/schema/context 
						   https://www.springframework.org/schema/context/spring-context.xsd 
						   http://www.springframework.org/schema/aop 
						   https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

	<!--spring的配置文件,这里主要配置和业务逻辑相关的
		数据源、事务控制
	-->


	<!--开启注解扫描-->
	<context:component-scan base-package="com.du">
		<!--让spring不扫描控制器-->
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>

	<!--====================================配置数据源============================-->
	<!--1.关联数据库文件-->
	<context:property-placeholder location="classpath:db.properties"/>
	<!--2.数据库连接池-->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"/>
		<property name="url" value="${jdbc.url}"/>
		<property name="username" value="${jdbc.username}"/>
		<property name="password" value="${jdbc.password}"/>
	</bean>

	<!--====================================配置整合mybatis=========================-->
	<!--3.配置SqlSessionFactory对象-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!--注入数据库连接池-->
		<property name="dataSource" ref="dataSource"/>
		<!--配置mybatis配置文件-->
		<property name="configLocation" value="classpath:mybatis-config.xml"/>
		<!--指定mybatis,mapper文件的位置-->
		<property name="mapperLocations" value="classpath:mappers/*.xml"/>
	</bean>

	<!--配置扫描器,将mybatis接口的实现加入到ioc容器中-->
	<!--接口的实现是一个代理对象-->
	<!--4.配置扫描Dao接口包,动态实现Dao接口注入到springIOC中-->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!--注入sqlSessionFactory-->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
		<!--扫描所有的dao接口的实现,加入到ioc-->
		<property name="basePackage" value="com.du.dao"/>
	</bean>

	<!--=====================================事物控制的配置==============================-->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!--控制住数据源-->
		<property name="dataSource" ref="dataSource"/>
	</bean>
	<!--配置事物增强,事物如何切入-->
	<!--transaction-manager="transactionManager"是默认的,这也是为什么可以关联-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!--*所有方法都是事物方法-->
			<!--propagation:事物的传播行为
				isolation:事物的隔离级别
			-->
			<tx:method name="*" propagation="REQUIRES_NEW" isolation="REPEATABLE_READ"/>
			<!--以get开始的所有方法-->
			<!--read-only="true"调优-->
			<tx:method name="get*" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	<!--开启基于注解的事物,使用xml配置形式的事物,(必要主要的都是使用配置式)-->
	<aop:config>
		<!--切入点表达式
			service..双点表示service下的子包也包括
			(..)表示任意参数
			一下表示service下的所有类所有方法
		-->
		<aop:pointcut id="px" expression="execution(* com.du.service.impl.*.*(..))"/>
		<!--配置事物增强-->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="px"/>
	</aop:config>
	<!--
		如果不加下面的代码:会出现
			but was actually of type 'com.sun.proxy.$Proxy36'
		这个错误的原因是spring aop代理混用的问题
	-->
	<aop:aspectj-autoproxy  proxy-target-class="true"/>

</beans>
springMVC.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 
						   https://www.springframework.org/schema/context/spring-
						   context.xsd http://www.springframework.org/schema/mvc 
						   https://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<!--只扫描controller的注解,别的不扫描-->
	<context:component-scan base-package="com.du.controller"/>
	<!--配置视图解析器-->
	<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
		<property name="order" value="1"/>
		<property name="characterEncoding" value="UTF-8"/>
		<property name="templateEngine">
			<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
				<property name="templateResolver">
					<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
						<!--视图前缀-->
						<property name="prefix" value="/WEB-INF/templates/"/>
						<!-- 视图后缀 -->
						<property name="suffix" value=".html"/>
						<property name="templateMode" value="HTML5"/>
						<property name="characterEncoding" value="UTF-8"/>
					</bean>
				</property>
			</bean>
		</property>
	</bean>
	<!--处理静态资源-->
	<!--
		处理静态资源,例如html、js、css、jpg
		若只设置该标签,则只能访问静态资源,其他请求则无法访问
		此时必须设置<mvc:annotation-driven/>解决问题
		“也就是spring MVC不能处理的请求交给tomcat处理”
	-->
	<mvc:default-servlet-handler/>

	<!-- 开启mvc注解驱动
		能支持springMVC跟高级的功能
			JSR303校验、快捷的ajax、映射请求
	 -->
	<mvc:annotation-driven>
		<mvc:message-converters>
			<!-- 处理响应中文内容乱码 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="defaultCharset" value="UTF-8"/>
				<property name="supportedMediaTypes">
					<list>
						<value>text/html</value>
						<value>application/json</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

	<!-- 接口跨域配置 -->
	<mvc:cors>
		<!-- allowed-methods="*" --> <!-- 表示所有请求都有效 -->
		<mvc:mapping path="/**"
					 allowed-origin-patterns="*"
					 allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
					 allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
					 allow-credentials="true"/>
	</mvc:cors>

</beans>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
		PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
		"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<!--驼峰-->
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<setting name="logImpl" value="STDOUT_LOGGING"/>
	</settings>
	<!--别名-->
	<typeAliases>
		<package name="com.du.pojo"/>
	</typeAliases>

</configuration>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/elm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="1800">
	<properties>
		<property name="LOG_HOME">/WEB-INF/logs</property>
		<property name="FILE_NAME">finance-pay</property>
	</properties>


	<Appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
		</Console>

		<RollingFile name="running-log" fileName="${LOG_HOME}/${FILE_NAME}.log"
					 filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
					 immediateFlush="true">
			<PatternLayout
						   pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy/>
				<SizeBasedTriggeringPolicy size="10MB"/>
			</Policies>
			<DefaultRolloverStrategy max="20"/>
		</RollingFile>
	</Appenders>
	<Loggers>

		<!-- <Logger name="com.cssweb.test.app" level="trace" additivity="true">
			<AppenderRef ref="running-log" /> </Logger> -->

		<Root level="info">
			<!-- 这里是输入到文件,很重要-->
			<AppenderRef ref="running-log"/>
			<!-- 这里是输入到控制台-->
			<AppenderRef ref="Console"/>
		</Root>
	</Loggers>
</Configuration>
SimpleCORSFilter.java

你如果上面在SpringMVC中配置了CORS,那就需要下面的类。注意你的包名要和上面配置中一致

public class SimpleCORSFilter implements Filter {

	private boolean isCross = false;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		String isCrossStr = filterConfig.getInitParameter("IsCross");
		isCross = isCrossStr.equals("true") ? true : false;
		System.out.println(isCrossStr);

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		if (isCross) {
			HttpServletRequest httpServletRequest = (HttpServletRequest) request;
			HttpServletResponse httpServletResponse = (HttpServletResponse) response;
			System.out.println("拦截请求: " + httpServletRequest.getServletPath());
			//设置允许跨域
			httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
			httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
			httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
			httpServletResponse.setHeader("Access-Control-Max-Age", "0");
			httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
			httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
			httpServletResponse.setHeader("XDomainRequestAllowed", "1");
		}
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		isCross = false;
	}
}

image

posted @ 2021-10-14 15:40  生生灯火半杯月  阅读(42)  评论(0)    收藏  举报