第一章:Spring入门
基本概念
1. Spring Core Container(Spring核心容器)
Spring Core Container(Spring核心容器)是其他模块建立的基础,由Spring-core、Spring-beans、Spring-context、Spring-context-support、Spring-expression构成。
- Spring-core:提供了框架的基本组成部分,包括控制反转(IoC)和依赖注入(DI)功能。
- Spring-beans:提供了BeanFactory工厂,Spring将管理对象称为Bean。
- Spring-context:建立在Core和Beans模块的基础上,提供了框架式的对象访问方式,是访问定义和配置的任何对象的媒介。ApplicationContext接口是Context模块的焦点。
- Spring-context-support:支持整合第三方库到Spring应用程序上下文。
- Spring-expression:提供了强大的表达式语言去支持运行时查询和操作对象图。
习题
1. Spring的核心容器由哪些模块构成?
见基本概念:1. Spring Core Container(Spring核心容器)
第二章:Spring IoC(Inversion of Control 控制反转)
基本概念
1. Spring IoC的基本概念
控制反转Ioc是一个抽象的概念,是用来消减计算机程序的耦合问题。
依赖注入(Dependency Injection DI)是IoC的另一种说法,是从不同的角度描述相同的概念。
- 控制反转:对象的实例不用调用者来创建,由Spring容器来创建,由Spring容器负责控制程序之间的关系,而不是由调用者直接控制。这样控制器由调用者转移到Spring容器,控制器发生了反转。这就是控制反转。
- 依赖注入:Spring容器负责将依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
2. BeanFactory的基本概念
BeanFactory提供了完整的IoC服务支持,是一个管理Bean的工厂,主要负责初始化各种Bean。3. 依赖注入的类型
依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(列如属性值)注入Bean组件中。
Spring框架的依赖注入实现方式: - 构造方法注入
使用属性的setter方法注入
4. 构造方法依赖注入配置文件
<!-- 使用构造方法依赖注入 --> <bean id="testDIService" class="service.TestDIServiceImpl"> <!-- 将myTestDIDao注入到TestDIServiceImpl类的属性testDIDao上 --> <constructor-arg index="0" ref="myTestDIDao" /> </bean>
constructor-arg元素用于定义类构造方法的参数
- index:用于定义参数的位置
- ref:指定某个实例的引用
- value:参数是常量值时,使用value替代ref
5. 使用属性的setter方法注入
使用属性的setter方法注入方法:<!-- 使用属性的setter方法注入 --> <bean id="testDIService" class="service.TestDIServiceImpl"> <!-- 调用TestDIServiceImpl类的setter方法,将MyTestDIDao注入到TestDIServiceImpl类的属性testDIDao上 --> <property name="testDIDao" ref="myTestDIDao" /> </bean>
创建接口实现类
- 在实现类中添加需要注入属性的变量的setter方法,用于实现依赖注入
- 编写配置文件
习题
1. 举例说明IoC容器的实现方式有哪些?
- 构造方法注入
- 使用属性的setter方法注入
2. 在Spring框架中,什么是控制反转?什么是依赖注入?使用控制反转和依赖注入有什么优点?
控制反转和依赖注入见基本概念1. Spring IoC的基本概念
优点: - 降低计算机程序的耦合性。
3. Spring框架采用Java的反射机制进行依赖注入。
第三章:Spring Bean
基本概念
1. Bean的实例化
Spring框架实例化Bean有3种方式: - 构造方法实例化(最常用)
- 静态工厂实例化
- 实例工厂实例化
2. 构造方法实例化
Spring框架中,Spring容器调用Bean对应类中的无参构造方法来实例化Bean。
构造方法实例化方法: - 创建Bean类(如类名叫做BeanClass,在instance包下)
编辑配置文件(applicationContext.xml)
<bean id="constructorInstance" class="instance.BeanClass" />
创建测试类
// 初始化Spring容器ApplicationContext,价值配置文件 ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml"); // 测试构造方法实例化Bean BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
3. 静态工厂实例化
使用静态工厂实例化Bean时要求开发者在工厂类中创建一个静态方法来创建Bean的实例。
配置Bean时:- class属性指定静态工厂类
- factory-method属性指定工厂类中的静态方法
静态工厂实例化方法:
- 创建工厂类(如类名加BeanStaticFactory,其中的静态方法叫做createInstance)
- 编辑配置文件(applicationContext.xml)
<bean id="staticFactoryInstance" class="instance.BeanStaticFactory" factory-method="createInstance" />
- 测试类同构造方法实例化
4. 实例工厂实例化
使用实例工厂实例化Bean时要求开发者在工厂类中创建一个实例方法来创建Bean的实例。
配置Bean时:
- factory-bean属性指定实例工厂类
- factory-method属性指定工厂类中的实例方法
实例工厂实例化方法:
- 创建工厂类(如类名加BeanInstanceFactory,其中的实例方法叫做createInstance)
- 编辑配置文件(applicationContext.xml)
<bean id="instanceFactoryInstance" factory-bean="instance.BeanInstanceFactory" factory-method="createInstance" />
- 测试类同构造方法实例化
5. 静态工厂和实例工厂辨析
- 静态工厂使用静态方法实例化对象,需要在类中先初始化一个静态实例,在静态方法时返回静态实例。所以使用静态工厂方法实例化的Bean其实永远指向一个实例化对象(单例模式)
- 实例工厂使用一般方法实例化对象,在调用一般方法时,new一个实例并返回。(原型模式)
- 静态工厂工厂配置Bean时使用class指定工厂类,实例工厂使用factory-bean指定工厂类。
6. Bean的作用域
| 作用域名称 | 描述 |
| --- | --- |
| singleton | 默认方式,单例模式 |
| prototype | 原型模式 |
使用scope属性指定作用域
<bean id="test" class="instance.BeanClass" scope="prototype" />
7. Bean的装配方式
Bean的装配方式即Bean的依赖注入方式。
Bean的装配方式有:
- 基于XML配置的方式
- 基于注解的装配方式(最常用,最受青睐)
- 自动装配
8. 基于XML配置的方式
Spring提供了两种基于XML配置的装配方式: - 使用构造方法注入
- Bean的实现类需要提供带参数的构造方法
- 需要在配置文件中使用元素的子元素来定义构造方法的参数
- 使用属性的setter方法注入
- Bean的实现类提供一个默认无参构造方法
- 需要注入的属性提供对应的setter方法
- 在使用元素的子元素为每个属性注入值
基于XML配置的装配:
- 创建Bean的实现类
配置Bean
<!-- 使用构造方法依赖注入 --> <bean id="user" class="User"> <constructor-arg index="0" value="focus" /> <constructor-arg index="1"> <list> <value>听歌</value> <value>睡觉</value> </list> </constructor-arg> </bean>
<!-- 使用setter方法依赖注入 --> <bean id="user" class="User"> <property name="userName" value="focus" /> <property name="hobbyList"> <list> <value>听歌</value> <value>睡觉</value> </list> </property> </bean>
测试XML配置
// 初始化Spring容器ApplicationContext,价值配置文件 ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml"); // 测试构造方法实例化Bean User u1 = (User)appCon.getBean("user");
9. 基于注解的装配方式
@Component
该注解是一个泛化的概念,表示一个组件对象(Bean)。可以作用在任何层次上。
@Repository
该注解用于将数据访问层(DAO)的类标识为Bean。功能与@Component相同。
@Service
该注解用于将业务逻辑组件类(Service层)标识为Bean。功能与@Component相同。
@Controller
该注解用于将控制器类(Controller层)标识为Bean。功能与@Component相同。
@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配。
@Autowired默认按照Bean的类型进行装配,如果想按照名称装配,需要和@Qualifier注解一起使用。效果等同于@Resource@Resource
该注解与@Autowired功能相同,区别在于该注解按照名称来装载注入。
使用注解的方式:- 创建带注解的Bean实现类
配置注解,扫描指定包:
<context:component-scan base-package="annotation" />
测试Bean实例
习题
1. Bean的实例化有哪几种常见的方法?
- 构造方法实例化
- 静态工厂实例化
- 实例工厂实例化
2. 简述基于注解的装配方式的基本用法。
- 创建带注解的Bean实现类
- 配置注解,指定扫描包路径:
- 测试Bean实例
3. @Autowird和@Resource有什么区别?
- @Autowird和@Resource功能相似,都可以实现对类成员变量、方法及构造方法进行标注,完成自动装配。
- @Autowired默认按照Bean的类型进行装配,如果想按照名称装配,需要和@Qualifier注解一起使用。效果等同于@Resource
- @Resource注解按照名称来装载注入
4. Bean的默认作用域是singleton。
5. 下面的代码片段中使用@Controller注解装配了Bean,则Bean的id是testController。
@Controller public class TestController { ... }
第四章:Spring AOP
基本概念
1. AOP(Aspect-Oriented Programming)的基本概念
AOP即面向切面编程,与OOP相辅相成。
在OOP中以类作为程序的基本单元。
在AOP中以Aspect(切面)作为基本单元。
AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,在程序编译或运行阶段将抽取的代码应用在需要执行的地方。2. AOP的术语
(1)切面(Aspect)
切面是指封装横切到系统功能(事务处理)的类。(2)连接点(Joinpoint)
连接点是指程序运行中的一些时间点,例如方法的调用或异常的抛出。(3)切入点(Pointcut)
切入点指需要处理的连接点。在Spring AOP中,所有方法的执行都是连接点。通过切入点确定哪些连接点需要被处理。(4)通知(Advice)
通知是由切面添加到特定的连接点的一段代码,即在定义好的切入点处所要执行的程序代码。(5)引入(Introduction)
引入允许在现有的实现类中添加自定义的方法和属性。(6)目标对象(Target Object)
目标对象即所有被通知的对象。
如果AOP框架使用运行时代理(动态AOP)来实现切面,那么通知的对象总是一个代理对象。(7)代理(Proxy)
代理是通知应用到目标对象之后被动态创建的对象。(8)织入(Weaving)
织入是将切面代码插入到目标对象上,生成代理对象的过程。
AOP织入的方式: - 编译期织入
- 类装载器织入
- 动态代理(运行时)织入
常用AOP框架实现织入方式:
- Spring AOP:默认采用动态代理织入
- AspectJ:采用编译器织入和类装载器织入
3. 基于代理类的AOP实现
在Spring中默认使用JDK动态代理实现AOP编程。ProxyFactoryBean创建代理是Spring AOP实现的最基本方式。4. Spring AOP通知类型
(1)环绕通知(MethodInterceptor)
环绕通知是在目标方法执行前和执行后实施增强,可应用于日志记录、事务处理等功能。(2)前置通知(MethodBeforeAdvice)
前置通知是在目标方法执行前实施增强,可应用于权限管理等功能。(3)后置返回通知(AfterReturningAdvice)
后置返回通知是在目标方法成功执行后实施增强,可应用于关闭流、删除临时文件等功能。(4)后置(最终)通知(AfterAdvice)
后置通知是在目标方法执行实施增强,于后置返回通知不同的是,后置通知不管是否发生异常都要执行该通知,该通知可应用于释放资源。(5)异常通知(ThrowsAdvice)
异常通知在方法抛出异常后实施增强,可应用于处理异常、记录日志等功能。(6)引入通知(IntroductionInterceptor)
引入通知是在目标类中添加一些新的方法和属性,可应用于修改目标类(增强类)。5. 基于XML配置开发AspectJ
(1)<aop:config>元素及其子元素
| 元素名称 | 用途 |
| --- | --- |
| <aop:config> | AspectJ的顶层配置元素 |
| <aop:aspect> | - <aop:config>子元素
- 配置一个切面
- 属性ref指定切面的定义 |
| <aop:pointcut> | - <aop:aspect>子元素
- 配置切入点
- 属性expression指定增强哪些方法 |
| <aop:around> | - <aop:aspect>子元素
- 配置环绕通知
- 属性method指定环绕通知方法
- 属性pointcut-ref指定关联的切入点 |
| <aop:before> | - <aop:aspect>子元素
- 配置前置通知
- 属性method指定前置通知方法
- 属性pointcut-ref指定关联的切入点 |
| <aop:after-returning> | - <aop:aspect>子元素
- 配置后置返回通知
- 属性method指定后置返回通知方法
- 属性pointcut-ref指定关联的切入点|
| <aop:after> | - <aop:aspect>子元素
- 配置后置(最终)通知
- 属性method指定后置通知方法
- 属性pointcut-ref指定关联的切入点 |
| <aop:after-throwing> | - <aop:aspect>子元素
- 配置异常通知
- 属性method指定异常通知方法
- 属性pointcut-ref指定关联的切入点
- 没有异常发生时不执行 |
| <aop:declare-parent> | 通知引入新的接口,增强功能 |
(2)基于XML配置开发AspectJ过程
- 导入相关JAR包
- 创建切面类,类中定义相关方法
- 创建配置文件,编写相关配置
<!-- 定义切面 --> <bean id="myAspect" class="MyAspect" /> <!-- AOP配置 --> <aop:config> <!-- 配置切面 --> <aop:aspect ref="myAspect"> <!-- 配置切入点,通知增强哪些方法 --> <aop:poincut expression="execution(* dynamic.jdk.*.*(..))" id="myPointCut" /> <!-- 关联前置通知 --> <aop:before method="before" pointcut-ref="myPointCut" /> </aop:aspect> </aop:config>
expression = "execution({ {returnType}} { {packageName}}.{ {className}}.{ {methodName}}({ {param}}))"
- expression="execution( dynamic.jdk..*(..))":切入点表达式
- 其中除{ {param}}使用".."表示任意参数,其他{ {}}内使用"*"表示匹配所有的类型
- expression="execution( dynamic.jdk..*(..))":切入点表达式
- 测试类
习题
1. 什么是AOP?AOP有哪些术语?为什么要学习AOP编程?
什么是AOP:见基本概念1. AOP(Aspect-Oriented Programming)的基本概念
AOP有哪些术语:见基本概念2. AOP的术语
为什么要学习AOP编程:AOP和OOP相辅相成,AOP实现采用横向抽取机制,将分散在各个方法的重复代码抽取处理,然后在程序编译或运行阶段将抽取出来的代码应用到需要执行的地方。这种横向抽取机制采用传统的OOP无法实现,所以采用AOP对OOP进行补充,以更加方便的实现业务功能如日志记录、性能统计、安全控制等2. 在Java中有哪些常用的动态代理技术?
- JDK动态代理(需要提供接口才能使用)
- CGLIB动态代理(没有提供接口的类,只能采用CGLIB动态代理)
- Javassist
- ASM
3. AspectJ框架的AOP开发方式有几种
- 基于XML配置开发AspectJ
- 基于注解开发AspectJ
第五章:Spring的事务管理
基本概念
1. 基于底层API的编程式事务管理
基于底层API的编程式事务管理就是根据: - PlatformTransactionManager
- TransactionDefinition
- TransactionStatus
几个核心接口,通过编程方式进行事务管理
2. 什么是编程式事务管理?
在代码中显示调用与事务处理相关的方法,这就是编程式事务管理。当只要少数事务操作时,编程式事务管理才比较合适。
3. 什么是声明式事务管理?
Spring的声明式事务管理是通过AOP技术实现的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或加入一个事务,在执行完目标方法之后根据情况提交或回滚事务。
第六章:MyBatis开发入门
MyBatis核心配置文件:mybatis-config.xml(MyBatis全局配置文件,配置MyBatis的运行环境等信息,如数据库连接信息。)
基本概念
1. MyBatis的工作原理
- 读取MyBatis配置文件:mybatis-config.xml
- 加载SQL映射文件:映射文件配置了操作数据库的SQL语句
- 构造SqlSessionFactory会话工厂
- 创建SqlSession会话对象,该会话对象包含了执行SQL语句的所有方法
- Executor执行器:Executor执行器根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存的维护
- MappedStatement对象:Executor执行器中存在一个MappedStatement类型的参数,该参数用于存储要映射的SQL语句的id、参数等信息
- 输入参数映射:输入参数映射过程类似于JDBC对prepareStatement对象设置参数的过程
- 输出参数映射:输出参数映射过程类似于JDBC对结果集的解析过程
2. 在Spring中配置MyBatis工厂
通过与Spring整合,在Spring配置文件中配置MyBatis配置信息
<!-- -->
<!-- 配置数据源 -->
<!-- org.apache.commons.dbcp2.BasicDataSource:数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<!-- com.mysql.jdbc.Driver:驱动 -->
<property name="driverclassName" value="com.mysql.jdbc.Driver" />
<!-- databaseName:数据库名称 -->
<property name="url" value="jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 初始化连接数 -->
<property name="initialSize" value="5" />
</bean>
<!-- 配置MyBatis工厂-->
<!-- org.mybatis.spring.SqlSessionFactoryBean:Spring整合MyBatis工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- ref:上面指定的数据源id -->
<property name="dataSource" ref="dataSource" />
<!-- value:MyBatis核心配置文件路径 -->
<!-- value:MyBatis核心配置文件路径 -->
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml" />
</bean>
习题
1. 简述MyBatis的工作原理。
见基本概念:1. MyBatis的工作原理
第七章:映射器
基本概念
1. MyBatis核心配置文件模板
<!-- -->
<configuration>
<!-- 属性 -->
<properties/>
<!-- 设置 -->
<settings>
<setting name="" value="" />
</settings>
<!-- 类型命名(别名) -->
<typeAliases/>
<!-- 类型处理器 -->
<typeHandlers/>
<!-- 对象工厂 -->
<objectFactory type="" />
<!-- 插件 -->
<plugins>
<plugin interceptor=""></plugin>
</plugins>
<!-- 配置环境 -->
<environments default="">
<!-- 环境变量 -->
<environment id="">
<!-- 事务管理器 -->
<transactionManager type="" />
<!-- 数据源 -->
<dataSource type="" />
</environment>
</environments>
<!-- 数据库厂商标识 -->
<databaseIdProvider type="" />
<!-- 映射器:高速MyBatis到哪里寻找映射文件 -->
<mappers>
<mapper resource="com/mybatis/UserMapper.xml" />
</mappers>
</configuration>
2. SQL映射文件常用配置元素
元素名称 | 描述 |
---|---|
select | 查询语句,最常用 |
insert | 插入语句 |
update | 更新语句 |
delete | 删除语句 |
sql | 定义一部分SQL,可以在多个位置被引用 |
resultMap | 描述从数据库结果集中来加载对象 |
3. 级联查询
级联查询时数据库实体的概念,有3种级联关系:
- 一对一级联
- 一对多级联
- 多对多级联
级联的优点:
- 获取关联数据方便
级联的缺点:
- 增加数据库系统的复杂度
- 降低系统的性能
MyBatis不提供多对多级联,可以通过两个一对多实现多对多级联
第八章:动态SQL
基本概念
<if>:if
<choose>、<when>、<otherwise>
<choose>:switch
<when>:case and break
<otherwise>:default
<trim>、<where>、<set>
<trim>:前后缀
<trim>的主要功能是加上前缀(对应属性prefix)和后缀(对应属性suffix)。
<where>:where语句
<where>元素在写入<where>的地方输出where语句
<set>:更新列
<set>在动态update语句中使用<set>元素更新列。
<foreach>:for迭代
主要用在in条件中,在SQL语句中迭代一个集合。
主要属性:
- item:迭代时别名
- index:迭代过程每次迭代到的位置
- open:以什么开始
- separator:每次迭代之间以什么符号作为分隔符
- close:以什么结束
- collection:必选
- list:单参数且参数类型为List
- array:单参数且参数类型为array数组
- Map:单参数或多参数
- key:参数名
- value:参数值
<bind>:拼接
- 模糊查询时,使用"${}"拼接。无法防止SQL注入。
- 使用字符串拼接函数或连接符号,不同数据库的拼接函数或连接符号不同,不便于移植。
第九章:Spring MVC入门
基本概念
1. MVC模式的概念
MVC时Model、View、Controller的缩写:
- 模型(Model):用于存储数据以及处理用户请求的业务逻辑
- 试图(View):向控制器提交数据,显示模型中的数据
- 控制器(Controller):根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示
MVC的优点:
- MVC3个部分以最低的耦合进行协同工作
- 提供应用的可扩展性和可维护性
2. Spring MVC工作原理
Spring MVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成。
Spring MVC工作流程如下:
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器寻找一个或多个HandlerMapping(寻找控制器),找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑将请求提交到ModelAndView
- DispatcherServlet寻找到一个或多个ViewResolver视图解析器,找到ModelAndView指定视图
- 视图将结果显示到客户端
3. 在web.xml文件中部署DispatcherServlet
在SSM中,除web.xml是默认配置文件,其他都不是默认文件,包括Spring、MyBatis配置文件。<servlet> <servlet-name>springmvc</servlet-name> <!-- 部署DispatcherServlet --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springmvc配置文件路径,不填默认为WEB-INF目录下,命名规则:{ {servletName}}-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-config/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
习题
1. 在开发Spring MVC时如何部署DispatcherServlet?如何创建Spring MVC配置文件?
见基本概念3. 在web.xml文件中部署DispatcherServlet
Spring MVC配置文件:命名规则:servletName-servlet.xml,创建在WEB-INF目录下2. 简述Spring MVC工作原理
见基本概念2. Spring MVC工作原理第十章:Spring MVC的Controller
基本概念
1. RequestMapping注解类型
在RequestMapping注解语句中,注解的value属性将请求的URI映射到方法,value属性是RequestMapping注解的默认属性,如果只有一个value属性,可省略该属性。
@RequestMapping注解有以下两个类型: - 方法级别注解
- 类级别注解
- 在类级别注解的情况下,控制器类的所有方法都被映射为类级别的请求
2. 配置视图解析器
在springmvc配置文件 springmvc-servlet.xml中配置视图解析器:
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolve" id="internalResourceViewResolve">
<!-- 前缀 -->
<property name="prefiex" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
3. Controller接收请求参数的常见方式
- 通过实体Bean接请求参数
- 通过处理方法的形参接收请求参数
- 通过HttpServletRequest接收请求参数
- 通过@PathVariable接收URL中的请求参数
- 通过@RequestParam接收请求参数
- 通过@ModelAttribute接收请求参数
4. 重定向与转发
- 重定向:用户从当前处理请求定向到另一个视图或处理请求,之前的请求全部失效,进入到一个新的request作用域(redirect)
- 转发:用户对当前处理的请求转发到另一个视图或处理请求,之前的request存放的信息不会失效(forward)
习题
1. 在Spring MVC的控制器类中如何访问Servlet API?
- 使用 Servlet API 作为控制器方法的入参
- 使用 Spring MVC 的 Servlet API 代理类作为控制器方法的入参
- 使用 IO 流对象作为控制器方法的入参
2. 控制器接收请求参数的常见方式有哪几种?
见基本概念3. Controller接收请求参数的常见方式
第12章:数据绑定与表单标签库
基本概念
1. 数据绑定
数据绑定是将用户参数输入值绑定到领域模式的一种特性。
数据绑定的优点:
- 不再需要手动将HTTP请求中的String类型转换为模型需要的类型
- 当输入验证失败时会重新生成一个HTML表单,无需重新填写输入字段
2. 表单标签库
JSP中使用Spring表单标签库时,必须在JSP页面开头处生命taglib指令,指令代码如下:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
在表单标签库有:
- form:渲染表单元素
- input:渲染元素
- password:渲染元素
- hidden:渲染元素
- textarea:渲染textarea元素
- checkbox:渲染一个元素
- checkboxs:渲染多个元素
- radiobutton:渲染一个元素
- radiobuttons:渲染多个元素
- select:渲染一个选择元素
- option:渲染一个选项元素
- options:渲染多个选项元素
- errors:在span元素中渲染字段错误
其中,可以绑定集合的元素有:
- checkboxes
- radiobuttons
- select
- option
- options
第十三章:拦截器
基本概念
1. 拦截器的概念
拦截器主要用于拦截用户请求并做相应的处理,通常用于权限验证、记录请求信息日志、判断是否登录。
2. 拦截器的定义
定义拦截器有两种方法:
- 实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类
- 实现WebRequestInterceptor或继承WebRequestInterceptor接口的实现类
HandlerInterceptor接口定义的3个方法:
- preHandle:控制器处理请求方法前执行。返回true:向下执行,返回false:中断后续操作
- postHandle:控制器的处理请求方法调用之后,解析视图之前执行。通过此方法对请求域中的模型和视图进一步修改
- afterCompletion:在视图渲染结束后执行,实现资源清理、记录日志等功能
3. 拦截器的执行流程
- 配置web.xml
- 创建控制器类
- 创建拦截器类,定义拦截器
- 创建springmvc配置文件,在配置文件中配置视图解析器和拦截器
<mvc:interceptors> <!-- 全局拦截器 --> <bean class="拦截器路径" /> <!-- 局部拦截器 --> <mvc:interceptor> <!-- 拦截器作用路径 --> <mvc:mapping path="作用路径" /> <bean class="拦截器路径" /> </mvc:interceptor> </mvc:interceptors>
- 创建视图JSP文件
- 测试拦截器
第十七章:文件的上传和下载
基本概念
1. 文件上传
文件上传需要将表单的enctype配置为multipart/form-data,请求方法设置为post,使用标签上传文件。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" />
...
</form>
第十八章:EL与JSTL
基本概念
1. EL
EL(Expression Language,表达式语言),基本语法为${表达式}
,通过page指令的isELIgnored属性说明是否支持EL语言,为true时,不支持;为false,支持,默认为false
2. EL隐含对象
常用隐含对象:
- pageScope
- requestScope
- sessionScope
- applicationScope
- param
- paramValues
与作用范围有关的隐含对象
- pageScope
- requestScope
- sessionScope
- applicationScope
与请求参数有关的隐含对象:
- param
- paramValues
3. JSTL
JSP标准标签库(Java Server Pages Standard Tag Library,JSTL)。
通用标签
<c:out>:显示数据内容
<c:set>
- 设置作用域变量
- 设置JavaBean属性
<c:remove>:删除某个变量
流程控制标签
<c:if>:if
<c:choose>、<c:when>及<c:otherwise>:if/elseif/else
迭代标签
<c:forEach>:增强for循环
<c:forTokens>:迭代字符串中由分隔符分隔的各成员
习题
1. 在Web应用程序中有以下程序代码段,执行后转发到某个JSP页面:
ArrayList<String> dogNames = new ArrayList<String>();
dogNames.add("goodDog");
request.setAttribute("dog", dogNames);
可以使用${dogs[0]}
正确地使用EL取得数组中的值。