全部章节   >>>>


本章目录

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. 03-Collection用例管理及批量执行

    当我们对一个或多个系统中的很多用例进行维护时,首先想到的就是对用例进行分类管理,同时还希望对这批用例做回归测试 .在postman也提供了这样一个功能,就是Collection .通过这个Collec ...

  2. react-native安卓运行报错:The number of method references in a .dex file cannot exceed 64K.

    错误原因:App里面方法数超过64K解决方法:在android/app/build.gradle中添加implementation 'com.android.support:multidex:1.0. ...

  3. idea如何在git上将分支代码合并到主干

    1.首先将idea中的代码分支切换到master分支,可以看到我们在dev上提交的代码 在master上是没有的 2.如图所示,在remote branch 上选择分支,点击后面的三角图标,展开之后选 ...

  4. linux 操作只读变量

    由于该操作需要用到 gdb,所以需要先 安装好 gdb 1. 查询是否有gdb: 2. 如果没有,需要先执行 yum install gdb 命令进行安装 3. 定义 只读变量 abc 并打印值: a ...

  5. 【Java 基础】java 创建对象时重写方法

    TransactionLock mockLock = new TransactionLock() { public boolean lock(String id) { return true; } p ...

  6. JSP页面的基本结构

    一:一个JSP页面由以下基本元素组成. (1)HTML标签 (2)CSS (3)变量和方法 (4)Java代码段 (5)JSP动作和指令 (6)其他脚本元素(如Javascript) 二:JSP的基本 ...

  7. python数据预处理和特性选择后列的映射

    我们在用python进行机器学习建模时,首先需要对数据进行预处理然后进行特征工程,在这些过程中,数据的格式可能会发生变化,前几天我遇到过的问题就是: 对数据进行标准化.归一化.方差过滤的时候数据都从D ...

  8. 沉淀vue相关知识(主要还是个人积累用)

    路由懒加载的配置: const Home= () =>import('../components/Home') //使用ES6中的路由懒加载的方式 const About= () =>im ...

  9. Mysql配置文件 4c8g优化

    目录 一.说明 二.配置 一.说明 以下配置适合4核8G及以下的配置,会让性能稍微提高1/3左右. 测试语句 mysqlslap -uroot -p123456 --concurrency=100 - ...

  10. shell脚本 mysql-binlog分析

    一.简介 介绍 分析binlog工具,现有功能: 基于业务表分析统计各个表的dml的次数. 各个业务表的最后访问时间. 各dml总的次数. 该binlog的事务总数. 基于业务表的binlog to ...