在myeclipse中freemarker + ssm + maven 项目整合演示

一直想写一个比较完整的项目整合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&amp;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

CSDN

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值