文章目录
- Spring的验证更严格。
- Spring验证的简单小例子
- Validator的使用
- SpringEL简介
- SpringEL介绍
- SpringEL使用
- 基于xml配置数据源
- 项目结构
- Computer.java
- IntelCPU.java
- Memory.java
- Test.java
- beans.xml
- 基于注解配置数据源
- 项目结构
- Computer.java
- Memory.java
- IntelCPU
- Test.java
- beans.xml
- SpringEL使用实例
- SpringEL方法
- SpringEL构造
- SpringEl操作符
- SpringEl集合
数据验证主要分为前端验证与后端验证,都不应该省掉
Spring的验证更严格。
数据验证不应该被限定在web层去处理,它应该在任何需要做数据验证的地方做验证
基于以上考虑,Spring设计了一个既方便又可以在所有层使用的Validator接口
Spring验证的简单小例子
Validator的使用
SpringEL简介
SpringEL介绍
- Spring表达式语言(简称SpEL)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言
- 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数
- 虽然SpEL引擎作为Spring 组合里的表达式解析的基础 ,但它不直接依赖于Spring,可独立使用
支持运算并且可以调用方法,比 EL 功能更强大
可以实现Bean数据的动态注入
第一行代码:EL表达式解析器
SpringEL使用
- SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复杂表达式,存取对象属性、对象方法调用
- SpEL表达式可以与XML或基于注解的配置元数据使用定义
- 定义表达式的语法形式:#{<表达式字符串>}
OGNL:对象导航图语言,常用于strust框架。
JSF EL:java server face
基于xml配置数据源
项目结构
Computer.java
package com;
import javax.imageio.stream.MemoryCacheImageInputStream;
public class Computer {
private String brand;//品牌
private Memory memory;//内存
private int count;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}//内存大小
public void show() {
System.out.println("内存的大小为 "+count);
}
}
IntelCPU.java
package com;
public class IntelCpu {
public void run() {
System.out.println("intel cpu is running");
}
}
Memory.java
package com;
public class Memory {
private int memCount;//内存大小
public int getMemCount() {
return memCount;
}
public void setMemCount(int memCount) {
this.memCount = memCount;
}
}
Test.java
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// //1. 启动Spring容器,参数是数据配置的文件名,
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// //2. 从容器中拿到对象
Computer pc = (Computer)ctx.getBean("Computer");
pc.show();
}
}
beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean id="Memory" class="com.Memory">
<property name="memCount" value="1024"/>
</bean>
<bean id="Computer" class="com.Computer">
<property name="brand" value="Lenovo"/>
<property name="memory" ref="Memory"/>
<property name="count" value="#{Memory.memCount}"/>
</bean>
</beans>
基于注解配置数据源
项目结构
Computer.java
package com;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("Computer")
public class Computer {
private String brand;//品牌
private Memory memory;//内存
//动态赋值,#{}不可少,参数为类.属性
//因为没有在Memory类上起别名,默认小写开头
@Value("#{Memory.memCount}")
private int count;//内存大小
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}//内存大小
public void show() {
System.out.println("内存的大小为 "+count);
}
}
Memory.java
package com;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("Memory")
public class Memory {
@Value("2048")
private int memCount;
public Memory() {
System.out.println("这是Memory类打印的信息");
}
public int getMemCount() {
return memCount;
}
public void setMemCount(int memCount) {
this.memCount = memCount;
}
}
IntelCPU
package com;
public class IntelCpu {
public void run() {
System.out.println("intel cpu is running");
}
}
Test.java
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// //1. 启动Spring容器,参数是数据配置的文件名,
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// //2. 从容器中拿到对象
Computer pc = (Computer)ctx.getBean("Computer");
pc.show();
}
}
beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:annotation-config></context:annotation-config>
<!-- 扫描注解com包 -->
<context:component-scan base-package="com"></context:component-scan>
</beans>
SpringEL使用实例
SpringEL方法
如果你有什么方法,可以直接拿来调用。
可以是系统方法,也可以是自定义方法
只有有返回值,并且返回值的类型与你属性一致就ok
package com;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("Computer")
public class Computer {
//系统已有方法
@Value("#{'abc'.toUpperCase()}")
private String brand;//品牌
private Memory memory;//内存
//自定义方法
@Value("#{MyMathUtil.area(2,3)}")
private int area;
//动态赋值,#{}不可少,参数为类.属性
//因为没有在Memory类上起别名,默认小写开头
@Value("#{Memory.memCount}")
private int count;//内存大小
//------------------------------------------
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}//内存大小
public void show() {
System.out.println(brand);
System.out.println(area);
System.out.println("内存的大小为 "+count);
}
}
package com;
import org.springframework.stereotype.Component;
@Component("MyMathUtil")
public class MathUtil {
public int area(int l, int w) {
return l*w;
}
}
SpringEL构造
package com;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("Computer")
public class Computer {
//参数的包名不可少
@Value("#{new com.Memory()}")
private Memory memory;//内存
}
package com;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("Memory")
public class Memory {
@Value("2048")
private int memCount;
public Memory() {
System.out.println("这是Memory类打印的信息");
}
public int getMemCount() {
return memCount;
}
public void setMemCount(int memCount) {
this.memCount = memCount;
}
}
SpringEl操作符
查num2时候有可能会存在找不到属性的报错,那是因为num1是私有属性,没有公有方法,加上get方法就ok了
算数 > 关系 > 逻辑 > 赋值
SpringEl集合
**
**