全部章节   >>>>


本章目录

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. 【Reverse】每日必逆0x01

    附件:https://files.buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev 题解 查壳 64位ELF文件,无壳 IDApro处 ...

  2. [JAVA]动态代理与AOP的千丝万缕

    动态代理与AOP的联系 别的不说,直接上图 首先是AOP切面编程 什么是切面?(自己心里想想就ok)所以所谓的切面编程,你也就懂得大体了,只是这个被切的是个程序而已 那么AOP与动态代理有什么关系呢? ...

  3. Android 基础UI组件(一)

    1.Toast //显示文字 Toast.makeText(this,"Toast显示文本",Toast.LENGTH_SHORT).show(); //显示图片 Toast to ...

  4. jmeter进阶

    1.如果(if)控制器的使用     2.参数的调用 3.数据库的链接

  5. 初始化Linux数据盘、磁盘分区、挂载磁盘(fdisk)

    1.操作场景 2.前提条件 3.划分分区并挂载磁盘 4.设置开机自动挂载磁盘分区 1.操作场景 本文以云服务器的操作系统为"CentOS 7.4 64位"为例,采用fdisk分区工 ...

  6. 【编程思想】【设计模式】【其他模式】graph_search

    Python版 https://github.com/faif/python-patterns/blob/master/other/graph_search.py #!/usr/bin/env pyt ...

  7. java上传图片或文件

    转载至:http://www.xdx97.com/#/single?bid=8b351a73-922c-eadc-512e-9e248a3efde9 前端通过form表单用post方式提交文件,后台进 ...

  8. 3、Spring的DI依赖注入

    一.DI介绍 1.DI介绍 依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入. Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为&qu ...

  9. IT服务生命周期

    一.概述 IT服务生命周期由规划设计(Pianning&Design).部署实施(Implementing).服务运营(Opera,tion).持续改进(Improvemenit)和监督管理( ...

  10. vue插槽理解

    1.插槽作用:父向子传递一段Html代码块 2.分类: (1)默认插槽:规则:父给子传,用父,不传,用子. (2)具名插槽:适用于一个页面有多个插槽时,需要做区分,使用name属性.给插槽取个名字 ( ...