关于struts值栈的总结,前端页面如何使用标签取得值栈中的数据
用户提交一次请求的执行过程

总结:
struts值栈中 两个内容 一个是栈 一个是map 值栈(数据中心)的范围是一个请求 它代替了request作用域 struts自定义标签有一个特点 比如遍历集合的时候 把每次循环得到的
对象 自动放在栈顶 此次循环结束之后 把它从栈顶拿掉(弹出)
下次循环到第二个对象 再把它放在栈顶 %{ognl}表达式 从栈顶找对应属性 找不到 去map中找对应的key的值
jsp页面中${}是el表达式
ognl表达式 在struts.xml中的格式为 ${} 在jsp页面的格式为%{}
ognl表达式 只能写在struts的自定义标签中
一般都不写%{} 直接name="属性值" name="%{属性值}" 页面直接使用的对象一般都放在栈顶 而对于集合数据 都放在map中
(单个对象一般是放在栈顶的 因为如果是一个集合 那么放在map中 在遍历的时候也是取出一个对象 放在栈顶 然后得到其中的每个值) #value 直接从map中查找key对应的值
%{user} 先找值栈 找不到 继续找map
%{#user} 直接找map el :page->request->session->application
el表达式操作的数据都是4个作用域中的内容 是不正确的
el表达式在jsp页面 找request中的内容的时候
先找作用域 再找值栈 再找map
例如 ${name} 先从作用域中进行查找 如果没有找到 然后就先找值栈,然后找map中的key对应的值
所以 正确的顺序
page->request-> valueStack.findValue()->session->application 关于数据回显的问题
<S:from action="">
<s:textfield name="name"></s:textfield>
<s:textfield name="name" value="%{name}"></s:textfield>
</s:from>
上面两句效果是一样的 默认都有value="%{name}"的行为 写不写 都会从栈中找对应的属性值 所以这就实现了数据的回显 每次把之前的数据提前放入栈中 然后在页面 就能回显
下面举几个例子
下拉列表的显示以及回显数据


单击修改用户的时候 数据需要进行下拉列表显示 以及下拉列表回显操作
/** 修改页面 */
public String editUI() throws Exception { // 准备数据 部门
List<Department> topDepartmentList = this.departmentService
.findTopList();
List<Department> departmentList = DepartmentUtils
.findTopDepartment(topDepartmentList);
// ServletActionContext.getRequest().setAttribute("departmentList",departmentList);
// 使用struts标签 把集合放入map集合中
ActionContext.getContext().put("departmentList", departmentList); // 准备数据 岗位
List<Role> roleList = this.roleService.findAll();
// ServletActionContext.getRequest().setAttribute("roleList",roleList);
// 因为页面需要使用struts标签 所以这里把查到的数据放在map集合中 在页面显示所有的岗位信息
ActionContext.getContext().put("roleList", roleList); // 回显基本数据
User user = this.userService.getById(model.getId());
//ServletActionContext.getRequest().setAttribute("user", user);
//把user对象放入栈顶 可以对user中的对象属性也进行回显 比如department这个属性 它是一个对象
ActionContext.getContext().getValueStack().push(user); // 用于回显用户已经选择的岗位
if (user.getRoles() != null) {
roleIds = new Long[user.getRoles().size()];
int index = 0;
for (Role role : user.getRoles()) {
roleIds[index++] = role.getId();
}
}
/*
* ServletActionContext.getContext().put("roleList", roleList); if
* (user.getRoles() != null) { roleids = new
* Long[user.getRoles().size()]; int index = 0; for (Role role :
* user.getRoles()) { roleids[index++] = role.getId(); } }
*/
return "saveUI";
}
首先是部门列表的显示 以及回显

在action中把查询到的部门列表放进了map中 所以这里使用#departmentList直接从map中取出key='departmentList" 所对应的集合 而且在遍历的时候 会把每次得到的对象都放在栈顶 操作完成之后 弹出栈 第二个对象也是如此 依次遍历.....
因为取出的对象是dempartment类型 listKey="id" listValue="name" 对应的是department这个对象中的id字段和name字段 而headerKey="" headerValue="===请选择部门====" 应该可以猜到 如果第一次没有选择任何部门 那么就不进行回显 所以显示的就是headervalue
中的内容 而如果在提价的时候也没有选择任何的部门 那么就提交id为空字符串 在这里我想说的是 name="department.id"属性 因为action中使用的是modelDriver 在user对象的属性中有department这个对象属性 所以这里如果想要完成自动封装 还是必须得写成该形式 否则就在action中创建一个departmentID字段 设置gett和set方法 然后这里可以写departmentID也能够实现 另外这里还有一个重点就是 我们发现数据竟然可以回显 是为什么呢 主要是在action中 我们把当前修改的对象查询了出来 放在了栈顶
ActionContext.getContext().getValueStack().push(user);即该语句 如果没有该语句 部门列表这个地方是不能进行数据的回显的 这就是框架的强大之处 使用框架提供的标签 无需关心它是怎么回显的
否则 如果使用jstl中的c:foreach标签还得需要进行判断才能实现数据的回显 如下代码:
<select name="department.id" cssClass="SelectStyle">
<option value="">请选择:</option>
<c:forEach items="${departmentList}" var="department">
<option value="${department.id }"
<c:if test="${user.department.id==department.id}" >selected</c:if>>
${department.name}
</option>
</c:forEach>
</select>
举例2:下拉列表 多选操作 以及回显功能
<s:select name="roleIds" cssClass="SelectStyle"
multiple="true" size="10"
list="#roleList" listKey="id" listValue="name"
/>
按住Ctrl键可以多选或取消选择
代码很简单 主要是action中准备的数据 roleIds在action中是另外创建出来的一个数组 就是保存用户选择的多个岗位值
举例3:用户列表的显示

<s:iterator value="#userList">
<tr class="TableDetail1 template">
<td>${loginName} </td>
<td>${name} </td>
<td>${department.name} </td>
<td>
<s:iterator value="roles">
${name}
</s:iterator>
</td>
<td>${description} </td>
<td>
<s:a action="user_delete?id=%{id}" onclick="return delConfirm()">删除</s:a>
<s:a action="user_editUI?id=%{id}">修改</s:a>
<s:a action="user_initPassword?id=%{id}" onclick="return window.confirm('您确定要初始化密码为1234吗?')">初始化密码</s:a>
</td>
</tr>
</s:iterator>
举例4:单选按钮的回显


两个代码效果一样 都能实现回显 但是都有一个前提 那就是需要把将要修改的user对象 查询出来 放在栈顶即可
关于struts值栈的总结,前端页面如何使用标签取得值栈中的数据的更多相关文章
- 前端页面传来数组,后台用对象集合list接收数据的写法
//保存页面显示应用$("#save").click(function(){ var data = [{"applicationtypeid":"65 ...
- 一个关于前端页面的小标签<tbody>
我们有时候希望将表格的内容分为多个模块,这时候就可以使用<tbody>标签,它是<table>的字标签,是<tr>的父标签,可以使用它达到一种设置样式的结果.
- jsp页面用struts2标签展示List<Object>类型的数据
今天遇到一个问题,一个List<Object>类型的数据,是直接从sql查出来的数据,要在前端展示,原来的方法不知道为什么不能展示,后来找了好久,找到了一个靠谱的方法,记录一下 <s ...
- 解决dispatch 后在当前页面不能获取最新的this.props中的数据
因为dispatch为异步方法 .解决这个问题方法很多 出去添加定时器这种不是很优雅的方法 我们可以用 componentWillReceiveProps(nextProps) 这个生命周期 ...
- Spring Mvc中Jsp也页面怎么会获取不到Controller中的数据
----------Controller ------- package com.test.mvc; import org.springframework.stereotype.Controller; ...
- 通过js获得html标签的值
js获取html元素的值并赋值 1).input文本框 <input type="text" value="时间" placeholder="姓 ...
- 在小程序中修改上一个页面里data中的数据调用上一个页面的方法
//获取已经打开的页面的数组 var pages = getCurrentPages(); //获取上一个页面的所有的方法和data中的数据 var lastpage = pages[pages.l ...
- 将fileupload标签的值清空
在开发中遇到了这样一个问题,在一个form表单中,有一个fileupload标签,新增,修改都是同一个form,当我第一次选择了上传文件路径,并且提交之后,第二次再使用这个form,这次没有选择上传文 ...
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
随机推荐
- BAT常问问题总结以及回答(数据库篇)
数据库 事务四大特性(ACID)原子性.一致性.隔离性.持久性 事务:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.begin transaction 原 ...
- 初探swift语言的学习笔记三(闭包-匿名函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- ES shrink ——一般是结合rollover一起使用的,一开始没有看懂官方shrink文档,当看了这个之后就明白了
rollover Elasticsearch 从 5.0 开始,为日志场景的用户提供了一个很不错的接口,叫 rollover.其作用是:当某个别名指向的实际索引过大的时候,自动将别名指向下一个实际索引 ...
- MySQL实现表之间的字段更新
新功能写好之后,需要把以前表数据更新一下,字段数据从以前的表中获取,只更新两个字段 UPDATE TABLE1,TABLE2 SET TABLE1.COLUMN1 = TABLE2.COLUMN1 , ...
- codeforces 708ALetter Cyclic Shift
2019-05-18 09:51:19 加油,加油,fightting !!! https://www.cnblogs.com/ECJTUACM-873284962/p/6375011.html 全为 ...
- Ajax请求成功但是一直进入error的原因
1.在1.3版本的jQuery以后,严格要求了json格式,如果返回的值不是json格式,他就会执行error函数. 所以如果想让他走success函数的话,还是在后台把数据格式化成json格式吧. ...
- 移动web开发中自己遇到的三个小题及解决方法
大家好! 这是我第二次写随笔感想,有不足之处希望大家提出,我也算的上一个小白,自己进入前端行业也刚刚半年,在这里半年里我遇到一个技术大牛的好领导,让我在项目中学到很多,想和大家分享一下! 一. 移动端 ...
- 3) 十分钟学会android--建立第一个APP,建立简单的用户界面
在本小节里,我们将学习如何用 XML 创建一个带有文本输入框和按钮的界面.下一节课将学会使 APP 对按钮做出响应——按钮被按下时,文本框里的内容被发送到另外一个 Activity. Android ...
- 使用eclipse,对spring boot 进行springloader或者devtool热部署失败处理方法
确定配置进行依赖和配置没有错误后. 调整spring boot 的版本,因为新版本对老版本的spring boot 不能使用. 改为: <groupId>org.springframewo ...
- 检查点和SCN
有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一旦粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(buffer ca ...
