全部章节   >>>>


本章目录

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框架整合】的更多相关文章

  1. Spring企业级程序设计 • 【目录】

    章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...

  2. Spring企业级程序设计作业目录(作业笔记)

    Spring企业级程序设计 • [目录] 第1章 Spring之旅  >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...

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

    全部章节   >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2  S ...

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

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

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

    全部章节   >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...

  6. Spring企业级程序设计 • 【第1章 Spring之旅】

    全部章节   >>>> 本章目录 1.1 Spring框架基础 1.1.1 Spring特点及体系结构 1.1.1 Spring的体系结构 1.1.2  使用Eclipse搭建 ...

  7. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  8. Spring入门篇——第6章 Spring AOP的API介绍

    第6章 Spring AOP的API介绍 主要介绍Spring AOP中常用的API. 6-1 Spring AOP API的Pointcut.advice概念及应用 映射方法是sa开头的所有方法 如 ...

  9. Spring入门篇——第5章 Spring AOP基本概念

    第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...

随机推荐

  1. Angular中怎样创建service服务来实现组件之间调用公共方法

    Angular组件之间不能互相调用方法,但是可以通过创建服务来实现公共方法的调用. 实现 创建服务命令 ng g service 服务路径/服务名 比如这里在app/services目录下创建stor ...

  2. [PE结构]导出表结构浅析

    导出函数的总数-->以导出函数序号最大的减最小的+1,但导出函数序号是可自定义的,所以NumbersOfFunctions是不准确的 1.根据函数名称找,函数名称表->对应索引函数序号表中 ...

  3. C++ 数组元素循环右移问题

    这道题要求不用另外的数组,并且尽量移动次数少. 算法思想:设计一个结构体存储数组数据和它应在的索引位置,再直接交换,但是这种方法不能一次性就移动完成,因此再加一个判断条件.等这个判断条件满足后就退出循 ...

  4. 颜色RGB值对照表

    转载自 http://www.91dota.com/?p=49# 常用颜色的RGB值及中英文名称   颜  色    RGB值 英文名 中文名   #FFB6C1 LightPink 浅粉红   #F ...

  5. lambda表达式快速创建

    Java 8十个lambda表达式案例 1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnable( ...

  6. 【编程思想】【设计模式】【结构模式Structural】front_controller

    Python版 https://github.com/faif/python-patterns/blob/master/structural/front_controller.py #!/usr/bi ...

  7. Linux shell实现每天定时备份mysql数据库

    每天定时备份mysql数据库任务,删除指定天数前的数据,保留指定天的数据: 需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3 ...

  8. Mockito 简介

    Mockito 是一种 Java Mock 框架,主要是用来做 Mock 测试,它可以模拟任何 Spring 管理的 Bean.模拟方法的返回值.模拟抛出异常等等,在了解 Mockito 的具体用法之 ...

  9. TCP协议三步挥手与四步挥手

    关于TCP协议 TCP(Transmission Control Protocol, 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.与之对应的是UDP(User Datagram ...

  10. Leetcode 78题-子集

    LeetCode 78 网上已经又很多解这题的博客了,在这只是我自己的解题思路和自己的代码: 先贴上原题: 我的思路: 我做题的喜欢在本子或别处做写几个示例,以此来总结规律:下图就是我从空数组到数组长 ...