Spring企业级程序设计 • 第7章 Spring框架整合

Posted 明金同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring企业级程序设计 • 第7章 Spring框架整合相关的知识,希望对你有一定的参考价值。

全部章节   >>>>


本章目录

7.1 模型数据解析及控制器返回值

7.1.1 SSM框架环境搭建

7.1.1 ModelAndView多种用法

7.1.2 整合MyBatis框架

7.2 MyBatis逆向工程

7.2.1  MyBatis逆向工程

7.2.3 实践练习

7.3  CRM后台管理登录功能开发

7.3.1  CRM系统介绍及其表结构设计

7.3.2 登录界面功能的开发

7.3.3 登录验证功能的开发

7.3.4 实践练习

7.4 CRM系统登录权限认证开发

7.4.1 登录权限认证功能开发

7.4.2 客户信息列表功能开发

7.4.3 客户信息来源和所属行业中文转码

7.4.3 实践练习

总结


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 Cloud微服务框架 实战企业级优惠券系统

Spring企业级程序设计 • 第5章 Spring MVC快速入门

Spring企业级程序设计 • 第2章 Spring Bean管理进阶

Spring企业级程序设计 • 第4章 Spring持久化层和事务管理

Spring企业级程序设计 • 第3章 面向切面编程