全部章节   >>>>


本章目录

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. 前端必须知道的 Nginx 知识

    Nginx一直跟我们息息相关,它既可以作为Web 服务器,也可以作为负载均衡服务器,具备高性能.高并发连接等. 1.负载均衡 当一个应用单位时间内访问量激增,服务器的带宽及性能受到影响, 影响大到自身 ...

  2. mango后台

     环境搭建 项目配置 下载后导入项目,删除mvnw.mvnw.cmd两个文件 修改spring-boot-starter-web pom.xml --> run as --> mave i ...

  3. Mysql的行级锁

    我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的. Mysql有三种级别的锁定:表级锁 ...

  4. OpenStack之七: compute服务(端口8774)

    注意此处的bug,参考o版 官网地址 https://docs.openstack.org/nova/stein/install/controller-install-rdo.html 控制端配置 # ...

  5. MySQL如何使用WITH ROLLUP函数

    一.WITH ROLLUP函数适用于跟在GROUP BY 字段后面进行分组求和使用 SELECT t1.`产品名称`,SUM(t1.`数量`),SUM(t1.`金额`),t1.`日期` FROM sh ...

  6. 减轻内存负担,在 pymysql 中使用 SSCursor 查询结果集较大的 SQL

    前言 默认情况下,使用 pymysql 查询数据使用的游标类是 Cursor,比如: import pymysql.cursors # 连接数据库 connection = pymysql.conne ...

  7. bjdctf_2020_babyrop2

    这道题是一道基本题,正因为它经典,所以需要重点记录一下. 这道题考察格式化字符串泄露canary,然后rop获得libc版本,之后拿到shell.拿到程序之后我们先检查一下保护... 开启了堆栈不可执 ...

  8. 2、动态规划接替套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  9. SpringBoot整合websocket简单示例

    依赖 <!-- springboot整合websocket --> <dependency> <groupId>org.springframework.boot&l ...

  10. 谷歌浏览器(chrome)查找、打包已安装的扩展程序

    我们有时候会安装浏览器扩展程序,正常情况下,我们回去谷歌应用商店里面进行下载,但是这个需要VPN,有时候我们没法使用VPN,想从其他已安装扩展程序的浏览器上直接安装就可以使用我们下面这个方法 win1 ...