struts2 OGNL表达式

OGNL表达式详解
本文详细介绍了Struts2中的OGNL表达式语言,包括其基本概念、如何在Struts2中使用OGNL表达式访问对象属性及调用方法,以及OGNL中的特殊符号如#、%和$的用法,并通过示例展示了OGNL的强大功能。

一、OGNL

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

1.OGNL表达式的计算是围绕OGNL上下文进行的。
OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4.值栈(ValueStack) :

可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。
 
二、OGNL中的#、%和$符号

1、#的三种用途:
(1)访问非根对象属性,例如#session.username,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当ActionContext. getContext();#session.username表达式相当于ActionContext.getContext().getSession(). getAttribute("username") 。
(2)用于过滤和投影(projecting)集合,例:persons.{?#this.age>20}
(3)用来构造Map,例:#{'foo1':'bar1', 'foo2':'bar2'}。
2、%:
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。
例:

<h3>构造Map</h3>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>

    <p>不使用%:<s:url value="#foobar['foo1']" /></p>

   <p>使用%:<s:url value="%{#foobar['foo1']}" /></p>

运行界面如下所示。

he value of key "foo1" is bar1

不使用%:#foobar['foo1']

使用%:bar1

3、$:

(1)在国际化资源文件中,引用OGNL表达式

(2)在Struts 2框架的配置文件中引用OGNL表达式

 

三、示例

 首先创建一个User类、Student类和Teacher类(cn.orlion.model包下):

User类:

复制代码
package cn.orlion.model;

public class User {
    
    private String username;
    
    private String password;
    
    private int age;
    
    public User(int age){
        
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        
        this.age = age;
    }

    public String toString(){
        return this.username + ":" + this.age;
    }
}
复制代码

 

Teacher类:

复制代码
package cn.orlion.model;

public class Teacher {

    private String name;
    
    private String sex;
    
    public Teacher(){
        
    }
    
    public Teacher(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
复制代码

 

Student类:

复制代码
package cn.orlion.model;

public class Student {
    
    // 学生的老师
    private Teacher teacher;
    
    private String name;
    
    private String age;
    
    public static String tel = "15000000000";
    // 必须提供给struts2一个无参的构造函数
    public Student(){
        
    }
    
    public Student(String name){
        this.name = name;
    }
    
    public String read(){
        return "这是student的read()方法";
    }
    
    public static String eat(){
        return "这是student的静态方法eat()";
    }
    
    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
复制代码

 

 

 然后struts.xml配置下:

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" ></constant>
    <package name="ognl" namespace="/" extends="struts-default">
         <action name="ognl" class="cn.orlion.actions.OgnlAction">
             <result>
                 /ognl.jsp
             </result>
         </action>
     </package>
</struts>
复制代码

创建Action:

复制代码
package cn.orlion.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.opensymphony.xwork2.ActionSupport;

import cn.orlion.model.Student;
import cn.orlion.model.Teacher;
import cn.orlion.model.User;

public class OgnlAction extends ActionSupport{
    
    private Student student;

    private String username;
    
    private String password;
    
    private Map<String , Teacher> teachers = new HashMap<String , Teacher>();
    
    private Set<Student> students = new HashSet<Student>();

    private List<User> users = new ArrayList<User>();
    
    public String execute() throws Exception{
        
        users.add(new User(1));
        users.add(new User(2));
        users.add(new User(3));
        
        students.add(new Student("stu1"));
        students.add(new Student("stu2"));
        students.add(new Student("stu3"));
        
        teachers.put("teh1", new Teacher("teh1"));
        teachers.put("teh2", new Teacher("teh2"));
        teachers.put("teh3", new Teacher("teh3"));
        
        return SUCCESS;
    }
    
    public String test(){
        
        return "test";
    }
    
    public Map<String, Teacher> getTeachers() {
        return teachers;
    }

    public void setTeachers(Map<String, Teacher> teachers) {
        this.teachers = teachers;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public Student getStudent() {
        
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
复制代码

 

然后ognl.jsp:

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ognl Demo</title>
</head>
<body>
    访问值栈中的action的普通属性:username=<s:property value="username" /><br/>
    <%--访问的是action中的username属性,该属性存在于值栈中 --%>
    访问值栈中属性的普通方法,username长度:<s:property value="username.length()" /><br/>
    <%--打印username字符串长度 --%>
    访问值栈中action的普通方法<s:property value="test()" />
    <%--调用action中的test()方法的返回值 --%>
    <hr/>
    访问值栈中对象的普通属性(get set方法):student的name=<s:property value="student.name" /><br/>
    <%--Student必须提供给struts2一个无参的构造函数 --%>
    <%--打印action中的student的属性的name属性 --%>
    访问值栈中对象的普通属性(get set方法):student的teacher的name=<s:property value="student.teacher.name" /><br/>
    <%--打印action中的student的teacher属性的name属性 --%>
    访问值栈中对象的普通方法<s:property value="student.read()" /><br/>
    <%--调用action中的student的read()方法 --%>
    <hr/>
    <p>访问静态属性需要在struts.xml中配置:constant name="struts.ognl.allowStaticMethodAccess" value="true" </p>
    访问静态属性<s:property value="@cn.orlion.model.Student@tel" /><br/>
    <%--调用cn.orlion.model.Student的静态属性tel,格式为 @类@静态属性 --%>
    访问静态方法<s:property value="@cn.orlion.model.Student@eat()" /><br/>
    <%--调用cn.orlion.model.Student的静态方法eat() --%>
    访问Math类的静态方法<s:property value="@@max(2 , 3)" /><br/>
    <%--两个@只能访问Math类 --%>
    <hr/>
    访问普通类的构造方法<s:property value="new cn.orlion.model.User(1)" /><br/>
    <%--有问题!!!理论由于重写了toString所以会输出null:1--%>
    <hr/>
    访问list<s:property value="users" /><br/>
    <%--由于重写了toString所以会输出[null:1, null:2, null:3]--%>
    访问list中的某个元素<s:property value="users[1]" /><br/>
    <%--输出null:2--%>
    访问list中元素某个属性的集合<s:property value="users.{age}" /><br/>
    <%--输出[1, 2, 3]--%>
    访问list中元素某个属性的集合中的特定值<s:property value="users.{age}[1]" /><br/>
    <%--输出2--%>
    访问set<s:property value="students" /><br/>
    <%--输出[cn.orlion.model.Student@3aed15c, cn.orlion.model.Student@5d1db1a9, cn.orlion.model.Student@70b2721a]--%>
    访问set中某个元素<s:property value="students[1]" /><br/>
    <%--set无序,取指定下标的值无意义,所以取不到--%>
    访问map<s:property value="teachers" /><br/>
    <%--输出{teh3=cn.orlion.model.Teacher@13d293da, teh1=cn.orlion.model.Teacher@1f1af6a1, teh2=cn.orlion.model.Teacher@683743d6}--%>
    访问map中某个元素<s:property value="teachers.teh1" /><br/>
    <%--输出cn.orlion.model.Teacher@1f1af6a1--%>
    访问map中所有key<s:property value="teachers.keys" /><br/>
    <%--输出[teh3, teh1, teh2]--%>
    访问map中所有value<s:property value="teachers.values" /><br/>
    <%--输出[cn.orlion.model.Teacher@13d293da, cn.orlion.model.Teacher@1f1af6a1, cn.orlion.model.Teacher@683743d6]--%>
    访问map的大小<s:property value="teachers.size()" /><br/>
    <%--输出3--%>
    访问list<s:property value="users" /><br/>
    <hr/>
    投影(过滤)<s:property value="users.{?#this.age==1}.{age}" /><br/>
    <%--取出age=1的User对象的age属性(因为结果不止一个所以是一个集合,所以有中括号) --%>
    投影<s:property value="users.{^#this.age>1}.{age}"/><br/>
    <%--取出age>1的User对象集合的第一个User对象的age属性 --%>
    投影<s:property value="users.{$#this.age>1}.{age}"/><br/>
    <%--取出age>1的User对象集合的最后一个User对象的age属性 --%>
    投影<s:property value="users.{$#this.age>1}.{age} == null"/><br/>
    <%--取出age>1的User对象集合的最后一个User对象的age属性是否是null --%>
    <hr/>
    []:<s:property value="[1]" />
    <%--访问value stack从第一个至最后一个值,当forward时valuestack会有两个action --%>
    <%--这里会输出[com.opensymphony.xwork2.DefaultTextProvider@67363fd5] --%>
    <s:debug></s:debug>
</body>
</html>
复制代码

 

当访问:http://localhost:8080/Struts2Demo/ognl.action?username=rrr&student.name=xuesheng&student.teacher.name=laoshi

结果:

访问值栈中的action的普通属性:username=rrr
访问值栈中属性的普通方法,username长度:3
访问值栈中action的普通方法test


访问值栈中对象的普通属性(get set方法):student的name=xuesheng
访问值栈中对象的普通属性(get set方法):student的teacher的name=laoshi
访问值栈中对象的普通方法这是student的read()方法


访问静态属性需要在struts.xml中配置:constant name="struts.ognl.allowStaticMethodAccess" value="true"

访问静态属性15000000000
访问静态方法这是student的静态方法eat()
访问Math类的静态方法3


访问普通类的构造方法


访问list[null:1, null:2, null:3]
访问list中的某个元素null:2
访问list中元素某个属性的集合[1, 2, 3]
访问list中元素某个属性的集合中的特定值2
访问set[cn.orlion.model.Student@2712a2e5, cn.orlion.model.Student@6034072c, cn.orlion.model.Student@187b5d94]
访问set中某个元素
访问map{teh3=cn.orlion.model.Teacher@47d7d2f7, teh1=cn.orlion.model.Teacher@5c5e17b0, teh2=cn.orlion.model.Teacher@7ce25307}
访问map中某个元素cn.orlion.model.Teacher@5c5e17b0
访问map中所有key[teh3, teh1, teh2]
访问map中所有value[cn.orlion.model.Teacher@47d7d2f7, cn.orlion.model.Teacher@5c5e17b0, cn.orlion.model.Teacher@7ce25307]
访问map的大小3
访问list[null:1, null:2, null:3]


投影(过滤)[1]
投影[2]
投影[3]
投影false


[]:[com.opensymphony.xwork2.DefaultTextProvider@a715088]

Struts ValueStack Debug

 

Value Stack Contents

ObjectProperty NameProperty Value
cn.orlion.actions.OgnlActioncontainerThere is no read method for container
actionErrors[]
fieldErrors{}
studentcn.orlion.model.Student@30a58f34
students[cn.orlion.model.Student@2712a2e5, cn.orlion.model.Student@6034072c, cn.orlion.model.Student@187b5d94]
localezh_CN
users[null:1, null:2, null:3]
errorMessages[]
actionMessages[]
passwordnull
textsnull
teachers{teh3=cn.orlion.model.Teacher@47d7d2f7, teh1=cn.orlion.model.Teacher@5c5e17b0, teh2=cn.orlion.model.Teacher@7ce25307}
errors{}
usernamerrr
com.opensymphony.xwork2.DefaultTextProvidertextsnull

 

转载于:https://www.cnblogs.com/nucdy/p/5774330.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失、识别异常点、标准化数、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1以及AUC-ROC曲线。在处理不平衡数据,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值