优雅整合SSM框架

来源:互联网 发布:常用的数据库有哪些 编辑:程序博客网 时间:2024/05/14 11:52


SpringMVC:它用于web层,相当于controller(等价于传统的servlet和struts的action),用来处理用户请求。举个例子,用户在地址栏输入http://网站域名/login,那么springmvc就会拦截到这个请求,并且调用controller层中相应的方法,(中间可能包含验证用户名和密码的业务逻辑,以及查询数据库操作,但这些都不是springmvc的职责),最终把结果返回给用户,并且返回相应的页面(当然也可以只反馈josn/xml等格式数据)。springmvc就是做前面和后面过程的活,与用户打交道!!

Spring:太强大了,以至于我无法用一个词或一句话来概括它。但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括service dao里面的),有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring的aop,事务管理等等都是我们经常用到的。

MyBatis:如果你问我它跟鼎鼎大名的Hibernate有什么区别?我只想说,他更符合我的需求。第一,它能自由控制sql,这会让有数据库经验的人(当然不是说我啦~捂脸~)编写的代码能搞提升数据库访问的效率。第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。

 

SSM框架整合配置

好了,前面bb那么多,下面我们真正开始敲代码了~

首先我们打开IED,我这里用的是eclipse(你们应该也是用的这个,对吗?),创建一个动态web项目,建立好相应的目录结构(重点!)

(打了马赛克是因为这里还用不到,你们不要那么污好不好?)

我说一下每个目录都有什么用吧(第一次画表格,我发现markdown的表格语法很不友好呀~)
这个目录结构同时也遵循maven的目录规范~

文件名

作用

src

根目录,没什么好说的,下面有maintest

main

主要目录,可以放java代码和一些资源文件。

java

存放我们的java代码,这个文件夹要使用Build Path -> Use as Source Folder,这样看包结构会方便很多,新建的包就相当于在这里新建文件夹咯。

resources

存放资源文件,譬如各种的springmybatislog配置文件。

mapper

存放dao中每个方法对应的sql,在这里配置,无需写daoImpl

spring

这里当然是存放spring相关的配置文件,有dao service web三层。

sql

其实这个可以没有,但是为了项目完整性还是加上吧。

webapp

这个貌似是最熟悉的目录了,用来存放我们前端的静态资源,如jsp js css

resources

这里的资源是指项目的静态资源,如js css images等。

WEB-INF

很重要的一个目录,外部浏览器无法访问,只有羡慕内部才能访问,可以把jsp放在这里,另外就是web.xml了。你可能有疑问了,为什么上面java中的resources里面的配置文件不妨在这里,那么是不是会被外部窃取到?你想太多了,部署时候基本上只有webapp里的会直接输出到根目录,其他都会放入WEB-INF里面,项目内部依然可以使用classpath:XXX来访问,好像IDE里可以设置部署输出目录,这里扯远了~

test

这里是测试分支。

java

测试java代码,应遵循包名相同的原则,这个文件夹同样要使用Build Path -> Use as Source Folder,这样看包结构会方便很多。

resources

没什么好说的,好像也很少用到,但这个是maven的规范。

 

我先新建好几个必要的,并为大家讲解一下每个包的作用,顺便理清一下后台的思路~

包名

名称

作用

dao

数据访问层(接口)

与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里,也有人叫做dal或者数据持久层都差不多意思。为什么没有daoImpl,因为我们用的是mybatis,所以可以直接在配置文件中实现接口的每个方法。

entity

实体类

一般与数据库的表相对应,封装dao层取出来的数据为一个对象,也就是我们常说的pojo,一般只在dao层与service层之间传输。

dto

数据传输层

刚学框架的人可能不明白这个有什么用,其实就是用于service层与web层之间传输,为什么不直接用entitypojo)?其实在实际开发中发现,很多时间一个entity并不能满足我们的业务需求,可能呈现给用户的信息十分之多,这时候就有了dto,也相当于vo,记住一定不要把这个混杂在entity里面,答应我好吗?

service

业务逻辑(接口)

写我们的业务逻辑,也有人叫bll,在设计业务接口时候应该站在使用者的角度。额,不要问我为什么这里没显示!IDE调皮我也拿它没办法~

serviceImpl

业务逻辑(实现)

实现我们业务接口,一般事务控制是写在这里,没什么好说的。

web

控制器

springmvc就是在这里发挥作用的,一般人叫做controller控制器,相当于struts中的action

 

还有最后一步基础工作,导入我们相应的jar包,我使用的是maven来管理我们的jar,所以只需要在poom.xml中加入相应的依赖就好了,如果不使用maven的可以自己去官网下载相应的jar,放到项目WEB-INF/lib目录下。关于maven的学习大家可以看慕课网的视频教程,这里就不展开了。我把项目用到的jar都写在下面,版本都不是最新的,大家有经验的话可以自己调整版本号。另外,所有jar都会与项目一起打包放到我的github上,喜欢的给个star吧~

poom.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

<code class="language-xml hljs "><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.soecode.ssm</groupid>

    ssm</artifactid>

    <packaging>war</packaging>

    <version>0.0.1-SNAPSHOT</version>

    <name>ssm Maven Webapp</name>

    <url>http://github.com/liyifeng1994/ssm</url>

    <dependencies>

        <!-- 单元测试 -->

        <dependency>

            <groupid>junit</groupid>

            junit</artifactid>

            <version>4.11</version>

        </dependency>

 

        <!-- 1.日志 -->

        <!-- 实现slf4j接口并整合 -->

        <dependency>

            <groupid>ch.qos.logback</groupid>

            logback-classic</artifactid>

            <version>1.1.1</version>

        </dependency>

 

        <!-- 2.数据库 -->

        <dependency>

            <groupid>mysql</groupid>

            mysql-connector-java</artifactid>

            <version>5.1.37</version>

            <scope>runtime</scope>

        </dependency>

        <dependency>

            <groupid>c3p0</groupid>

            c3p0</artifactid>

            <version>0.9.1.2</version>

        </dependency>

 

        <!-- DAO: MyBatis -->

        <dependency>

            <groupid>org.mybatis</groupid>

            mybatis</artifactid>

            <version>3.3.0</version>

        </dependency>

        <dependency>

            <groupid>org.mybatis</groupid>

            mybatis-spring</artifactid>

            <version>1.2.3</version>

        </dependency>

 

        <!-- 3.Servlet web -->

        <dependency>

            <groupid>taglibs</groupid>

            standard</artifactid>

            <version>1.1.2</version>

        </dependency>

        <dependency>

            <groupid>jstl</groupid>

            jstl</artifactid>

            <version>1.2</version>

        </dependency>

        <dependency>

            <groupid>com.fasterxml.jackson.core</groupid>

            jackson-databind</artifactid>

            <version>2.5.4</version>

        </dependency>

        <dependency>

            <groupid>javax.servlet</groupid>

            javax.servlet-api</artifactid>

            <version>3.1.0</version>

        </dependency>

 

        <!-- 4.Spring -->

        <!-- 1)Spring核心 -->

        <dependency>

            <groupid>org.springframework</groupid>

            spring-core</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <dependency>

            <groupid>org.springframework</groupid>

            spring-beans</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <dependency>

            <groupid>org.springframework</groupid>

            spring-context</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <!-- 2)Spring DAO层 -->

        <dependency>

            <groupid>org.springframework</groupid>

            spring-jdbc</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <dependency>

            <groupid>org.springframework</groupid>

            spring-tx</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <!-- 3)Spring web -->

        <dependency>

            <groupid>org.springframework</groupid>

            spring-web</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <dependency>

            <groupid>org.springframework</groupid>

            spring-webmvc</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

        <!-- 4)Spring test -->

        <dependency>

            <groupid>org.springframework</groupid>

            spring-test</artifactid>

            <version>4.1.7.RELEASE</version>

        </dependency>

 

        <!-- redis客户端:Jedis -->

        <dependency>

            <groupid>redis.clients</groupid>

            jedis</artifactid>

            <version>2.7.3</version>

        </dependency>

        <dependency>

            <groupid>com.dyuproject.protostuff</groupid>

            <artifactid>protostuff-core</artifactid>

            <version>1.0.8</version>

        </dependency>

        <dependency>

            <groupid>com.dyuproject.protostuff</groupid>

            <artifactid>protostuff-runtime</artifactid>

            <version>1.0.8</version>

        </dependency>

 

        <!-- Map工具类 -->

        <dependency>

            <groupid>commons-collections</groupid>

            <artifactid>commons-collections</artifactid>

            <version>3.2</version>

        </dependency>

    </dependencies>

    <build>

        <finalname>ssm</finalname>

    </build>

</project>

</code>

 

下面真的要开始进行编码工作了,坚持到这里辛苦大家了~

第一步:我们先在spring文件夹里新建spring-dao.xml文件,因为spring的配置太多,我们这里分三层,分别是dao service web。

读入数据库连接相关参数(可选)配置数据连接池
配置连接属性,可以不读配置项文件直接在这里写死配置c3p0,只配了几个常用的 配置SqlSessionFactory对象(mybatis) 扫描dao层接口,动态实现dao接口,也就是说不需要daoImpl,sql和参数都写在xml文件上

spring-dao.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<code class="language-xml hljs "><!--?xml version="1.0" encoding="UTF-8"?-->

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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">

    <!-- 配置整合mybatis过程 -->

    <!-- 1.配置数据库相关参数properties的属性:${url} -->

    <context:property-placeholder location="classpath:jdbc.properties">

 

    <!-- 2.数据库连接池 -->

    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">

        <!-- 配置连接池属性 -->

        <property name="driverClass" value="${jdbc.driver}">

        <property name="jdbcUrl" value="${jdbc.url}">

        <property name="user" value="${jdbc.username}">

        <property name="password" value="${jdbc.password}">

 

        <!-- c3p0连接池的私有属性 -->

        <property name="maxPoolSize" value="30">

        <property name="minPoolSize" value="10">

        <!-- 关闭连接后不自动commit -->

        <property name="autoCommitOnClose" value="false">

        <!-- 获取连接超时时间 -->

        <property name="checkoutTimeout" value="10000">

        <!-- 当获取连接失败重试次数 -->

        <property name="acquireRetryAttempts" value="2">

    </property></property></property></property></property></property></property></property></property></bean>

 

    <!-- 3.配置SqlSessionFactory对象 -->

    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">

        <!-- 注入数据库连接池 -->

        <property name="dataSource" ref="dataSource">

        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->

        <property name="configLocation" value="classpath:mybatis-config.xml">

        <!-- 扫描entity包 使用别名 -->

        <property name="typeAliasesPackage" value="com.soecode.lyf.entity">

        <!-- 扫描sql配置文件:mapper需要的xml文件 -->

        <property name="mapperLocations" value="classpath:mapper/*.xml">

    </property></property></property></property></bean>

 

    <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <!-- 注入sqlSessionFactory -->

        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">

        <!-- 给出需要扫描Dao接口包 -->

        <property name="basePackage" value="com.soecode.lyf.dao">

    </property></property></bean>

</context:property-placeholder></beans></code>

因为数据库配置相关参数是读取配置文件,所以在resources文件夹里新建一个jdbc.properties文件,存放我们4个最常见的数据库连接属性,这是我本地的,大家记得修改呀~还有喜欢传到github上“大头虾们”记得删掉密码,不然别人就很容易得到你服务器的数据库配置信息,然后干一些羞羞的事情,你懂的!!

jdbc.properties

?

1

2

3

4

<code class="language-properties hljs avrasm">jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3307/ssm?useUnicode=true&characterEncoding=utf8

jdbc.username=root

jdbc.password=</code>

友情提示:配置文件中的jdbc.username,如果写成username,可能会与系统环境中的username变量冲突,所以到时候真正连接数据库的时候,用户名就被替换成系统中的用户名(有得可能是administrator),那肯定是连接不成功的,这里有个小坑,我被坑了一晚上!!

因为这里用到了mybatis,所以需要配置mybatis核心文件,在recources文件夹里新建mybatis-config.xml文件。

使用自增主键 使用列别名 开启驼峰命名转换 create_time -> createTime

mybatis-config.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code class="language-xml hljs "><!--?xml version="1.0" encoding="UTF-8" ?-->

 

<configuration>

    <!-- 配置全局属性 -->

    <settings>

        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->

        <setting name="useGeneratedKeys" value="true">

 

        <!-- 使用列别名替换列名 默认:true -->

        <setting name="useColumnLabel" value="true">

 

        <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->

        <setting name="mapUnderscoreToCamelCase" value="true">

    </setting></setting></setting></settings>

</configuration></code>

第二步:刚弄好dao层,接下来到service层了。在spring文件夹里新建spring-service.xml文件。

扫描service包所有注解 @Service 配置事务管理器,把事务管理交由spring来完成 配置基于注解的声明式事务,可以直接在方法上@Transaction

spring-service.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code class="language-xml hljs "><!--?xml version="1.0" encoding="UTF-8"?-->

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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">

    <!-- 扫描service包下所有使用注解的类型 -->

    <context:component-scan base-package="com.soecode.lyf.service">

 

    <!-- 配置事务管理器 -->

    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">

        <!-- 注入数据库连接池 -->

        <property name="dataSource" ref="dataSource">

    </property></bean>

 

    <!-- 配置基于注解的声明式事务 -->

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

</tx:annotation-driven></context:component-scan></beans></code>

 

第三步:配置web层,在spring文件夹里新建spring-web.xml文件。

开启SpringMVC注解模式,可以使用@RequestMapping,@PathVariable,@ResponseBody等 对静态资源处理,如js,css,jpg等 配置jsp 显示ViewResolver,例如在controller中某个方法返回一个string类型的”login”,实际上会返回”/WEB-INF/login.jsp” 扫描web层 @Controller

spring-web.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<code class="language-xml hljs "><!--?xml version="1.0" encoding="UTF-8"?-->

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/mvc

    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 配置SpringMVC -->

    <!-- 1.开启SpringMVC注解模式 -->

    <!-- 简化配置:

        (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter

        (2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持

    -->

    <mvc:annotation-driven>

 

    <!-- 2.静态资源默认servlet配置

        (1)加入对静态资源的处理:js,gif,png

        (2)允许使用"/"做整体映射

     -->

     <mvc:default-servlet-handler>

 

     <!-- 3.配置jsp 显示ViewResolver -->

     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView">

        <property name="prefix" value="/WEB-INF/jsp/">

        <property name="suffix" value=".jsp">

     </property></property></property></bean>

 

     <!-- 4.扫描web相关的bean -->

     <context:component-scan base-package="com.soecode.lyf.web">

</context:component-scan></mvc:default-servlet-handler></mvc:annotation-driven></beans></code>

 

第四步:最后就是修改web.xml文件了,它在webappWEB-INF下。

web.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code class="language-xml hljs "><web-app metadata-complete="true" version="3.1" 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">

    <!-- 如果是用mvn命令生成的xml,需要修改servlet版本为3.1 -->

    <!-- 配置DispatcherServlet -->

    <servlet>

        <servlet-name>seckill-dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!-- 配置springMVC需要加载的配置文件

            spring-dao.xml,spring-service.xml,spring-web.xml

            Mybatis - > spring -> springmvc

         -->

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>classpath:spring/spring-*.xml</param-value>

        </init-param>

    </servlet>

    <servlet-mapping>

        <servlet-name>seckill-dispatcher</servlet-name>

        <!-- 默认匹配所有的请求 -->

        <url-pattern>/</url-pattern>

    </servlet-mapping>

</web-app>

</code>

 

我们在项目中经常会使用到日志,所以这里还有配置日志xml,在resources文件夹里新建logback.xml文件,所给出的日志输出格式也是最基本的控制台s呼出,大家有兴趣查看logback官方文档

logback.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<code class="language-xml hljs "><!--?xml version="1.0" encoding="UTF-8"?-->

<configuration debug="true">

     

        <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->

        <encoder>

            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

        </encoder>

    </appender>

 

    <root level="debug">

         

    </appender-ref></root>

</configuration></code>

 

到目前为止,我们一共写了7个配置文件,我们一起来看下最终的配置文件结构图


0 0
原创粉丝点击