当前位置: 首页 > news >正文

用织梦建设网站的步骤/写文章一篇30元兼职

用织梦建设网站的步骤,写文章一篇30元兼职,礼品定制,湖南建设厅官方网站文章目录 OGNL 介绍OGNL 使用场景- ognl- 主要功能- 注意事项- Ognl类的主要方法- 设置值- 获取值- 使用示例 - MybatisJava原生表达式的使用 - Fastjson- JSONPath类的主要方法- 主要功能- JSONPath的优势- 使用示例 Spring不选择OGNL的原因 OGNL 介绍 OGNL(Objec…

文章目录

  • 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>

- 主要功能

  1. 访问对象属性:

    使用点号(.)来访问对象的属性(也可设置对象的属性)。例如:person.name 表示访问 person 对象的 name 属性。

  2. 调用对象方法

    使用at符号(@)来调用对象的方法。例如:@java.lang.Math@random() 表示调用 Math 类的 random 方法。

  3. 访问集合和数组:

    使用方括号([])来访问集合或数组中的元素。例如:myList[0] 表示访问 myList 集合中的第一个元素。

  4. 赋值和表达式计算:

    支持变量赋值和基本的算术、逻辑运算符。例如:age > 18 && age < 60 表示对 age 变量进行逻辑判断。

  5. 条件表达式:

    支持条件运算符,如三元运算符 condition ? true : false。

  6. 对象引用:

    使用(#)符号来引用对象。例如:#person.name 表示引用 person 对象的 name 属性。

  7. 内置对象:

    OGNL中有一些内置对象,如 #context(上下文对象)、#root(根对象)、#this(当前对象)等,可以方便地用于表达式中的引用和操作。

- 注意事项

  • 当表达式expression中的属性不存在时,获取或设置值会报错

- Ognl类的主要方法

  • applyExpressionMaxLength:设置Ognl 表达式的最大允许长度限制
    • void applyExpressionMaxLength(Integer expressionMaxLength)
      • 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:类型转换器
  • 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:上下文对象
  • compileExpression:将字符串表达式编译为 Ognl 表达式对象
    • Node compileExpression(OgnlContext context, Object root, String expression)
      • context:上下文对象
      • expression:字符串表达式
  • parseExpression:将字符串表达式解析为 Ognl 表达式对象
    • Object parseExpression(String expression)
      • expression:字符串表达式
  • getLastEvaluation:从上下文中获取最后一个评估(Evaluation)对象
    • Evaluation getLastEvaluation(Map context)
      • context:上下文对象
  • setRoot:设置 Ognl 表达式的根对象
    • void setRoot(Map context, Object root)
      • context:上下文对象
      • root:根对象
  • getRoot:获取 Ognl 表达式的根对象
    • Object getRoot(Map context)
      • 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:上下文对象
  • 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:上下文对象
  • 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:上下文对象
  • 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:结果类型

- 设置值

  1. 使用字符串表达式方式设置值

    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}
    
  2. 使用 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}
    
  3. 使用 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}
    

- 获取值

  1. 使用字符串表达式方式获取值

        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}
    
  2. 使用字符串表达式及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}
    
  3. 使用 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}
    
  4. 使用 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}
    
  5. 使用自定义的表达式访问器和上下文对象方式获取值

        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类的主要方法

  1. Object eval(String json, String path)
    通过给定的 JSON 数据和 JSONPath 表达式,返回匹配该表达式的结果对象

  2. JSONArray extract(Object json, String path)
    根据指定的 JSONPath 表达式,从 JSON 对象中提取匹配的 JSON 数组。返回一个 JSONArray 对象

  3. boolean contains(Object json, String path)
    判断 JSON 数据中是否包含匹配指定 JSONPath 表达式的内容

  4. boolean containsValue(Object json, String path, Object value)
    判断 JSON 对象中匹配 JSONPath 表达式的内容是否包含指定的值

  5. int size(Object json, String path)
    计算 JSONPath 表达式匹配的内容的大小,并返回匹配结果的个数

  6. Set<?> keySet(Object json, String path)
    返回 JSONPath 表达式匹配的所有键值的 Set 集合

  7. void arrayAdd(Object rootObject, String path, Object… values)
    在 JSON 对象中的指定位置添加一个或多个元素

  8. void remove(Object json, String path)
    根据指定的 JSONPath 表达式,从 JSON 对象中移除匹配路径的内容

  9. void set(Object json, String path, Object value)
    根据指定的 JSONPath 表达式,在 JSON 对象中设置匹配路径的值为指定的 value

  10. JSONPath compile(String path)
    编译 JSONPath 表达式,返回一个对应的 JSONPath 对象

    这个方法可以提高后续对同一个 JSONPath 表达式的操作性能。

  11. Object read(String json, String path)
    读取 JSON 数据中指定 JSONPath 表达式的值

  12. List paths(Object json, String path)
    获取 JSON 对象中匹配指定 JSONPath 表达式的所有路径,并返回一个 JSONPath 列表

  13. void setArrayItem(Object json, String path, Object value)
    根据指定的 JSONPath 表达式,在 JSON 数组中设置匹配路径的元素为指定的 value

  14. void removeArrayItem(Object json, String path, int index)
    根据指定的 JSONPath 表达式,从 JSON 数组中移除指定索引位置的元素

- 主要功能

  1. 设置JSON对象中的属性值

  2. 获取JSON对象中的属性值

- JSONPath的优势

  1. 设置JSON对象中的属性值时,如果属性不存在,也会自动创建
  2. 获取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&#xff08;Objec…...

[HCTF 2018]WarmUp-滑稽

启动场景打开链接&#xff0c;出现一下图片 F12查看代码出现一个注释&#xff0c;应该在这个文件中&#xff0c; 进入到该页面&#xff0c;出现一段代码 <?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旗下的一个开源项目&#xff0c;是一款用于管理…...

【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…...

蓝桥杯-扫雷

这题不难&#xff0c;就是麻烦一点&#xff0c;这里暴力求解了直接 题目链接&#xff1a; 扫雷 AC代码&#xff1a; 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增&#xff08;INSERT&#xff09;改&#xff08;UPDATE&#xff09;删&#xff08;DELETE&#xff09; DQL基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询…...

三十五:Wireshark的捕获过滤器

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

第9章 大模型的有害性(上)

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

遗传算法与深度学习实战(26)——编码卷积神经网络架构

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

Linux无线网络配置工具:iwconfig vs iw

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

RabbitMQ介绍及安装

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

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…...

Docker Compose 和 Kubernetes 之间的区别?

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

node.js常用的模块和中间件?

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

Llama模型分布式训练(微调)

1 常见大模型 1.1 参数量对照表 模型参数量发布时间训练的显存需求VGG-19143.68M2014~5 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;ResNet-15260.19M2015~7 GB&#xff08;单 224x224 图像&#xff0c;batch_size32&#xff09;GPT-2 117M117M2019~…...

Matlab模块From Workspace使用数据类型说明

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

LangChain学习笔记(一)-LangChain简介

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

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…...

KubeBlocks v0.9.2发布啦!支持容器镜像滚动更新、MySQL支持Jemalloc...快来升级体验更多新功能!

KubeBlocks v0.9.2 正式发布啦&#xff01;本次发布包含了一些新功能、关键的错误修复以及各种改进。以下是详细的更新内容。 升级文档 v0.9.2 升级方式与 v0.9.1 相同&#xff0c;替换版本即可哦&#xff5e; https://kubeblocks.io/docs/release-0.9/user_docs/upgrade/up…...

Linux-虚拟环境

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

window系统下的git怎么在黑窗口配置代理

在Windows系统下&#xff0c;通过黑窗口&#xff08;命令行界面&#xff09;配置Git代理主要有两种方式&#xff1a;配置HTTP代理和配置SOCKS5代理。以下是具体的步骤&#xff1a; 配置HTTP代理 临时代理设置&#xff08;仅对当前命令行会话有效&#xff09;&#xff1a; set …...

网络和通信详解

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

网络安全框架及模型-PPDR模型

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

WPF+LibVLC开发播放器-LibVLC播放控制

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

子模块、Fork、NPM 包与脚手架概述

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

基于Java Springboot蛋糕订购小程序

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

【el-table】表格后端排序

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

APP聊天项目介绍

项目结构说明 res/layout目录&#xff1a;存放布局相关的 XML 文件&#xff0c;用于定义界面的外观&#xff0c;包含activity_main.xml&#xff08;主界面布局&#xff09;和message_item.xml&#xff08;聊天消息项布局&#xff09;。 res/drawable目录&#xff1a;存放一些…...

android user版本默认usb模式为充电模式

android插入usb时会切换至默认设置的模式&#xff0c;debug版本为adb&#xff0c;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 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…...