一、 核心部分
1. 【核心试题】完成当天课堂练习
2. 【多选题】 阅读如下代码中,下列哪种方式可以在页面正确迭代获取集合中的数据 (ABC)
public String add(){
ValueStack vs = ActionContext.getContext().getValueStack();
// 压入List集合
List<User> ulist = new ArrayList<User>();
ulist.add(new User("小明",20));
ulist.add(new User("小红",30));
ulist.add(new User("小张",40));
vs.set("ulist", ulist);
return SUCCESS;
}
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}......
}
A、 <c:forEach items="${ ulist }" var="user"> ${ user.name } -- ${ user.age } </c:forEach>
B、 <s:iterator value="ulist"> <s:property value="name"/> <s:property value="age"/> </s:iterator>
C、 <s:iterator value="ulist" var="u"> <s:property value="#u.name"/> <s:property value="#u.age"/> </s:iterator>
D、 <s:iterator value="ulist"> <s:property value="#ulist.name"/> <s:property value="#ulist.age"/> </s:iterator>
3. 【多选题】 ValueStack结构是由哪两部分组成的 (AD)
A、 CompoundRoot
B、 Arraylist
C、 Map
D、 OgnlContext
4. 【多选题】 下列有关值栈组成部分的表述中错误的是 (CD)
A、 通常情况下,值栈由两部分组成root和context,默认情况下Struts会把 动作和相关对象压入 ObjectStack中,会把各种各样的映射关系压入 Context 中。
B、 在ValueStack中存在root属性、context 属性,其中root属性代指的就是ArrayList, context属性代指的就是Map
C、 OGNL表达式访问值栈中的数据必须使用#才能实现访问。
D、 当我们操作值栈内容时,默认操作的就是map中的元素。
5. 【多选题】 下列有关ValueStack 和 ActionContext对象的相关理解中正确的是 (ABCD)
A、 ActionContext是绑定到当前的线程上,那么在每个拦截器或者Action中获取到的ActionContext是同一个。
B、 值栈对象是当请求时才会被创建的。
C、 ActionContext中存在一个Map集合,该Map集合和ValueStack的context是同一个地址。
D、 ActionContext中可以获取到ValueStack的引用,我们可以使用ActionContext来获取到值栈对象。
6. 【多选题】 下列选项中有关OGNL(对象图导航语言)的表述正确的是 (AB)
A、 当我们以任意的一个对象为根,我们通过OGNL可以访问与这个对象关联的其它对象。
B、 通过ognl简单一致的表达式语法,我们可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
C、 表现层框架都默认使用OGNL作为表达式语言。
D、 OGNL通常支持对象方法调用、类静态的方法调用和值访问,但是不支持集合对象的相关操作。
7. 【多选题】 当我们向值栈的root属性中保存数据时,如下哪些方式是正确的 (AC)
A、 valueStack.push(Object obj);
B、 valueStack.push(String key, Object obj);
C、 valueStack.set(String key, Object obj);
D、 valueStack.set(Object obj);
8. 【多选题】 下列选项中有关值栈的相关概念表述正确的是 (ABD)
A、 值栈就相当于一个数据的中转站,我们可以向值栈存入一些数据,同样也可以从值栈中获取到数据。
B、 ValueStack是struts2框架提供一个接口,具体的实现类是ognlValueStack。
C、 默认情况下struts2框架下Action是单例的,当请求一访问,就会创建一个Action实例,同时也会创建一个ActionContext对象,代表的是Action的上下文对象,最后还会创建一个ValueStack对象。
D、 通常情况下每一个Action实例都有一个ValueStack对象。
9. 【编程题】在jsp页面使用迭代标签迭代集合值
需求:写一个Action,初始化List集合数据,存储在值栈的root(根元素)对象中,再在jsp页面使用迭代标签迭代集合值。
操作步骤
- 新建action,继承ActionSupport
- 新建对象:User.java
- 在action的成员变量中定义list(集合的元素为User对象)
- 重写execute()方法, 给集合对象赋值
- 写jsp页面,迭代显示集合值
Action代码: |
public class TagTestAction extends ActionSupport{ // 数据存储到根元素中! private List<User> list; public List<User> getList() { return list; } @Override public String execute() throws Exception { list = new ArrayList<User>(); // 初始化 for (int i=1; i<6; i++) { User user = new User("Kobe"+i,"999"); list.add(user); } return super.execute(); } } |
注:答案在答案\编程题9
二、 晋级部分
需求:使用struts的<s:property>标签,结合OGNL表达式获取值栈中Map数据,也是ValueStack值栈对象中context中数据。
需求详述:
通过ActionContext获取表示request、session、application域的map, 再往map中设置值,最后再在jsp页面通过struts2的标签获取值 (<s:property>)
操作步骤
(1) 新建action类
(2) 在action类的方法中,通过ActionContext 获取表示request、session、 applicatoin域对象的map集合,再设置map值。
(3) 配置struts.xml
(4) 通过jsp页面获取map集合值
注:答案在答案\晋级题1
三、 面试题部分
1. 值栈对象的创建 ,ValueStack 和 ActionContext 是什么关系 ?
答案:
值栈对象是请求时创建的
doFilter中 prepare.createActionContext(request, response);
* 创建ActionContext对象过程中,创建值栈对象ValueStack
* ActionContext对象对ValueStack对象有引用的(在程序中通过 ActionContext 获得值栈对象 )
Dispatcher类 serviceAction 方法中将值栈对象保存到request范围
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
2. 如何获得值栈对象?
答案:
1、ActionContext.getContext().get(ActionContext.VALUE_STACK); 2、ActionContext.getContext().getValueStack(); 3、ServletActionContext.getRequest().getAttribute("struts.valueStack");
3. 什么是值栈?值栈的内部结构?
答案:
ValueStack 是 struts2 提供一个接口,实现类 OgnlValueStack ---- 值栈对象 (OGNL是从值栈中获取数据的 )每个Action实例都有一个ValueStack对象 (一个请求对应 一个ValueStack对象 )在其中保存当前Action 对象和其他相关对象 (值栈中是有Action引用的 )Struts 框架把 ValueStack 对象保存在名为“struts.valueStack” 的请求属性中,request中(值栈对象是request一个属性)
值栈由两部分组成,ObjectStack(root)和ContextMap(context)
ObjectStack: Struts 把动作和相关对象压入 ObjectStack 中--List
ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入ContextMap中,Struts 会把下面这些映射压入 ContextMap 中
parameters: 该 Map 中包含当前请求的请求参数
request: 该 Map 中包含当前 request 对象中的所有属性
session: 该 Map 中包含当前 session 对象中的所有属性
application:该 Map 中包含当前 application 对象中的所有属性
attr: 该 Map 按如下顺序来检索某个属性: request, session, application
VaValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )
* CompoundRoot 就是ArrayList
* OgnlContext 就是 Map
cncontext 对应Map 引入 root对象
* context中还存在 request、 session、application、 attr、 parameters 对象引用
* OGNL表达式,访问root中数据时 不需要 #, 访问 request、 session、application、 attr、 parameters 对象数据 必须写 #
* 操作值栈 默认指 操作 root 元素