用织梦建设网站的步骤/写文章一篇30元兼职
文章目录
- OGNL 介绍
- OGNL 使用场景
- - ognl
- - 主要功能
- - 注意事项
- - Ognl类的主要方法
- - 设置值
- - 获取值
- - 使用示例
- - Mybatis
- Java原生表达式的使用
- - Fastjson
- - JSONPath类的主要方法
- - 主要功能
- - JSONPath的优势
- - 使用示例
- Spring不选择OGNL的原因
OGNL 介绍
OGNL(Object Graph Navigation Language)表达式语言是一种用于Java语言的表达式语言,专门用于在对象图中进行导航和操作。
在Java中,OGNL可以让开发人员以简洁的方式访问和操作Java对象的属性、调用对象的方法,执行算术和逻辑运算,以及处理集合和数组等操作。OGNL的语法简洁明了,可以方便地用于在Java开发中进行动态属性存取、列表和Map操作、函数和方法调用等,为开发人员提供了便利的数据操作手段。
OGNL 使用场景
常见使用场景:
- ognl
- Fastjson
- ognl
使用ognl包需要引入依赖
maven依赖:
<dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.3.4</version>
</dependency>
- 主要功能
-
访问对象属性:
使用点号(.)来访问对象的属性(也可设置对象的属性)。例如:person.name 表示访问 person 对象的 name 属性。
-
调用对象方法
使用at符号(@)来调用对象的方法。例如:@java.lang.Math@random() 表示调用 Math 类的 random 方法。
-
访问集合和数组:
使用方括号([])来访问集合或数组中的元素。例如:myList[0] 表示访问 myList 集合中的第一个元素。
-
赋值和表达式计算:
支持变量赋值和基本的算术、逻辑运算符。例如:age > 18 && age < 60 表示对 age 变量进行逻辑判断。
-
条件表达式:
支持条件运算符,如三元运算符 condition ? true : false。
-
对象引用:
使用(#)符号来引用对象。例如:#person.name 表示引用 person 对象的 name 属性。
-
内置对象:
OGNL中有一些内置对象,如 #context(上下文对象)、#root(根对象)、#this(当前对象)等,可以方便地用于表达式中的引用和操作。
- 注意事项
- 当表达式expression中的属性不存在时,获取或设置值会报错
- Ognl类的主要方法
applyExpressionMaxLength
:设置Ognl 表达式的最大允许长度限制- void applyExpressionMaxLength(Integer expressionMaxLength)
- expressionMaxLength:表达式的最大允许长度
- void applyExpressionMaxLength(Integer expressionMaxLength)
freezeExpressionMaxLength
:冻结 Ognl 表达式的最大允许长度的限制- void freezeExpressionMaxLength()
thawExpressionMaxLength
:解除 Ognl 表达式的最大允许长度的限制- void thawExpressionMaxLength()
createDefaultContext
:创建一个默认的 Ognl 上下文对象- Map createDefaultContext(Object root)
- root:根对象
- Map createDefaultContext(Object root, ClassResolver classResolver)
- root:根对象
- classResolver:类解析器
- Map createDefaultContext(Object root, ClassResolver classResolver, TypeConverter converter)
- root:根对象
- classResolver:类解析器
- converter:类型转换器
- Map createDefaultContext(Object root, MemberAccess memberAccess)
- root:根对象
- memberAccess:成员访问对象
- Map createDefaultContext(Object root, MemberAccess memberAccess, ClassResolver classResolver, TypeConverter converter)
- root:根对象
- memberAccess:成员访问对象
- classResolver:类解析器
- converter:类型转换器
- Map createDefaultContext(Object root)
addDefaultContext
:向默认 Ognl 上下文中添加一个自定义的上下文对象- Map addDefaultContext(Object root, Map context)
- root:根对象
- context:上下文对象
- Map addDefaultContext(Object root, ClassResolver classResolver, Map context)
- root:根对象
- classResolver:类解析器
- context:上下文对象
- Map addDefaultContext(Object root, ClassResolver classResolver, TypeConverter converter, Map context)
- root:根对象
- classResolver:类解析器
- converter:类型转换器
- context:上下文对象
- Map addDefaultContext(Object root, MemberAccess memberAccess, ClassResolver classResolver, TypeConverter converter, Map context)
- root:根对象
- memberAccess:成员访问对象
- classResolver:类解析器
- converter:类型转换器
- context:上下文对象
- Map addDefaultContext(Object root, Map context)
compileExpression
:将字符串表达式编译为 Ognl 表达式对象- Node compileExpression(OgnlContext context, Object root, String expression)
- context:上下文对象
- expression:字符串表达式
- Node compileExpression(OgnlContext context, Object root, String expression)
parseExpression
:将字符串表达式解析为 Ognl 表达式对象- Object parseExpression(String expression)
- expression:字符串表达式
- Object parseExpression(String expression)
getLastEvaluation
:从上下文中获取最后一个评估(Evaluation)对象- Evaluation getLastEvaluation(Map context)
- context:上下文对象
- Evaluation getLastEvaluation(Map context)
setRoot
:设置 Ognl 表达式的根对象- void setRoot(Map context, Object root)
- context:上下文对象
- root:根对象
- void setRoot(Map context, Object root)
getRoot
:获取 Ognl 表达式的根对象- Object getRoot(Map context)
- context:上下文对象
- Object getRoot(Map context)
isConstant
:判断给定的表达式是否是常量- isConstant(Object tree)
- tree:Ognl 表达式对象
- isConstant(Object tree, Map context)
- tree:Ognl 表达式对象
- context:上下文对象
- isConstant(String expression)
- expression:字符串表达式
- isConstant(String expression, Map context)
- expression:字符串表达式
- context:上下文对象
- isConstant(Object tree)
isSimpleProperty
:判断给定的表达式是否是简单的属性- isSimpleProperty(String expression)
- expression:字符串表达式
- isSimpleProperty(String expression, Map context)
- expression:字符串表达式
- context:上下文对象
- isSimpleProperty(Object tree)
- tree:Ognl 表达式对象
- isSimpleProperty(Object tree, Map context)
- tree:Ognl 表达式对象
- context:上下文对象
- isSimpleProperty(String expression)
isSimpleNavigationChain
:判断给定的表达式是否是简单的导航链- isSimpleNavigationChain(String expression)
- expression:字符串表达式
- isSimpleNavigationChain(String expression, Map context)
- expression:字符串表达式
- context:上下文对象
- isSimpleNavigationChain(Object tree)
- tree:Ognl 表达式对象
- isSimpleNavigationChain(Object tree, Map context)
- tree:Ognl 表达式对象
- context:上下文对象
- isSimpleNavigationChain(String expression)
setValue
:将给定的值设置到根对象的属性中-
void setValue(String expression, Object root, Object value)
根据表达式定位到根对象的属性,并将给定的值设置为该属性的值- expression:字符串表达式
- root:根对象
- value:要设置的值
-
void setValue(String expression, Map context, Object root, Object value)
使用给定的上下文对象和根对象,根据表达式定位到根对象的属性,并将给定的值设置为该属性的值- expression:字符串表达式
- context:上下文对象
- root:根对象
- value:要设置的值
-
void setValue(Object tree, Object root, Object value)
使用表达式对象定位到根对象的属性,并将给定的值设置为该属性的值- tree:Ognl 表达式对象
- root:根对象
- value:要设置的值
-
void setValue(Object tree, Map context, Object root, Object value)
使用给定的上下文对象和根对象,根据表达式对象定位到根对象的属性,并将给定的值设置为该属性的值- tree:Ognl 表达式对象
- context:上下文对象
- root:根对象
- value:要设置的值
-
void setValue(ExpressionAccessor expression, OgnlContext context, Object root, Object value)
使用给定的表达式访问器、上下文对象和根对象,定位到根对象的属性,并将给定的值设置为该属性的值- expression:Ognl 表达式访问器
- context:Ognl 表达式访问器
- root:根对象
- value:要设置的值
-
getValue
:通过给定的表达式从根对象中获取属性值- Object getValue(String expression, Object root)
根据表达式定位到根对象的属性,并返回该属性的值- expression:字符串表达式
- root:根对象
- Object getValue(String expression, Object root, Class resultType)
根据表达式定位到根对象的属性,并将返回的值转换为指定的结果类型- expression:字符串表达式
- root:根对象
- resultType:结果类型
- Object getValue(String expression, Map context, Object root)
使用给定的上下文对象和根对象,根据表达式定位到根对象的属性,并返回该属性的值- expression:字符串表达式
- context:上下文对象
- root:根对象
- Object getValue(String expression, Map context, Object root, Class resultType)
使用给定的上下文对象和根对象,根据表达式定位到根对象的属性,并将返回的值转换为指定的结果类型- expression:字符串表达式
- context:上下文对象
- root:根对象
- resultType:结果类型
- Object getValue(Object tree, Object root)
使用表达式对象定位到根对象的属性,并返回该属性的值- tree:Ognl 表达式对象
- root:根对象
- Object getValue(Object tree, Object root, Class resultType)
使用表达式对象定位到根对象的属性,并将返回的值转换为指定的结果类型- tree:Ognl 表达式对象
- root:根对象
- resultType:结果类型
- Object getValue(Object tree, Map context, Object root)
使用给定的上下文对象和根对象,根据表达式对象定位到根对象的属性,并返回该属性的值- tree:Ognl 表达式对象
- context:上下文对象
- root:根对象
- Object getValue(Object tree, Map context, Object root, Class resultType)
使用给定的上下文对象和根对象,根据表达式对象定位到根对象的属性,并将返回的值转换为指定的结果类型- tree:Ognl 表达式对象
- context:上下文对象
- root:根对象
- resultType:结果类型
- Object getValue(ExpressionAccessor expression, OgnlContext context, Object root)
使用给定的表达式访问器、上下文对象和根对象,定位到根对象的属性,并返回该属性的值- expression:Ognl 表达式访问器
- context:Ognl 上下文对象
- root:根对象
- Object getValue(ExpressionAccessor expression, OgnlContext context, Object root, Class resultType)
使用给定的表达式访问器、上下文对象和根对象,定位到根对象的属性,并将返回的值转换为指定的结果类型- expression:Ognl 表达式访问器
- context:Ognl 上下文对象
- root:根对象
- resultType:结果类型
- Object getValue(String expression, Object root)
- 设置值
-
使用字符串表达式方式设置值
public static void main(String[] args) throws Exception {// 创建一个根对象Person person = new Person("John", 25);// 创建一个 Ognl 上下文OgnlContext context = new OgnlContext();context.setRoot(person);// 使用字符串表达式方式设置值Ognl.setValue("name", context, person, "Alice");Ognl.setValue("age", context, person, 30);// 输出更新后的属性值System.out.println(person.getName()); // 输出:AliceSystem.out.println(person.getAge()); // 输出:30}
-
使用 Ognl 表达式对象方式设置值
public static void main(String[] args) throws Exception {// 创建一个根对象Person person = new Person("John", 25);// 创建一个 Ognl 表达式对象Object tree = Ognl.parseExpression("name");// 使用表达式对象方式设置值Ognl.setValue(tree, person, "Alice");// 输出更新后的属性值System.out.println(person.getName()); // 输出:Alice}
-
使用 Ognl 表达式访问器和 Ognl 上下文对象方式设置根值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("John", 25);// 创建一个 Ognl 上下文OgnlContext context = new OgnlContext();context.setRoot(person);// 创建一个 Ognl 表达式访问器ExpressionAccessor expression = OgnlRuntime.getPropertyAccessor(Person.class);// 使用表达式访问器和上下文对象设置值Object tree = Ognl.parseExpression("age");Ognl.setValue(expression, context, person, tree, 30);// 输出更新后的属性值System.out.println(person.getAge()); // 输出:30}
- 获取值
-
使用字符串表达式方式获取值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("Alice", 30);// 使用字符串表达式方式获取值Object nameValue = Ognl.getValue("name", person);System.out.println(nameValue); // 输出:Alice// 使用字符串表达式方式获取值Object ageValue = Ognl.getValue("age", person);System.out.println(ageValue); // 输出:30}
-
使用字符串表达式及Ognl 上下文对象方式获取值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("Alice", 30);// 创建一个 Ognl 上下文OgnlContext context = new OgnlContext();context.setRoot(person);// 使用带上下文参数的字符串表达式方式获取值Object nameValue = Ognl.getValue("name", context, person);System.out.println(nameValue); // 输出:Alice// 使用带上下文参数的字符串表达式方式获取值Object ageValue = Ognl.getValue("age", context, person);System.out.println(ageValue); // 输出:30}
-
使用 Ognl 表达式对象方式获取值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("Alice", 30);// 创建一个 Ognl 表达式对象Object nameTree = Ognl.parseExpression("name");// 使用表达式对象方式获取值Object nameValue = Ognl.getValue(nameTree, person);System.out.println(nameValue); // 输出:Alice}
-
使用 Ognl 表达式对象及Ognl 上下文对象方式获取值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("Alice", 30);// 创建一个 Ognl 上下文OgnlContext context = new OgnlContext();context.setRoot(person);// 创建一个 Ognl 表达式对象Object nameTree = Ognl.parseExpression("name");// 使用表达式对象方式获取值Object nameValue = Ognl.getValue(nameTree, context, person);System.out.println(nameValue); // 输出:Alice}
-
使用自定义的表达式访问器和上下文对象方式获取值
public static void main(String[] args) throws OgnlException {// 创建一个根对象Person person = new Person("Alice", 30);// 创建一个 Ognl 上下文OgnlContext context = new OgnlContext();context.setRoot(person);// 创建一个自定义的表达式访问器ExpressionAccessor expression = OgnlRuntime.getPropertyAccessor(Person.class);// 使用自定义的表达式访问器和上下文对象获取值Object ageValue = Ognl.getValue(expression, context, person, "age");System.out.println(ageValue); // 输出:30}
- 使用示例
maven依赖
<dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.3.4</version>
</dependency>
实现源码
public class OGNLTest {@Data@NoArgsConstructor@AllArgsConstructorpublic static class User {public Integer userId;public String userName;public Sex sex;}@Data@NoArgsConstructor@AllArgsConstructorpublic static class Sex {public Integer sexCode;public String sexName;}public static void main(String[] args) throws OgnlException {// 访问对象属性User user = new User(111111, "哈哈", new Sex(1, "男"));Integer userId = (Integer) Ognl.getValue("userId", user);System.out.println(userId);// 111111Integer sexCode = (Integer) Ognl.getValue("sex.sexCode", user);System.out.println(sexCode);// 1// 调用对象方法Double random = (Double) Ognl.getValue("@java.lang.Math@random()", null);System.out.println(random);// 0.9562367273068916// 访问集合和数组List<User> list = Stream.of(user).collect(Collectors.toList());String sexName = (String) Ognl.getValue("[0].sex.sexName", list);System.out.println(sexName);// 男// 赋值和表达式计算boolean isMan = (Boolean) Ognl.getValue("sex.sexCode == 1", user);System.out.println(isMan);// true// 条件表达式String sex = (String) Ognl.getValue("sex.sexCode == 1 ? \"男\" : \"女\"", user);System.out.println(sex);// 男// 对象引用Map<String,Object> context = new HashMap<>();context.put("aaa", new Sex(2, "女"));Integer sexCode1 = (Integer) Ognl.getValue("#aaa.sexCode", context, user);System.out.println(sexCode1);// 2// 内置对象Integer sexCode2 = (Integer) Ognl.getValue("#root.sex.sexCode", user);System.out.println(sexCode2);// 1Integer sexCode3 = (Integer) Ognl.getValue("#this.sex.sexCode", user);System.out.println(sexCode3);// 1}
}
- Mybatis
MyBatis 早期版本确实使用过 OGNL 作为表达式语言,特别是在动态 SQL 处理中。在 MyBatis 的 XML 配置文件中,OGNL 被用来处理一些复杂的表达式,例如在 、 等标签中进行条件判断。
然而,由于 OGNL 存在一些性能和安全问题,MyBatis 在后续版本中逐步淘汰了 OGNL,转而使用更为简洁和安全的 OGNL 变种 或 Java 原生表达式。目前,OGNL 仍然可以通过自定义插件使用,但它已不再是 MyBatis 的核心功能。
Java原生表达式更简单、更安全,并且能够直接利用 Java 语言的语法和功能进行条件判断、循环等操作。
Java原生表达式的使用
在 MyBatis 中,Java原生表达式主要用于动态 SQL 的编写,特别是在 、、 等标签中,用于控制 SQL 的生成逻辑。
基本语法:
在 MyBatis 中,Java原生表达式通常出现在如下标签的属性中:
- :用于条件判断
- :类似于 switch-case 的控制结构
- :用于循环生成 SQL 部分
- :用于动态 SQL 中的空白字符去除
常用的Java 原生表达式:
- 条件表达式
- 三元运算符
- 逻辑运算符
- 逻辑运算(&&, ||, !)
- 数学运算(+, -, *, /)
- 类型转换(通过 (type) 强制转换)
- 方法调用(如 string.equals())
使用示例:
(1) 标签中的 Java 原生表达式:
标签用于根据某个条件动态地生成 SQL 片段。我们可以在 标签中直接使用 Java 表达式进行条件判断。
<select id="selectUser" resultType="User">SELECT * FROM users<where><if test="username != null">AND username = #{username}</if><if test="age != null">AND age = #{age}</if></where>
</select>
- test=“username != null” 中的 username != null 就是一个 Java 原生表达式。
- 在这里,test 属性值就是 Java 表达式的条件判断语句,如果表达式结果为 true,那么 中的 SQL 片段才会被加入到最终生成的 SQL 中。
(2) 标签中的 Java 原生表达式:
标签类似于 Java 中的 switch-case 语法,用于根据多个条件选择生成不同的 SQL 片段。
<select id="selectUser" resultType="User">SELECT * FROM users<where><choose><when test="age != null">AND age = #{age}</when><when test="username != null">AND username = #{username}</when><otherwise>AND status = 'active'</otherwise></choose></where>
</select>
- 允许在多个 中根据不同条件选择合适的 SQL 片段。
- 每个 中的 test 属性也可以使用 Java 表达式。
(3) 标签中的 Java 原生表达式:
标签用于循环生成 SQL 片段,通常用于处理数组、集合或列表类型的参数。
<select id="selectUsersByIds" resultType="User">SELECT * FROM users<where><foreach collection="ids" item="id" open="AND id IN (" separator="," close=")">#{id}</foreach></where>
</select>
- collection=“ids”:表示传入的参数集合或数组。
- 在 标签中,我们可以使用 Java 表达式来处理循环逻辑和参数拼接。
(4) 使用 Java 原生三元运算符:
在 MyBatis 中,Java原生表达式也支持使用 Java 的三元运算符来简化条件判断。
<select id="selectUser" resultType="User">SELECT * FROM usersWHERE status = <if test="status != null">#{status}</if><if test="status == null">'active'</if>
</select>
使用三元运算符来替代多重条件判断,改为:
<select id="selectUser" resultType="User">SELECT * FROM usersWHERE status = #{status != null ? status : 'active'}
</select>
(5) 标签中的 Java 原生表达式:
标签用于对生成的 SQL 语句进行前后字符的去除(如去掉 AND 或 OR 等)。
<select id="selectUser" resultType="User">SELECT * FROM users<trim prefix="WHERE" prefixOverrides="AND |OR "><if test="status != null">AND status = #{status}</if><if test="age != null">AND age = #{age}</if></trim>
</select>
- Fastjson
- JSONPath类的主要方法
-
Object
eval
(String json, String path)
通过给定的 JSON 数据和 JSONPath 表达式,返回匹配该表达式的结果对象 -
JSONArray
extract
(Object json, String path)
根据指定的 JSONPath 表达式,从 JSON 对象中提取匹配的 JSON 数组。返回一个 JSONArray 对象 -
boolean
contains
(Object json, String path)
判断 JSON 数据中是否包含匹配指定 JSONPath 表达式的内容 -
boolean
containsValue
(Object json, String path, Object value)
判断 JSON 对象中匹配 JSONPath 表达式的内容是否包含指定的值 -
int
size
(Object json, String path)
计算 JSONPath 表达式匹配的内容的大小,并返回匹配结果的个数 -
Set<?>
keySet
(Object json, String path)
返回 JSONPath 表达式匹配的所有键值的 Set 集合 -
void
arrayAdd
(Object rootObject, String path, Object… values)
在 JSON 对象中的指定位置添加一个或多个元素 -
void
remove
(Object json, String path)
根据指定的 JSONPath 表达式,从 JSON 对象中移除匹配路径的内容 -
void
set
(Object json, String path, Object value)
根据指定的 JSONPath 表达式,在 JSON 对象中设置匹配路径的值为指定的 value -
JSONPath
compile
(String path)
编译 JSONPath 表达式,返回一个对应的 JSONPath 对象这个方法可以提高后续对同一个 JSONPath 表达式的操作性能。
-
Object
read
(String json, String path)
读取 JSON 数据中指定 JSONPath 表达式的值 -
List
paths
(Object json, String path)
获取 JSON 对象中匹配指定 JSONPath 表达式的所有路径,并返回一个 JSONPath 列表 -
void
setArrayItem
(Object json, String path, Object value)
根据指定的 JSONPath 表达式,在 JSON 数组中设置匹配路径的元素为指定的 value -
void
removeArrayItem
(Object json, String path, int index)
根据指定的 JSONPath 表达式,从 JSON 数组中移除指定索引位置的元素
- 主要功能
-
设置JSON对象中的属性值
-
获取JSON对象中的属性值
- JSONPath的优势
- 设置JSON对象中的属性值时,如果属性不存在,也会自动创建
- 获取JSON对象中的属性值是,如果属性不存在,不会报错空指针,会返回null
- 使用示例
public class OGNLTest {public static void main(String[] args) {// 设置JSON对象中的属性值JSONObject jsonObject = new JSONObject();JSONPath.set(jsonObject, "$.role.roleName", "管理员");JSONPath.set(jsonObject, "$.user.userName", "Joker");System.out.println(JSON.toJSONString(jsonObject));// {"role":{"roleName":"管理员"},"user":{"userName":"Joker"}}JSONObject jsonObject1 = JSON.parseObject("{\"role\":{\"roleName\":\"管理员\"},\"user\":{\"userName\":\"Joker\"}}");JSONPath.set(jsonObject1, "$.user.userId", 18);System.out.println(JSON.toJSONString(jsonObject1));// {"role":{"roleName":"管理员"},"user":{"userName":"Joker","userId":18}}// 获取JSON对象中的属性值System.out.println(JSONPath.eval(jsonObject, "$.role.roleName"));// 管理员System.out.println(JSONPath.eval(jsonObject, "$.user.userName"));// JokerSystem.out.println(JSONPath.eval(jsonObject, "$.user.age"));// nullSystem.out.println(JSONPath.eval(jsonObject, "$.user.sex.setName"));// null}
}
Spring不选择OGNL的原因
Spring 官方推荐的表达式语言是Spring Expression Language (SpEL) ,它提供了更强大的功能和更多的特性。
为什么Spring使用SpEL替代了OGNL了呢:
- OGNL 在早期版本中被发现存在一些安全漏洞,尤其是当其用于动态求值时,可能会导致恶意代码执行。因此,在使用 OGNL 时要特别小心,尽量避免在不信任的输入中执行 OGNL 表达式,或使用一些安全措施来过滤不安全的表达式。
可参考文章:
Spring SpEL表达式的使用
相关文章:

Java中OGNL表达式语言的使用
文章目录 OGNL 介绍OGNL 使用场景- ognl- 主要功能- 注意事项- Ognl类的主要方法- 设置值- 获取值- 使用示例 - MybatisJava原生表达式的使用 - Fastjson- JSONPath类的主要方法- 主要功能- JSONPath的优势- 使用示例 Spring不选择OGNL的原因 OGNL 介绍 OGNL(Objec…...

[HCTF 2018]WarmUp-滑稽
启动场景打开链接,出现一下图片 F12查看代码出现一个注释,应该在这个文件中, 进入到该页面,出现一段代码 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["sourc…...

JAVAWeb——maven、SpringBoot、HTTP、Tomcat
目录 1.maven a.概述 b.作用 c.仓库 b.坐标 c.依赖管理 2.SpringBoot 3.HTTP a.概述 b.请求协议 c.响应协议 d.协议解析 4.Tomcat a.Web服务器 b.Tomcat c.SpringBoot与Tomcat关系 1.maven a.概述 Maven是apache旗下的一个开源项目,是一款用于管理…...

【C++】—— set 与 multiset
【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…...

蓝桥杯-扫雷
这题不难,就是麻烦一点,这里暴力求解了直接 题目链接: 扫雷 AC代码: import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan ne…...

黑马JavaWeb-day06、07、08(SQL部分) _
文章目录 MYSQL概述数据模型SQL简介SQL分类 DDL数据库操作表操作 DML增(INSERT)改(UPDATE)删(DELETE) DQL基本查询条件查询(where)分组查询(group by)排序查询…...

三十五:Wireshark的捕获过滤器
Wireshark 是一个广泛使用的网络协议分析工具,主要用于捕获和分析网络流量。它支持丰富的协议分析,并提供了多种过滤方式,以便用户在大量数据中精确地找到自己关注的内容。在Wireshark中,过滤器可以分为两类:捕获过滤器…...

第9章 大模型的有害性(上)
9.1 引言 本章将探讨大型语言模型(LLMs)可能带来的有害性,重点讨论以下几个方面: 性能差异社会偏见和刻板印象 在后续内容中,还会涉及其他层面的危害,如有害信息、虚假信息、隐私和安全风险、版权问题、…...

遗传算法与深度学习实战(26)——编码卷积神经网络架构
遗传算法与深度学习实战(26)——编码卷积神经网络架构 0. 前言1. EvoCNN 原理1.1 工作原理1.2 基因编码 2. 编码卷积神经网络架构小结系列链接 0. 前言 我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN),在本节中&a…...

Linux无线网络配置工具:iwconfig vs iw
在Linux系统中,无线网络配置和管理是网络管理员和开发者的常见任务。本文将详细介绍两个常用的无线网络配置命令行工具:iwconfig 和 iw,并对比它们之间的区别,帮助您更好地选择合适的工具进行无线网络配置。 一、iwconfig 简介 …...

RabbitMQ介绍及安装
文章目录 一. MQ二. RabbitMQ三. RabbitMQ作用四. MQ产品对比五. 安装RabbitMQ1. 安装erlang2. 安装rabbitMQ3. 安装RabbitMQ管理界⾯4. 启动服务5. 访问界面6. 添加管理员用户7. 重新登录 一. MQ MQ( Message queue ), 从字⾯意思上看, 本质是个队列, FIFO 先⼊先出ÿ…...

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略
年底了,大量的商家都在开始筹备搞活动,接下来的双十二、元旦、春节、开门红、寒假,各种活动,目的就是为了拉动新客户。 距离过年还有56 天,如何破局? 1、销售渠道 针对旅游卡项目,主要销售渠道…...

Docker Compose 和 Kubernetes 之间的区别?
一、简介🎀 1.1 Docker Compose Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,可以管理多个 Docker 容器组成一个应用。你只需定义一个 YAML 格式的配置文件 docker-compose.yml ,即可创建并…...

node.js常用的模块和中间件?
Node.js常用的模块和中间件包括以下几种: Express:Express是一个灵活的Node.js web应用框架,提供了丰富的API来处理HTTP请求和响应。它支持中间件系统,可以轻松地添加各种功能,如路由、模板引擎、静态文件服务…...

Llama模型分布式训练(微调)
1 常见大模型 1.1 参数量对照表 模型参数量发布时间训练的显存需求VGG-19143.68M2014~5 GB(单 224x224 图像,batch_size32)ResNet-15260.19M2015~7 GB(单 224x224 图像,batch_size32)GPT-2 117M117M2019~…...

Matlab模块From Workspace使用数据类型说明
Matlab原文连接:Load Data Using the From Workspace Block 模型: 从信号来源的数据: timeseries 数据: sampleTime 0.01; numSteps 1001;time sampleTime*[0:(numSteps-1)]; time time;data sin(2*pi/3*time);simin time…...

LangChain学习笔记(一)-LangChain简介
LangChain学习笔记(一)-LangChain简介 langChain是一个人工智能大语言模型的开发框架,主要构成为下图。 一、核心模块 (一)模型I/O模块 负责与现有大模型进行交互,由三部分组成: 提…...

k8s,声明式API对象理解
命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…...

KubeBlocks v0.9.2发布啦!支持容器镜像滚动更新、MySQL支持Jemalloc...快来升级体验更多新功能!
KubeBlocks v0.9.2 正式发布啦!本次发布包含了一些新功能、关键的错误修复以及各种改进。以下是详细的更新内容。 升级文档 v0.9.2 升级方式与 v0.9.1 相同,替换版本即可哦~ https://kubeblocks.io/docs/release-0.9/user_docs/upgrade/up…...

Linux-虚拟环境
文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术,我们可以在系统中&#…...

window系统下的git怎么在黑窗口配置代理
在Windows系统下,通过黑窗口(命令行界面)配置Git代理主要有两种方式:配置HTTP代理和配置SOCKS5代理。以下是具体的步骤: 配置HTTP代理 临时代理设置(仅对当前命令行会话有效): set …...

网络和通信详解
一、Java 网络编程基础 IP 地址和端口号 IP 地址: IP 地址是互联网协议地址,用于标识网络中的设备。在 Java 中,InetAddress类是用于表示 IP 地址的主要类。例如,InetAddress.getByName("www.example.com")可以获取指定…...

网络安全框架及模型-PPDR模型
网络安全框架及模型-PPDR模型 概述: 为了有效应对不断变化的网络安全环境,人们意识到需要一种综合性的方法来管理和保护网络安全。因此,PPDR模型应运而生。它将策略、防护、检测和响应四个要素结合起来,提供了一个全面的框架来处理网络安全问题。 工作原理: PPDR模型的…...

WPF+LibVLC开发播放器-LibVLC播放控制
接上一篇: LibVLC在C#中的使用 实现LibVLC播放器播放控制 界面 界面上添加一个Button按钮用于控制播放 <ButtonGrid.Row"1"Width"88"Height"24"Margin"10,0,0,0"HorizontalAlignment"Left"VerticalAlignme…...

子模块、Fork、NPM 包与脚手架概述
子模块 在 Git 仓库中嵌套另一个仓库,通过引用的方式引入到主项目,版本管理依赖 Git 提交记录或分支,更新需手动拉取并提交,适用于共享代码并保持项目独立性。 优点:子模块支持直接查看和修改,保持子模块…...

基于Java Springboot蛋糕订购小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...

【el-table】表格后端排序
在需要排序的列添加属性 sortable,后端排序,需将sortable设置为custom 如果需要自定义轮转添加 sort-orders 属性,数组中的元素需为以下三者之一:ascending 表示升序,descending 表示降序,null 表示还原为原…...

APP聊天项目介绍
项目结构说明 res/layout目录:存放布局相关的 XML 文件,用于定义界面的外观,包含activity_main.xml(主界面布局)和message_item.xml(聊天消息项布局)。 res/drawable目录:存放一些…...

android user版本默认usb模式为充电模式
android插入usb时会切换至默认设置的模式,debug版本为adb,user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…...

常见问题QA的前端代码
这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面,页面分为左右两部分,左侧用于展示对话记录,…...