Action Context中值栈(value Stack )栈上下文(Stack context)的个人理解

本文详细解析了Struts2框架中的ActionContext与StackContext概念及其使用方式,包括ValueStack的作用及如何通过特定语法访问其中的数据。

Action Context就是Stack Context栈上下文;

Stack Context、ActionContext或者OGNL上下文都是一个东西:Ognl.getValue(exp,context,root)中的context。

Value Stack 值栈,Stack Context 栈上下文都可以使用#进行访问;

值栈用#访问的时候需要用#root.格式(简写可去掉#root),

栈上下文用必须用#访问:#context.格式访问(简写可去掉#context)

值栈(Value Stack)存放的是action(name映射类)的实例和调用ActionContext.getContext().getValueStack().getRoot().push(user);方法手动放到值栈的实例;如下图:



栈上下文存放的是所有的数据信息,例如:page、request、 session、application、attr、parameters等等;

值栈的信息其实也存放在栈上下文的,但是在栈上下文中调出值栈的信息语法不一样而已;

例如:在action类中:ActionContext.getContext().getValueStack().getRoot().push(user);将user示例放到值栈中;然后在jsp页面通过值栈和栈上下文分别调出username和password;如下图;



网上找了一个参考图:


### 的压入操作方法或实现 在C语言中,的压入操作通常通过数组或链表来实现。以下是两种常见的实现方式:基于数组的和基于链表的。 #### 1. 基于数组的压入操作 基于数组的实现需要定义一个固定大小的数组以及一个表示顶的指针变量。当执行压入操作时,首先检查是否已满,若未满则将新元素插入到顶位置,并更新顶指针。 以下是一个完整的基于数组的压入操作示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义的最大长度 int stack[MAX_SIZE]; // 的数组 int top = -1; // 顶指针,初始化为-1 // 判断是否已满 int is_full() { return top == MAX_SIZE - 1; } // 将元素压入中 void push(int value) { if (is_full()) { // 检查是否已满 printf("Error: Stack is full\n"); return; } top++; // 更新顶指针 stack[top] = value; // 插入新元素 } ``` 上述代码展示了如何通过数组实现的压入操作[^2]。 #### 2. 基于链表的压入操作 基于链表的实现不需要预先定义固定的大小,因此更适合动态场景。链式的每个节点包含数据部分和指向下一个节点的指针。压入操作时,创建一个新节点并将该节点链接到当前顶,同时更新顶指针。 以下是基于链表的压入操作示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; // 数据部分 struct Node* next; // 指向下一个节点的指针 } Node; typedef struct Stack { Node* head; // 顶指针 int size; // 的大小 } Stack; // 的创建函数 void StackCreate(Stack* stk) { stk->head = NULL; // 初始化顶指针为NULL stk->size = 0; // 初始化的大小为0 } // 将元素压入中 void push(Stack* stk, int value) { Node* new_node = (Node*)malloc(sizeof(Node)); // 创建新节点 if (new_node == NULL) { printf("Error: Memory allocation failed\n"); return; } new_node->data = value; // 设置新节点的数据部分 new_node->next = stk->head; // 将新节点链接到当前顶 stk->head = new_node; // 更新顶指针 stk->size++; // 更新的大小 } ``` 上述代码展示了如何通过链表实现的压入操作[^4]。 #### 注意事项 - 在基于数组的实现中,必须确保未满才能进行压入操作,否则会导致数组越界。 - 在基于链表的实现中,需要动态分配内存以创建新节点,如果内存分配失败,则无法完成压入操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值