资源描述
持久层:DAO层(mapper)
§ DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,
§ DAO层的设计首先是设计DAO的接口,
§ 然后在Spring的配置文件中定义此接口的实现类,
§ 然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,
§ DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。
业务层:Service层
§ Service层:Service层主要负责业务模块的逻辑应用设计。
§ 首先设计接口,再设计其实现的类
§ 接着再在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
§ Service层的业务实现,具体要调用到已定义的DAO层的接口,
§ 封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
表现层:Controller层(Handler层)
§ Controller层:Controller层负责具体的业务模块流程的控制,
§ 在此层里面要调用Service层的接口来控制业务流程,
§ 控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。
View层
§ View层此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示.
各层联系
§ DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势
§ Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。
§ Service逻辑层设计
§ Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
SSM框架整合说明
整合Dao层
MyBatis配置文件 sqlMapConfig.xml
§ 配置别名:用于批量扫描Pojo包
§ 不需要配置mappers标签,但一定要保证mapper.java文件与mapper.xml文件同名。
<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>
<!--配置别名-->
<typeAliases><!--批量扫描别名-->
<packagename=/>
</typeAliases>
</configuration>
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
Spring配置文件 applicationContext-dao.xml
§ 主要配置内容
§ 数据源
§ SqlSessionFactory
§ mapper扫描器
§ 这里使用sqlSessionFactoryBeanName属性是因为如果配置的是sqlSessionFactory属性,将不会先加载数据库配置文件及数据源配置
<beansxmlns=
xmlns:xsi=xmlns:mvc=
xmlns:context=
xmlns:aop=xmlns:tx=
xsi:schemaLocation=
>
<!--加载db.properties文件中的内容,db.properties文件中key命名要有一定的特殊规则-->
<context:property-placeholderlocation="classpath:db.properties"/>
<!--配置数据源,dbcp-->
<beanid="dataSource"class=destroy-method="close">
<propertyname="driverClassName"value="${jdbc.driver}"/>
<propertyname="url"value="${jdbc.url}"/>
<propertyname="username"value="${jdbc.username}"/>
<propertyname="password"value="${jdbc.password}"/>
<propertyname="maxActive"value="30"/>
<propertyname="maxIdle"value="5"/>
</bean>
<!--sqlSessionFactory-->
<beanid="sqlSessionFactory"class=>
<!--数据库连接池-->
<propertyname="dataSource"ref="dataSource"/>
<!--加载mybatis的全局配置文件-->
<propertyname="configLocation"value="classpath:mybatis/sqlMapConfig.xml"/>
</bean>
<!--mapper扫描器-->
<beanclass=>
<!--扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开-->
<propertyname="basePackage"value=></property>
<propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/>
</bean>
</beans>
· 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
创建所需的Mapper.java
§ 一般不动原始生成的po类,而是将原始类进行集成vo类
publicinterfaceItemsMappperCustom{
publicList<ItemsCustom>findItemsList(ItemsQueryVoitemsQueryVo)throwsException;
}
· 1
· 2
· 3
创建POJO类对应的mapper.xml
<mappernamespace=>
<selectid="findItemsList"parameterTyep=resultType=>
selectitems.*fromitems
whereitems.namelike'%${itemsCustom.name}%'
· 1
· 2
· 3
· 4
整合service层
§ 目标:让spring管理service接口。
定义service接口
§ 一般在ssm.service包下定义接口eg:ItemsService
publicinterfaeItemsService{
publicList<ItemsCustom>findItemsList(ItemsQueryVoitemsQueryVo)throwsException;
}
· 1
· 2
· 3
定义ServiceImpl实现类
§ 因为在applicationContext-dao.xml中已经使用了mapper扫描器,这里可以直接通过注解的方式将itemsMapperCustom自动注入。
publicclassItemsServiceImplimplementsItemsService{
@Autowired
privateItemsMapperCustomitemsMapperCustom;
@Override
publicList<ItemsCustom>findItemsList(ItemsQueryVoitemsQueryVo)throwsException{
returnitemsMapperCustom.findItemsList(itemsQueryVo);
}
}
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
在spring容器配置service
§ applicationContext-service.xml在此文件中配置service。
<beanid="itemsService"class=/>
· 1
事物控制(不够熟悉)
§ 在applicationContext-transaction.xml中使用spring声明式事务控制方法
§ 对mybatis操作数据库事物控制,spring使用jdbc的事物控制类是DataSourceTransactionManager
§ 因为操作了数据库需要事物控制,所以需要配置数据源
§ 定义了切面
<beansxmlns=
xmlns:xsi=xmlns:mvc=
xmlns:context=
xmlns:aop=xmlns:tx=
xsi:schemaLocation=
>
<!--事务管理器对mybatis操作数据库事务控制,spring使用jdbc的事务控制类-->
<beanid="transactionManager"class=>
<!--数据源在dataSource在applicationContext-dao.xml中已经配置-->
<propertyname="dataSource"ref="dataSource"/>
</bean>
<!--通知-->
<tx:adviceid="txAdvice"transaction-manager="transactionManager">
<tx:attributes>
<!--传播行为-->
<tx:methodname="save*"propagation="REQUIRED"/>
<tx:methodname="delete*"propagation="REQUIRED"/>
<tx:methodname="insert*"propagation="REQUIRED"/>
<tx:methodname="update*"propagation="REQUIRED"/>
<tx:methodname="find*"propagation="SUPPORTS"read-only="true"/>
<tx:methodname="get*"propagation="SUPPORTS"read-only="true"/>
<tx:methodname="select*"propagation="SUPPORTS"read-only="true"/>
</tx:attributes>
</tx:advice>
<!--aop-->
<aop:config>
<aop:advisoradvice-ref="txAdvice"pointcut=/>
</aop:config>
</beans>
· 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
整合springmvc
§ 创建springmvc.xml文件,配置处理器映射器、适配器、视图解析器
<context:component-scanbase-package=></context:component-scan>
<!--使用mvc:annotation-driven加载注解映射器和注解适配器配置-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--视图解析器解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
-->
<beanclass=>
<!--配置jsp路径的前缀-->
<propertyname="prefix"value="/WEB-INF/jsp/"/>
<!--配置jsp路径的后缀-->
<propertyname="suffix"value=".jsp"/>
</bean>
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
配置前端控制器
§ 在web.xml中加入如下内容
§ contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)
§ 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml)
§ 在url-pattern中
§ 填入*.action,表示访问以.action结尾由DispatcherServlet进行解析
§ 填入/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现RESTful风格的url
<!--springmvc前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
· 14
· 15
编写Controller(Handler)
@Congtroller
@RequestMapping("/items")//窄化路径
publicclassItemsController{
@Autowired
privateItemsServiceitemsService;
//商品查询
@RequestMapping("/queryItems")//实际网址后面跟了.action
publicModelAndViewqueryItems(HttpServletRequestrequest)throwsException{
List<ItemsCustom>itemsList=itemsService.findItemsList(null);
//返回ModelAndView
ModelAndViewmodelAndView=newModelAndView();
//相当于request的setAttribute,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList",itemsList);
returnmodelAndView;
}
}
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
· 14
· 15
· 16
· 17
· 18
· 19
· 20
· 21
编写JSP页面
<c:forEachitems="${itemsList}"var="item">
<tr>
<td>${item.name}</td>
<td>${item.price}</td>
<td><fmt:formatDatevalue="${item.createtime}"pattern="yyyy-MM-ddHH:mm:ss"/></td>
<td>${item.detail}</td>
<td><ahref=>修改</a></td>
</tr>
</c:forEach>
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
加载spring容器
§ 在web.xml中,添加spring容器监听器,加载spring容器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class></listener-class>
<listener>
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
展开阅读全文