一直想写一个比较完整的项目整合blog,但一直没有找到比较充裕的时间,前几天刚刚整合了一下,今天写出来,供大家参考一下。后端用的 spring + springMVC + mybatis 框架,前端用的数据模板 freemarker, jar包管理用的 maven,数据库是MySQL。接下来先看一下整体架构。
项目目录结构
项目依赖 pom.xml
<dependencies>
<!--spring3.2.2 start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.2</version>
</dependency>
<!-- spring3.2.2end-->
<!-- 日志包start -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<!-- 日志包end -->
<!-- mybatis相关包 start -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<!-- mybatis相关包 end -->
<!-- mysql连接驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- jstl标签库 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 字节码解析 -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.17.1-GA</version>
</dependency>
<!-- 阿里巴巴json解析包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
<!-- 阿里巴巴druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- servlet start -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- servlet end -->
<!-- 数据库连接池 start -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<!-- 数据库连接池 end -->
<!-- commons upload start -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- commons upload end -->
<!-- pagehelper start -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.0</version>
</dependency>
<!-- pagehelper end -->
<!-- freemarker strat-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker-gae</artifactId>
<version>2.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<!-- freemarker end -->
</dependencies>
web.xml
<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:config/ssm-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 启动则加载配置文件 -->
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 编码 -->
<filter>
<filter-name>encoding</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>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- log4j -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
spring 配置文件 ssm-mvc.xml
<!-- freeMarker视图解析器 -->
<bean id="freemarkerResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="order" value="1"/>
<property name="suffix" value=".ftl"/><!-- 后缀 -->
<property name="contentType" value="text/html;charset=utf-8"/>
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
</bean>
<!-- freemarker配置 -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/freemarker/</value>
</property>
<property name="freemarkerSettings"><!-- 设置freemarker环境属性 -->
<props>
<prop key="template_update_delay">1</prop><!-- 刷新模板的周期,单位秒 -->
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">UTF-8</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.###</prop>
<prop key="boolean_format">true,false</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="tag_syntax">auto_detect</prop>
<prop key="url_escaping_charset">utf-8</prop>
</props>
</property>
</bean>
<!-- 扫描controller -->
<context:component-scan base-package="com.wml.controller" />
<!-- 扫描service -->
<context:component-scan base-package="com.wml.service" />
<!-- 注解的处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- 注解的处理器映射器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 配置启动监听 -->
<bean id="startupListener" class="com.wml.listener.StartupListener" />
<!-- 上传文件数据解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<!-- 设定文件上传的最大值为50MB,5*1024*1024*10 -->
<property name="maxUploadSize" value="52428800" />
<!-- 延迟文件解析 -->
<property name="resolveLazily" value="true" />
</bean>
<!-- 访问静态资源文件 -->
<mvc:resources location="/assets/" mapping="/assets/**" />
mybatis 配置文件 ssm-mybatis.xml
<context:property-placeholder location="classpath:config/jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClass}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="defaultAutoCommit" value="true" />
<property name="maxIdle" value="100" />
<property name="minIdle" value="10" />
<property name="maxActive" value="100" />
<property name="maxWait" value="60000" />
<property name="initialSize" value="10" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="600" />
<property name="testWhileIdle" value="true" />
</bean>
<!-- 配置sessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 扫描entity包 -->
<property name="typeAliasesPackage" value="com.wml.entity" />
<!-- 配置mybatis全局配置 -->
<property name="configLocation" value="classpath:config/mybatis-config.xml" />
</bean>
<!-- 扫描Mapper -->
<bean id="scannerMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wml.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
spring 事务配置文件 ssm-transaction.xml
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务的通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 配置事务的传播特性 -->
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="select*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务的AOP -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.wml.service.*.*.*(..))"/>
</aop:config>
log4j配置
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
#log4j.category.org.springframework=INFO
#log4j.rootLogger=INFO,a1
#log4j.appender.a1 = org.apache.log4j.ConsoleAppender
#log4j.appender.a1.Threshold = INFO
#log4j.appender.a1.MaxFileSize = 100Kb
#log4j.appender.a1.layout = org.apache.log4j.PatternLayout
#log4j.appender.a1.layout.LocationInfo = true
#log4j.appender.a1.layout.ConversionPattern =%d{HH\:mm\:ss,SSS} [%t] %-5p %C{1} \: %m%n
jdbc连接池配置
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/bookshop?useUnicode\=true&characterEncoding\=UTF-8&allowMultiQueries\=true&zeroDateTimeBehavior\=convertToNull
jdbc.username=root
jdbc.password=123456
这么多配置文件,太繁琐了,有一个地方配置不对就很麻烦,还得调来调去的,因此springBoot框架就显的优势很大,除去了这些繁琐的配置文件,让开发者更专注于业务代码。有空再写一篇用 springBoot 搭建的项目。
这些文件配置完后,后边的代码就很简单了。
先来controller,一步一步走
用户登录之后界面需要展示个人信息和图书信息,所以我这里建了两个实体类,user 和 book ,具体代码就不粘了,就是几个普通的属性。然后接下来写服务层,在实际的开发中,user 和 book 应该分别建立 service,各自管理自己的业务方法,在这为了省事儿,我就把 查询book 的业务也放在userService中了。
最后是mapper,这里也是为了省事儿,把查询book的dao放在userMapper中了
<?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.wml.mapper.SysUserMapper">
<resultMap type="com.wml.entity.SysUser" id="userMap">
<id column="user_id" property="userId" jdbcType="BIGINT"/>
<result column="user_name" property="username" jdbcType="VARCHAR"/>
<result column="user_password" property="password" jdbcType="VARCHAR"/>
<result column="user_sex" property="sex" jdbcType="VARCHAR"/>
<result column="user_address" property="address" jdbcType="VARCHAR"/>
<result column="user_phone" property="phone" jdbcType="VARCHAR"/>
<result column="user_email" property="email" jdbcType="VARCHAR"/>
<result column="user_birthday" property="birthday" jdbcType="DATE"/>
<result column="user_regist_date" property="registDate"/>
<result column="user_login_date" property="loginDate"/>
<result column="user_login_count" property="count" jdbcType="TINYINT"/>
</resultMap>
<resultMap type="com.wml.entity.Book" id="book">
<id column="book_id" property="bookId"/>
<result column="book_name" property="bookName"/>
<result column="publish_date" property="publishDate"/>
<result column="join_date" property="joinDate"/>
<result column="book_synopsis" property="synopsis"/>
</resultMap>
<select id="queryUser" resultMap="userMap" parameterType="Map">
SELECT USER_ID,USER_NAME,USER_PASSWORD,(CASE WHEN USER_SEX = '0' THEN '男' ELSE '女' END) AS USER_SEX,
USER_ADDRESS,USER_REGIST_DATE,USER_LOGIN_DATE
FROM SYS_USER
<where>
<if test="username != null and username != ''">
USER_NAME LIKE CONCAT("%",#{username},"%")
</if>
<if test="password != null and password != ''">
AND USER_PASSWORD = #{password}
</if>
</where>
</select>
<select id="queryAllBook" resultMap="book">
select book_id,book_name,publish_date,join_date,book_synopsis
from work_book
</select>
</mapper>
mapper查询完数据返回,到service层做一些数据处理,然后controller接收到之后进行将数据存放在request当中,进行请求转发。freemarker会根据模板文件进行填充数据并向用户展示。至此这个项目的基本架构就搭建完了,如果说再写的详细点,就是要加上拦截器、过滤器以及项目启动监听器,这些网上一大把,拷贝过来根据自己的需求改改就能用了,在这里就不做过多的介绍了。最后展示一下运行项目访问成功的界面。
项目源码下载链接:
百度网盘 提取码: q2p5