Struts2——笔记03

本文深入解析了OGNL表达式及其在Struts2框架中的应用,特别是值栈机制的运作原理,包括其存储位置、结构及数据操作方式,为开发者提供了全面的理解。

OGNL概述

  1. OGNL同EL表达式类似,但又比JSTL功能强大且高效。
  2. 主要在struts2里操作值栈数据
  3. 一般把ognl表达式和struts2标签结合起来使用
  4. ognl不是struts2的一部分,只不过经常和struts2搭配起来使用
  5. jar包
    在这里插入图片描述

如何使用ognl表达式和struts2标签

  1. ognl的使用
    在这里插入图片描述
  2. 在jsp页面中引入struts2标签库
    在这里插入图片描述
  3. 简单示例
    在这里插入图片描述

什么是值栈

  1. 在struts2里提供的一种存储机制,类似于域对象,可进行存储与取数据
  2. 在Action中存放数据到值栈中,在jsp页面中进行取值操作
  3. 值栈的存储位置
    1)每次创建Action的时候,就会创建一个Action对象(Action每调用一次创建一次,而Servlet只创建一次)
    2)在每个Action对象里只存在一个值栈对象

值栈的结构

  1. 值栈分为两部分
    1)root(一般在root里操作数据)和context
    2)root的结构是list,继承自ArrayList
    3)context的结构是map,实现了Map接口
  2. context的结构图
    在这里插入图片描述
  3. 在struts.xml配置文件中添加如下内容(必须先访问Action,再访问jsp页面进行查看)
    在这里插入图片描述
  4. 在jsp页面中使用<s:debug></s:debug>标签
    在这里插入图片描述
  5. 页面访问该Action(点击Debug查看值栈的结构,下图是root的结构图)
    在这里插入图片描述

获取值栈对象

  1. 注意:每个Action中只存在一个值栈对象
package tqb.valuestack;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class Demo1 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		/*
		 * 获取值栈对象
		 * 每个Action中拥有一个值栈对象
		 */
		ActionContext context = ActionContext.getContext();
		
		/*
		 * 判断值栈对象是否只存在一个
		 */
		ValueStack stack1 = context.getValueStack();
		ValueStack stack2 = context.getValueStack();
		
		System.out.println(stack1 == stack2);//true
		return SUCCESS;
	}
}

向值栈放数据的三种方式

  1. 只用值栈对象的set方法
package tqb.valuestack;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

/**
 * 向值栈中放数据的三种方式
 * 第一种:set方法
 * @author tqb
 *
 */
public class Demo2 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		/*
		 * 1.获取值栈对象
		 */
		ActionContext context = ActionContext.getContext();
		ValueStack stack = context.getValueStack();
		
		/*
		 * 调用值栈对象的set方法(处于栈顶位置)
		 * 结构:java.util.HashMap
		 */
		stack.set("username", "lisi");
	}
}

在这里插入图片描述

  1. 只用值栈对象的push方法
package tqb.valuestack;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

/**
 * 向值栈中放数据的三种方式
 * 第二种:push方法
 * @author tqb
 *
 */
public class Demo2 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		/*
		 * 1.获取值栈对象
		 */
		ActionContext context = ActionContext.getContext();
		ValueStack stack = context.getValueStack();

		/*
		 * 调用值栈对象的push方法(处于栈顶位置)
		 * 结构:java.lang.String
		 */
		stack.push("push...");
		return SUCCESS;
	}
}

在这里插入图片描述

  1. 在Action中定义变量,生成变量的get方法
package tqb.valuestack;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 向值栈中存放数据的第三种方法
 * @author tqb
 *
 */
public class Demo3 extends ActionSupport {
	//定义变量
	private String name;
	//生成get方法
	public String getName() {
		return name;
	}
	
	@Override
	public String execute() throws Exception {
		//给变量进行赋值
		name="zhangsan";
		return SUCCESS;
	}

}

在这里插入图片描述

向值栈中添加对象

  1. 定义对象变量
  2. 生成对象变量的get方法
  3. 在方法中向变量赋值
package tqb.valuestack;

import com.opensymphony.xwork2.ActionSupport;

import tqb.entity.User;

/**
 * 向值栈中添加对象
 * @author tqb
 *
 */
public class Demo4 extends ActionSupport {
	// 定义实体对象
	private User user;
	// 生成get方法
	public User getUser() {
		return user;
	}
	
	@Override
	public String execute() throws Exception {
		// 给对象赋值
		user = new User();
		user.setUsername("wangwu");
		user.setPassword("123456");
		
		return SUCCESS;
	}
}

在这里插入图片描述

向值栈中添加List集合

  1. 定义list集合变量
  2. 生成list集合变量的get方法
  3. 方法内赋值
package tqb.valuestack;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import tqb.entity.User;

/**
 * 向值栈中添加list集合
 * @author tqb
 *
 */
public class Demo5 extends ActionSupport{
	// 定义list集合
	List<User> list = new ArrayList<User>();
	// 生成get方法
	public List<User> getList() {
		return list;
	}
	
	@Override
	public String execute() throws Exception {
		User user1 = new User();
		user1.setUsername("zhangsan");
		user1.setPassword("123456");
		
		User user2 = new User();
		user2.setUsername("lisi");
		user2.setPassword("654321");
		
		list.add(user1);
		list.add(user2);
		return SUCCESS;
	}

}

在这里插入图片描述

从值栈中获取数据(采用第三种存放数据的方式)

  1. 获取字符串
    在这里插入图片描述
    在这里插入图片描述
  2. 获取对象
    在这里插入图片描述
    在这里插入图片描述
  3. 获取list集合(三种方式)
    在这里插入图片描述
    在这里插入图片描述

获取set和push方法设置的值

在这里插入图片描述
在这里插入图片描述

EL表达式为什么可以获取值栈的数据

  1. 底层对getAttribute方法进行了增强
  2. 首先在request域获取值,若获取到,则直接返回数据
  3. 若取不到,则在值栈中查找数据并放到域对象中去
    在这里插入图片描述在这里插入图片描述

ognl中%、#的使用

  1. #的使用
    1)获取context里面的数据(获取list集合的第三种方式)
    2)通过request域放置的数据
    在这里插入图片描述
    在这里插入图片描述
  2. %的使用
    1)struts中的表单标签<s:textfield></s:textfield>
    2)在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别
    在这里插入图片描述
    3)实质生成的html代码
<input type="text" name="username" value="具体的值"/>
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值