面试题:struts 值栈

一、 核心部分

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页面使用迭代标签迭代集合值。

操作步骤

  1. 新建action,继承ActionSupport
  2. 新建对象:User.java
  3. action的成员变量中定义list(集合的元素为User对象)
  4. 重写execute()方法, 给集合对象赋值
  5. 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 元素

猜你喜欢

转载自www.cnblogs.com/shan1393/p/9057789.html