SSM(Spring+Spring MVC+Mybatis)环境框架搭建与配置详解
使用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>
<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。
- 上一篇:没有了
- 下一篇:没有了