Spring企业级程序设计 • 第7章 Spring框架整合
Posted 明金同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring企业级程序设计 • 第7章 Spring框架整合相关的知识,希望对你有一定的参考价值。
全部章节 >>>>
本章目录
7.1 模型数据解析及控制器返回值
7.1.1 SSM框架环境搭建
SSM实际上是三种框架的集成,它们分别是Spring、Spring MVC以及MyBatis。SSM框架是标准的MVC模式,将这个系统划分为表现层、Controller层、Service层和Dao层。
使用Spring实现业务对象的管理,使用Spring MVC负责请求的转发和视图管理,使用MyBatis作为数据对象的持久化引擎。接下来学习如何整合SSM框架。
7.1.1 ModelAndView多种用法
Spring MVC是基于Spring的框架,可以实现无缝整合,在两大框架整合时,应该将Spring的容器和Spring MVC的配置文件分开来
在Spring的容器中配置IoC和AOP的相关组件,只负责各个Bean之间的依赖和横切逻辑,而在Spring MVC的配置文件中只负责Handler的配置就可以了。
整合Spring MVC框架,首先配置Spring容器,然后配置前端控制器,接着在Spring MVC的核心配置文件中配置Controller层扫描包、配置注解驱动以及配置视图解析器,最后测试整合结果
<!-- 配置spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<!-- 配置监听器加载spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定Spring MVC的核心配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截所有以do结尾的请求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 配置Controller扫描 -->
<context:component-scan base-package="com.mhys.crm.controller" />
<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
7.1.2 整合MyBatis框架
MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis。
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。
示例:整合MyBatis框架。
<!-- 配置 读取properties文件 jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置SqlSessionFactory -->
<bean class="org.MyBatis.spring.SqlSessionFactoryBean">
<!-- 设置MyBatis核心配置文件 -->
<property name="configLocation" value="classpath:MyBatis/SqlMapConfig.xml" />
<!-- 设置数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置Mapper扫描 -->
<bean class="org.MyBatis.spring.mapper.MapperScannerConfigurer">
<!-- 设置Mapper扫描包 -->
<property name="basePackage" value="com.mhys.crm.dao" />
</bean>
<!-- 配置Service扫描 -->
<context:component-scan base-package="com.mhys.crm.service" />
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启注解方式管理AOP事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<mapper namespace="com.mhys.crm.dao.TestDao">
<select id="getTestList" resultType="Test">
select * from test
</select>
</mapper>
7.1.3 实践练习
7.2 MyBatis逆向工程
7.2.1 MyBatis逆向工程
MyBatis逆向工程,就是MyBatis会根据设计好的数据表,自动生成POJO类、Mapper接口以及Mapper.xml。
MyBatis逆向工程生成代码的方式有多种,一般来说会选择使用一个Java程序,基于XML配置来生成代码。
MyBatis逆向工程目录结构:
generatorConfig.xml配置文件。 运行逆向工程的主程序,代码就会自动生成。在运行程序之前,需要在generatorConfig.xml配置文件中配置数据库连接信息、配置POJO类、Mapper接口和Mapper映射文件生成的位置以及指定数据表。
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="false" />
</commentGenerator>
<!--mysql数据库连接的信息:驱动类、连接地址、用户名以及密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_blog" userId="root"
password="1q2w3e">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.mhys.demo.pojo"
targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.mhys.demo.dao"
targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER“ targetPackage="
com.mhys.demo.dao " targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="t20_blog"></table>
</context>
</generatorConfiguration>
示例:在数据库中创建t00_user、t00_dict和t10_customer三张数据表,通过MyBatis逆向工程,自动生成表对应的POJO类、Mapper接口以及Mapper映射文件。
<context id="testTables" targetRuntime="MyBatis3">
<javaModelGenerator targetPackage="com.mhys.demo.pojo" targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.mhys.demo.dao" targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mhys.demo.dao" targetProject=".\\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="t00_user"></table>
<table schema="" tableName="t00_dict"></table>
<table schema="" tableName="t10_customer"></table>
</context>
7.2.3 实践练习
7.3 CRM后台管理登录功能开发
7.3.1 CRM系统介绍及其表结构设计
CRM系统介绍:
客户关系管理系统(CRM)是以客户数据的管理为核心,利用信息科学技术来实现市场营销、销售和服务等活动自动化,并建立一个客户信息的收集、管理、分析和利用的系统,帮助企业实现以客户为中心的管理模式。
CRM系统表结构设计
7.3.2 登录界面功能的开发
示例:登录界面功能的开发。
<body>
<h1>登录</h1>
<p style="color:red"><strong>${errMsg }</strong></p>
<form:form modelAttribute="t00_user" action="loginDo.do" method="post" id="loginForm">
用户名:<form:input path="username" id="username" /><br/><br/>
密码:<form:password path="password" id="password" /><br/><br/>
<input type="button" value="提 交" id="btn"/>
</form:form>
</body>
7.3.3 登录验证功能的开发
示例:对用户输入的用户名和密码进行登录验证。
$("#btn").on("click", function () {
var errMsg = '';
var flag = true;
var username = $("#username").val();
var password = $("#password").val();
if(username=='' || username==undefined){
errMsg = "用户名不能为空!";
flag = false;
}else if(password=='' || password==undefined){
errMsg = "密码不能为空!";
flag = false;
}
if(flag && errMsg==''){
$("#loginForm").submit();
}else{
alert(errMsg);
return;
}
});
7.3.4 实践练习
7.4 CRM系统登录权限认证开发
在企业级项目中,假如某个用户输入了系统内部的一个请求地址,如果系统中没有登录权限认证的功能,此用户仍然可以进入系统,进行业务操作,这是不合理的。
应该做的是,在系统的每个请求之前,除了登录请求,都应该检测该用户是否登录,如果没有,则跳转到登录界面。
无权限认证可直接通过地址访问登录后页面
7.4.1 登录权限认证功能开发
示例:实现未登录的用户禁止进入系统进行业务相关操作。
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object obj) throws Exception {
// 获取请求的RUI地址:去除http:localhost:8080这部分剩下的
String uri = request.getRequestURI();
if (uri.indexOf("/login") >= 0) {
return true;
}
// 获取session
HttpSession session = request.getSession();
T00_user user = (T00_user) session.getAttribute("USER_SESSION");
if (user != null) {//判断是否登录
return true;
}
// 不符合条件的给出提示信息,并转发到登录页面
request.setAttribute("errMsg", "您还没有登录,请先登录!");
request.getRequestDispatcher("/login.do").forward(request, response);
return false;
}
}
<!-- 配置Controller扫描 -->
<context:component-scan base-package="com.mhys.crm.controller,com.mhys.crm.interceptor"/>
<!--配置拦截器-->
<mvc:interceptors>
<!--登录拦截器-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.mhys.crm.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
7.4.2 客户信息列表功能开发
示例:在主页中添加客户信息列表。
7.4.3 客户信息来源和所属行业中文转码
客户信息列表中,客户信息来源和客户所属行业这两列显示的内容是英文或者数字。在实际开发中,这种情况需要将英文或者数字转码成中文,便于数据的分析。
示例:实现客户信息来源和所属行业中文转码功能。
7.4.3 实践练习
总结
- Spring是一个轻量级框架,也是一个容器,Spring实质上讲就是一个Bean工厂,主要用来管理Bean的生命周期和框架集成。有IoC控制反转,DI依赖注入,控制反转是把Dao依赖注入到Servic层,然后Service层反转给Controller层,Spring的顶层容器为BeanFactory,常用的ApplicationContext为它的子接口,实现了工厂模式,Spring还提供了AOP的支持,方便切面级开发。
- Spring在进行管理时,是很有条理的,每个层都由Spring管理,然后不同的层可以调用其他层,Handler调用Service层,Service层调用Mapper等。
- 整合Dao层,Spring和MyBatis整合,通过Spring管理Mapper接口。使用Mapper的扫描器自动扫描Mapper接口在Spring中进行注册。
- 整合Service层,通过Spring管理Service接口。使用配置方式将Service接口配置在Spring配置文件中,同时配置事务管理。
- 整合Spring MVC,由于Spring MVC是Spring的模块,可以实现无缝整合。
以上是关于Spring企业级程序设计 • 第7章 Spring框架整合的主要内容,如果未能解决你的问题,请参考以下文章
Spring企业级程序设计 • 第7章 Spring框架整合
Spring企业级程序设计 • 第5章 Spring MVC快速入门
Spring企业级程序设计 • 第2章 Spring Bean管理进阶