入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

SSM(Spring+Spring MVC+Mybatis)环境框架搭建与配置详解

创建时间:2016-09-13 投稿人: 浏览次数:15483

使用SSM框架做了一些项目,一直都是使用别人已经搭建好的框架。于是自己尝试着搭建了一下框架,并研究了一下配置文件。


基本的组织结构和用法就不用多说了,各种官方文档上比较全面



开发环境MyEclipse+JDK1.7+Tomcat7

开发环境配置请查阅博客


本文按照开发环境搭建,完整的结构框架如下





1.web.xml

web.xml应该是整个项目中最重要的配置文件了,配置方式与普通的servlet基本相似

<span style="font-size:14px;">  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:resources/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping></span>

servlet 配置前端控制器,其中

ContextconfigLocation配置配置springmvc加载的配置文件适配器、处理映射等等

url-pattern中 .* :访问以.*结尾 由DispatcherServlet进行解析

/  :所有访问由DispatcherServlet进行解析


配置Spring容器:

<span style="font-size:14px;">  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:resources/spring-mvc.xml</param-value>
  </context-param></span>
配置日志文件:

<span style="font-size:14px;">  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>60000</param-value>
  </context-param></span>

配置监听器:

<span style="font-size:14px;">  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener></span>


配置容器编码为utf-8:

<span style="font-size:14px;">  <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>true</param-value>
    </init-param>
 </filter> 
  
 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping></span>

配置处理错误页面:

<span style="font-size:14px;"><error-page>
<span style="white-space:pre">	</span><exception-type>java.lang.Throwable</exception-type>
<span style="white-space:pre">	</span><location>/error.jsp</location>
</error-page>
<error-page>
<span style="white-space:pre">	</span><error-code>404</error-code>
<span style="white-space:pre">	</span><location>/error.jsp</location>
</error-page>
<error-page>
<span style="white-space:pre">	</span><error-code>500</error-code>
<span style="white-space:pre">	</span><location>/error.jsp</location>
</error-page></span>

完整的web.xml文件如下:

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" id="WebApp_1473651077644">
  <error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
  <distributable/>
 

  <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>true</param-value>
    </init-param>
 </filter> 
  
 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>60000</param-value>
  </context-param>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:resources/spring-mvc.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:resources/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
</web-app></span>




2.spring-mvc.xml

<span style="font-size:14px;"><?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"
	default-autowire="byName">
	        
	<!-- scan all spring supported annotation, but exclude controller here -->
	<context:component-scan base-package="com.changhong.lyc">
	</context:component-scan>
	  <mvc:annotation-driven />  
	
    <!-- 使用util properties 避免多mybatis配置时参数初始化问题 -->
	  <util:properties id="dataSourceProps" location="classpath:resources/jdbc.properties"/>
	

	<!-- define datasource -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		
		<property name="driverClassName" value="#{dataSourceProps["jdbc.driver"]}" />
		<property name="url" value="#{dataSourceProps["jdbc.url"]}" />
		<property name="username" value="#{dataSourceProps["jdbc.user"]}" />
		<property name="password" value="#{dataSourceProps["jdbc.password"]}" />
		<property name="maxActive" value="#{dataSourceProps["jdbc.maxActive"]}" />
	   <property name="initialSize" value="5" />
		<!--maxIdle: 最大空闲连接 -->
		<property name="maxIdle" value="10" />
		<!--minIdle: 最小空闲连接 -->
		<property name="minIdle" value="5" />
		<!--removeAbandoned: 是否自动回收超时连接 -->
		<property name="removeAbandoned" value="true" />
		<!--removeAbandonedTimeout: 超时时间(以秒数为单位) -->
		<property name="removeAbandonedTimeout" value="180" />
		<!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
		<property name="maxWait" value="3000" />
	</bean>

	
	<!-- 事务配置 -->
    <bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>	
	
	<!-- 扫描mybatis mapper -->
	  
	 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath:resources/mybatis/*Mapper.xml" />
	</bean> 

	 <!-- 扫描所有dao -->
	  
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.changhong.lyc.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>

 	<tx:annotation-driven transaction-manager="transactionManager" />

	<tx:advice id="txAdvice" transaction-manager="transactionManager" >
		<tx:attributes>
			<tx:method name="del*" propagation="REQUIRED" rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException" />
			<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
			<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
			<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
			<tx:method name="insertWorkflow*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception" />
			<tx:method name="updateWorkflow*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception" />
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="check*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:advisor pointcut="execution(* com.changhong.lyc.dao.*Dao.*(..))" advice-ref="txAdvice" />
	</aop:config>

	<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="org.springframework.security.access.AccessDeniedException">error/access-denied</prop>
				<prop key="net.yingzhuo.me.exception.NonEmptyGroupException">error/non-empty-group</prop>
			</props>
		</property>
		<property name="warnLogCategory" value="以下为警告信息" />
		<property name="defaultErrorView" value="error" />
		<property name="defaultStatusCode" value="500" />
	</bean>
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
    	<!-- 前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 后缀 -->
		<property name="suffix" value=".jsp" />
    </bean>
</beans></span>


3.spring-servlet.xml

<span style="font-size:14px;"><?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:p="http://www.springframework.org/schema/p"
	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-3.2.xsd 
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
	default-autowire="byName">

	<!-- <context:property-placeholder location="classpath*:resources/*.properties" /> -->

	<!-- scan all controller, but exclude service -->
	<context:component-scan base-package="com.changhong.lyc">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Service" />
	</context:component-scan>
	
	


	<!-- mvc:annotation-driven会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 
		两个bean,是spring MVC为@Controllers分发请求所必须的.并提供了:数据绑定支持,@NumberFormatannotation支持, 
		@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson) -->
	<!-- <mvc:annotation-driven conversion-service="conversion-service" validator="validator"> -->
	<mvc:annotation-driven conversion-service="conversion-service">
		<mvc:message-converters>
			<bean
				class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
			<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
			<bean
				class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/plain;charset=UTF-8</value>
					</list>
				</property>
			</bean>
			<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
				<property name="objectMapper">
					<bean class="org.codehaus.jackson.map.ObjectMapper">
						<property name="serializationInclusion">
							<value type="org.codehaus.jackson.map.annotate.JsonSerialize$Inclusion">NON_NULL</value>
						</property>
					</bean>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

	<mvc:default-servlet-handler />

	<bean id="conversion-service"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	</bean>
</beans> </span>


4.jdbc.properties与log4j.properties

1.jdbc.properties

<span style="font-size:14px;">jdbc.driver =com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://yourUrl:3306/test?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8
jdbc.user =yourName
jdbc.password = yourPwd
jdbc.maxActive=20</span>


2.log4j.properties


<span style="font-size:14px;">log4j.rootLogger=DEBUG,stdout,E
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p]%d{yyyy-MM-dd HH:mm:ss}[%c]:%m%n
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.com.mchange.v2.c3p0=OFF
log4j.logger.com.mchange.v2=OFF
log4j.logger.org.springframework=OFF
log4j.logger.org.mybatis=OFF
log4j.logger.org.apache.ibatis=OFF
log4j.logger.org.apache.http=OFF

# error
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = D:/logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =[%-5p]%d{yyyy-MM-dd HH:mm:ss}[%c]:%m%n</span>



base:定义基础操作和基础类,一般具体操作和几次实体都继承自此结构下的接口

controller:控制层

dao:数据库持久层

handler:定义具体逻辑与操作

schema:实体,一般与数据库中各表的具体字段对应

util:工具类

resource:配置工具,包含mybatis的mapper映射文件,对数据库具体操作在此文件中

数据库中保存如下数据



mapper映射文件如下:

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.changhong.lyc.dao.TestDao">
	<resultMap id="BaseResultMap" type="com.changhong.lyc.schema.TestSchema">
		<id column="t_id" property="id" jdbcType="VARCHAR"/>
		<result column="t_name" property="name" jdbcType="VARCHAR"/>
		<result column="t_age" property="age" jdbcType="INTEGER"/>
		<result column="t_sex" property="sex" jdbcType="INTEGER"/>
		<result column="t_graduateYear" property="graduateYear" jdbcType="VARCHAR"/>
		<result column="t_collegeName" property="collegeName" jdbcType="VARCHAR"/>
	</resultMap>
  
 	<select id="selectOneByCondition" resultMap="BaseResultMap">
		select
				*
		from
			t_table
		where
			<if	test="name != null">
				t_name = #{name,jdbcType=VARCHAR}
			</if>
			<if	test="graduateYear != null">
				and t_graduateYear = #{graduateYear,jdbcType=VARCHAR}
			</if>
	</select>	
</mapper></span>


使用Postman测试


访问地址在controller视图控制类中定义


返回结果如下:

<span style="font-size:14px;">{
  "code": "1000",
  "data": {
    "age": 26,
    "collegeName": "清华大学",
    "graduateYear": "2015",
    "id": "1",
    "name": "张三",
    "sex": 1
  },
  "msg": "success"
}</span>


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像