前言:这个项目是我的第一个实验性项目,最初的立意是制作一个个性化的BBS。由于BBS能够综合大部分功能,因此作为练手的项目来说再好不过。从写第一行代码到完成测试版大概历时2周。中间遇到了不少以前在学习中没有想到的问题,当然通过解决这些难题也更加深了对MVC模型的理解。本来打算至少完成1.0版本以后再发布出来,可惜由于新工作的原因估计短时间内很难继续完成。所以就凑合把两周中间我经历的种种记录于此。

项目后台通过Struts2+Spring+Hibernate搭建,前台使用了比较简单的Div+CSS+jQuery作为展示。

一、通过Maven管理依赖

这个过程比较复杂,虽然在网上能够查到不少现成的Maven依赖配置。但出于学习考虑,我还是手动添加并通过不断测试尽量将引入的依赖最小化。除了对基本框架的依赖以外,还有不少依赖关系是跟随项目开发进程不断引入的。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learnhow</groupId>
<artifactId>bbs2016</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>bbs2016 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 添加上传依赖,自动添加io依赖 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 添加json-lib依赖 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- 添加tomcat -->
<dependency>
<groupId>tomcat</groupId>
<artifactId>jasper-runtime</artifactId>
<version>5.5.23</version>
</dependency>
<!-- 特别添加jdom,由于此依赖包并非从maven库中下载,因此事先需要在本地的maven库中添加此版本的jar包 -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 添加jstl依赖 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<scope>compile</scope>
</dependency>
<!-- 添加spring整合hibernate依赖包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<!-- 添加hibernate基础依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<!-- 添加struts整合spring依赖包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
<!-- 添加spring-web包的依赖,主要是为了以后开发方便 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<!-- 添加spring基础依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<!-- 添加struts依赖包 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
<!-- 这里排除掉队javassist的依赖,通过hibernate包引入 -->
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 添加junit依赖包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>bbs2016</finalName>
</build>
</project>

Maven

二、配置文件

SSH搭建框架的关键主要有三点:

(1)Struts2通过Spring提供的ObjectFactory获取各种Action实例

(2)Hibernate使用Spring的控制翻转来注入SessionFactory,并集成事务管理

(3)使用Tomcat监听器对Spring容器初始化

首先应该配置的是Tomcat容器,这里千万不要使用由IDE自动为你产生的web.xml文件。注意文件头的部分,我的建议是从Tomcat里找到相关的配置信息复制过来。

<?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_3_1.xsd"
version="3.1" metadata-complete="true"> <!-- 尽量使用web.xml的标准写法 -->
<display-name>bbs2016 by learnhow</display-name>
<!-- 设置欢迎页面 -->
<welcome-file-list>
<welcome-file>home_browseHome</welcome-file>
</welcome-file-list>
<!-- 配置struts2核心转发器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring前端监听器,当服务器启动的时候初始化xml配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>framework.ApplicationScopeLoaderListener</listener-class>
</listener>
<context-param>
<!-- 所有需要初始化的xml都可以在这里配置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml,classpath:springhibernate.xml</param-value>
</context-param>
</web-app>

web.xml

接下来就可以配置struts.xml,同样建议从Struts2提供的配置文件中复制相关文件头。注意我在Maven里引入的Struts版本为2.3。(注:最初引入配置文件的时候只需要清空package标签内部的action)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- 这个配置是用来指定struts2框架对于上传文件的临时路径,如果不指定会采用servlet容器的默认路径。 <constant name="struts.multipart.saveDir"
value=""/> -->
<!-- 指定由spring容器产生action实例,这样才能注入需要服务 -->
<constant name="struts.objectFactory" value="spring" />
<!-- struts配置文件改动后,是否重新加载(生产环境中建议设置为false) -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 关闭动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<package name="default" namespace="/" extends="struts-default">
<!-- 配置默认请求转发地址 -->
<default-action-ref name="home" />
<global-results>
<result name="home" type="redirect">home_browseHome</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</global-results>
<action name="home">
<result type="redirect">home_browseHome</result>
</action>
<action name="register">
<result>/WEB-INF/jsp/register.jsp</result>
</action>
<action name="custom">
<result>/WEB-INF/jsp/custom.jsp</result>
</action>
<!-- 使用通配符的方法调用 -->
<action name="home_*" class="action.HomeAction" method="{1}">
<result name="home">/WEB-INF/jsp/home.jsp?page=${pageIndex}</result>
<result name="success">/WEB-INF/jsp/success.jsp</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</action>
<action name="login_*" class="action.LoginAction" method="{1}">
<result name="success" type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
<action name="ajax_*" class="action.AjaxAction" method="{1}">
<result name="success" type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
<action name="register_*" class="action.RegisterAction" method="{1}">
<result name="repeat" type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
<action name="post_*" class="action.PostAction" method="{1}">
<result name="browse" type="redirect">browse_browse?msgid=${msgid}
</result>
</action>
<action name="browse_*" class="action.BrowseAction" method="{1}">
<result name="browse">/WEB-INF/jsp/browse.jsp</result>
</action>
<action name="upload_*" class="action.UploadAction" method="{1}">
<result name="success" type="redirect">custom</result>
</action>
</package>
</struts>

struts.xml

顺带插一句有关jsp中文乱码的解决方案。上面引入的是struts2文件中的配置方法,另一种更简单的方法是采用Tomcat容器提供的filter。

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>

web.xml

然后开始配置Hibernate,由于是通过Spring整合的Hibernate,这个部分的配置实际上已经属于Spring的范畴。

<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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置数据源 -->
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp2.BasicDataSource">
<!-- 连接信息通过spring.xml文件引入 -->
<property name="driverClassName" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.username}" />
<property name="password" value="${mysql.password}" />
</bean> <!-- 通过数据源初始化sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 包扫描,不用单独配置.hbm.xml文件 -->
<property name="packagesToScan">
<list>
<value>model</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=${hibernate.dialect}
hibernate.show_sql=${hibernate.show_sql}
hibernate.hbm2ddl.auto=${hibernate.hbm2ddl.auto}
hibernate.format_sql=${hibernate.format}
</value>
</property>
</bean> <!-- 通过注入sessionFactory获取事务控制器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 事务建言:事务控制器的详细配置 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 启用事物的方法前缀 -->
<tx:method name="add*" />
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="delete*" />
<tx:method name="remove*" />
<!-- 仅适用只读事物的方法前缀 -->
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<!-- 默认其他方法不开启事物 -->
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice> <!-- 注解方式配置事物 -->
<tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置需要添加事务控制的切点 -->
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* service.impl.*.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut"
advice-ref="txAdvice" />
</aop:config> <!-- 配置dao上的事务管理,主要是为了调试底层,方便数据库实现的操作,最后应该删除切记!!! -->
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* dao.nimpl.*.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut"
advice-ref="txAdvice" />
</aop:config> </beans>

springhibernate.xml

有关database.properties的配置选项在下面(密码请填写自己的MySQL登录密码)

#config mysql
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/bbs2016
mysql.username=root
mysql.password=
#config hibernate
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=update
hibernate.format=true

database.properties

最后是引入包扫描和占位符文件的配置信息,这个部分在Spring中又被称为Root ApplicationContext。

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties" /> <context:component-scan base-package="dao,service,model" /> </beans>

spring.xml

篇幅所限,先写到这里。有关配合方面的说明基本到这里结束,下一章开始写一些设计和代码方面的东西,更多干货可以期待哦。

SSH框架整合项目(一)——搭建平台和引入依赖的更多相关文章

  1. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  2. dwr与ssh框架整合教程

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...

  3. 项目:《ssh框架综合项目开发视频》-视频目录和第六天的EasyUI简单讲解

    4 练习使用技术: Struts2 + hibernate5.x + spring4.x + mysql数据库 1 crm:customer relational manager,客户关系管理 2 c ...

  4. MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法

    MVC+Spring.NET+NHibernate .NET SSH框架整合   在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...

  5. SSH框架整合过程总结

    ---------------------siwuxie095                                 SSH 框架整合过程总结         (一)导入相关 jar 包(共 ...

  6. SSH框架整合思想

    --------------------siwuxie095                                 SSH 框架整合思想         1.SSH 框架,即 Struts2 ...

  7. SSH 框架整合总结

    1. 搭建Struts2 环境 创建 struts2 的配置文件: struts.xml; 在 web.xml 中配置 struts2 的核心过滤器; // struts.xml <?xml v ...

  8. SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...

  9. SSH框架整合

    SSH框架整合 一.原理图 action:(struts2) 1.获取表单的数据 2.表单的验证,例如非空验证,email验证等 3.调用service,并把数据传递给service Service: ...

随机推荐

  1. ios中调用友盟分享时qq可以分享但是微信失败,只显示文字,网页链接没有出现

    问题如下,最后在老大各种替换的情况下,找到了原因,是因为图片失效了,友盟分享微信时必须需要图片才可以,如果服务器图片失效,则会失败: 注意下面的图片是否能够获取???????????????????? ...

  2. android 生命周期

    引入android生命周期概念来做前端的hash切换页面的思路: 1. page manager来管理多个page(一对多的关系); 2. route:URL <-> Page; 3. P ...

  3. target-densitydpi

    一个屏幕像素密度是由屏幕分辨率决定的,通常定义为每英寸点的数量(dpi).Android支持三种屏幕像素密度:低像素密度,中像素密度,高像素密度.一个低像素密度的屏幕每英寸上的像素点更少,而一个高像素 ...

  4. Python资源大全

    The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...

  5. [SharePoint 2007/2010]Query SharePoint Calendar Event

    首先要搞清楚日历事件的各种类型,参考文章: http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&ListId ...

  6. SpringMVC操作指南-登录功能与请求过滤

    [1] Source http://code.taobao.org/p/LearningJavaEE/src/LearningSpringMVC005%20-%20Login%20and%20Filt ...

  7. sql之连表查询--效率 通过分析各种连接查询的实现原理来了解

    1. 左连接 2.右连接 3.内连接 4.Cross join 笛卡尔乘积

  8. maven exclusion 解决maven传递依赖中的版本冲突

    传递依赖是maven最有特色的.最为方便的优点之一,可以省了很多配置.如a 依赖 b,b 依赖c 默认 a也会依赖 c.但是也会带来隐患,如版本冲突.当然maven也考虑到解决办法,可以使用exclu ...

  9. 关于dll的一点收获

    蒙贾神指点. 对于kernel32.dll这种系统dll, 每一个进程都会加载一份, 映射到自己的进程空间. 实际上物理内存上还是只有一份dll. 如果对进程自己的dll进行修改, 这时操作系统会触发 ...

  10. Hadoop的核心组件和生态圈

    摘要:Hadoop是一个由Apache基金会所开发的分布式系统基础架构.Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,则MapReduce为海量的数 ...