java ognl表达式_ognl 详解 Struts2中的OGNL表达式 | 学步园

在进行Struts2的标签库介绍之前,有必要着重对OGNL(Object Graph Navigating Language)对象导航语言做一详细解析。因为在之后的演示代码中经常会用到一些有关OGNL的代码,为了不让读者一头雾水,也为了更好学习 Struts2的标签库。因此笔者把OGNL当作学习Struts2标签库的基础知识来介绍。让大家学习Struts2的基础打得更加扎实点。

技术要点

本节代码对OGNL一些常用特性进行分析,用演示代码演示这些特性。

常用特性介绍。

OGNL在Struts2中页面中的应用。

OGNL特殊符号介绍。

演示代码

利用OGNL进行应用的页面:

Java代码  icon_star.png

Session和Request值

request.materialName: 

session.materialName: 

根据条件显示数据

价格小于50元的建材

  •  建材价格是 元!

 "人造石台面" 的库存数量是: 

Map数据显示

供销商frank手里还有建材 

库存量为

struts.xml文件配置:

Java代码  icon_star.png

/jsp/ognl.jsp

OGNL示例Action代码:

Java代码  icon_star.png

public class OgnlExampleAction extends ActionSupport {

//设置request、response参数和需要显示的数据集合定义

private HttpServletRequest request;

private HttpSession session;

private List materials;

public String  execute() throws Exception {

request = ServletActionContext.getRequest();

session=request.getSession();

//设置request、session存放值

request.setAttribute("materialName","人造石台面 From request");

session.setAttribute("materialName","欧龙无苯油漆(六度) From session");

//初始化数据集合,集合类型为List

materials = new ArrayList();

materials .add(new Material("欧龙无苯油漆(六度)", 100, 2000));

materials .add(new Material("6*10mm门套线红影木夹板饰面(单面)", 20, 2900));

materials .add(new Material("人造石台面", 56, 800));

return SUCCESS;

}

//setter,getter方法

public HttpServletRequest getRequest() {

return request;

}

public void setRequest(HttpServletRequest request) {

this.request = request;

}

…………

}

材料数据类:

Java代码  icon_star.png

//材料对象

public class Material {

//材料名

private String materialName;

//材料价格

private int mainbid;

//材料数量

private int mount;

//构造初始化数据

public Material(String materialName, int mainbid, int mount) {

super();

this.materialName = materialName;

this.mainbid = mainbid;

this.mount = mount;

}

//setter,getter方法

public String getMaterialName() {

return materialName;

}

public void setMaterialName(String materialName) {

this.materialName = materialName;

}

………

}

运行效果图如图5.1所示。

df2cd9b520d000e8bf25dce2ae29ff1b.png

图5.1  OGNL运行示例效果图

代码解释

(1)Struts2中将应用范围里的数据以及Action处理的数据都存储在一个区域里。在Struts2中叫做“valueStack”,中文名为“值栈”。而OGNL就是从“值栈”取出数据,并在某些条件下进行数据过滤和计算的表达式语言。在Struts2中值栈作为OGNL的根对象,从值栈中取出自己需要的数据,而且值栈存取数据是按照先入后出的概念。因此查询数据时候往往是值栈中最顶部的数据先被查询出来。更加需要指出的是在值栈中也可以使用索引,可以在指定的索引位置开始搜索数据。

在OGNL中如果搜索的数据不是值栈里存储的数据,而且其他对象中,特别是Struts2的ActionContext中的对象,则在访问这些对象时候,前面要加“#”。比如ognl.jsp中访问session和request对象时候代码中在request和session之前就有“#”。

对于数据集合类型,如果根据条件查询该集合里的数据,形成子集合的时候,常用的OGNL还有“?”、“^”、“$”。此三个符号中“?”是取得所有符合条件的数据时使用。“^”是取这些符合条件的数据中索引中第一个或第一条数据。而“$”则正好相反,是取得最后一个或最后一条数据。

在OGNL中,还有lamuda表达式和很多计算公式的表达式,笔者认为如果坚持松耦合理念的话,最好不要使用。毕竟OGNL更多使用在MVC模式中view和comtrol两层,而计算公式等OGNL知识更多的和业务逻辑联系关联比较大,所以本书就不做过多介绍。

(2)本示例中,首先创建了建筑材料的模型对象。其中有材料名、材料价格、材料库存量三个属性。在OgnlExampleAction中做了两件事情,一件事情是在request、session中各放入key为“materialName”的值。另一件事情是初始化三个材料对象,将这些对象放在 List类型的数据集合中。

然后在struts.xml中对OgnlExampleAction做定义,将其导航到ognl.jsp中。在该jsp中,读者参看其代码。首先将request、session中“materialName”的值用OGNL取出。因为request、session都不是值栈,所以在它们名字之前都以“#”开头。在代码中将之前List类型的数据集合中所有材料价格小于50的数据显示出来。这里用了“?”也就是之前所说去取符合条件的数据集时使用。

在取材料名为“人造石台面”的材料库存量时候,OGNL先利用条件过滤得到符合条件的材料对象集然后用“{}”去取库存量属性,再取该子集中第一个索引,这里索引次序和Java中相同,也是从“0”开始表明集合中第一个元素。

在ognl.jsp中,OGNL也新建了一个Map对象,然后定义了该对象中的key和value。OGNL对于显示Map对象中某个key的值采取ognl.jsp代码中所示。“[]”中写key的名字,并用‘’包含。

(3)OGNL中经常会有“#”、“%”、“$”三个符号。一般“#”都是像前文所述代表那些非值栈的对象。还有就是ognl.jsp中创建 Map对象时候用到。而“%”则是显示对象中的值。至于“$”则是用来显示属性文件中定义的值。比如某属性文件中定义了“kkk=10”则在 Struts2的struts.xml或者JSP文件中用“${kkk}”则系统会读取“10”这个值作为显示值。

2012-11-30

10:44 2098人阅读 评论(1)

浅析值栈

ValueStack对象相当于一个栈,它贯穿整个Action的生命周期,每个Action类的对象实例都会拥有一个ValueStack对象

当Struts2接收到一个*.action请求后,并不是直接调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点

值栈也位于内存中,它也是和parameters、request、session、application、attr对象放在一起的

值栈属于ONGL Context里面的根对象。也就是说它位于整个内存中最最重要的地方,所以叫根对象

根对象和另外五个对象是有区别的,根对象可以省写#号,比如

值栈的生命周期与request请求相关,每次请求产生一个值栈。默认所有的Action会被自动放到值栈里

服务器跳转时共用值栈

假设从一个Action11通过服务器跳转到Action22的话,就意味着这两个Action是共享一个值栈的,因为一次请求只使用一个值栈

这时内存中情况是这样的:首先接收到Action11请求后,会产生一个值栈,在栈顶存放Action11对象以及它所有的属性

然后经过服务器跳转到Action22,这时就会把Action22对象压入值栈的栈顶位置,此时Action11对象以及它的所有属性就位于栈底了

取值过程

栈的特征是后进先出。于是首先到栈顶的对象里查找是否存在这个属性,如果栈顶的Action22对象中不存在这个属性的话

它就会继续向下寻找直至栈底对象,一直查找是否存在这个属性

如果最后找到该属性的话,那么就会在JSP页面中通过输出属性值

如果在Action22和Action11都有一个同名的同类型的username属性的话,那么将输出Action22中的属性值

因为它是先从栈顶开始寻找属性的,值栈的特征就是后进先出,但有个前提:请求过程是通过服务器跳转的

三个语法

假设此时想要获取Action11中的username属性的话,就可以使用值栈的Top语法或者N语法

使用Top语法获取值栈中的第二个对象的属性:

使用 N 语法获取值栈中的第二个对象的属性:

另外值栈还有一个@语法,例如使用@语法调用Action中的静态方法:

@vs@get()等价于@vs1@getVOMethod(),指的是栈顶对象的静态getVOMethod()方法

同理@vs2@getVOMethod()就是取值栈中第二个对象的静态getVOMethod()方法

客户端跳转时使用各自的值栈

假如中间某一个步骤中出现了客户端跳转的话,那么两个Action所使用的就是两个不同的值栈了

所以在Action22中就不能再使用Action11中的属性了,在最后跳转到的JSP页面中也就无法获取Action11的属性了

也即从Action22跳转到JSP页面时使用的是redirect的话,那么最后值栈中是没有任何的Action对象的

这个时候我们可以通过链接传参,比如test.jsp?netname=${username}

意思就是取出Action22中的username属性作为参数,通过浏览器地址栏传递到JSP页面中

然后使用OGNL中的#号获取Paraments对象的属性,即就可以取到值了

辅助参考:http://blog.csdn.net/jadyer/archive/2010/09/16/5887509.aspx

手工向值栈中压入对象

正常情况下值栈保存的是Action对象,而我们也可以直接往值栈中添加其它对象,这时可以在Action中添加如下代码

向值栈中添加对象:ActionContext.getContext.getValueStack().push(new Student("沈浪",22));

而且我们手工往值栈中添加的Student对象会位于栈顶。这是因为Struts2会首先初始化Action,然后才能调用它的方法

初始化Action的时候,便把Action放到值栈中了,然后在执行它的execute()方法时,就又往值栈中添加了Student对象

浅析OGNL

OGNL是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言

通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能

OGNL用得最多的地方就是和Struts2的标签绑定,也可以在配置文件中通过${}使用OGNL表达式

OGNL中$号的使用

1..在国际化资源文件中,引用OGNL表达式

2..在struts.xml文件中,引用OGNL表达式

OGNL中%号的使用

1..使用%{}可以取出保存在值堆栈中的Action对象,直接调用它的方法

2..如果Action继承了ActionSupport,那么在页面标签中可以使用%{getText('key')}获取国际化信息

辅助参考:http://blog.csdn.net/jadyer/archive/2010/09/16/5887545.aspx

OGNL中#号的使用

OGNL中的#号可以取出堆栈上下文中存放的对象

名称

作用

例子

attr

用于按request>>session>>application顺序访问其属性

#attr.userName相当于按顺序从三个范围读取userName属性直到找到为止

request

包含当前HttpServletRequest的属性的Map

#request.userName相当于request.getAttribute("userName")

session

包含当前HttpSession的属性的Map

#session.userName相当于session.getAttribute("userName")

application

包含当前应用的ServletContext的属性的Map

#application.userName相当于application.getAttribute("userName")

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]相当于request.getParameter("id")

获取Action中的属性值或者Action中的对象的某某属性值

利用标签可以直接获取Action中的引用类型user里面的username属性

同样可以通过user.address.addr获取user中引用类型address中的addr属性的值

像这种一层一层往下传递的访问方式,即所谓的导航,也就是一步步的往下调用

调用Action的对象里面的普通方法

默认的会把Action放到值栈里面,而值栈在访问的时候,并不需要值栈的名字

当我们调用的时候

它会自动到值栈里面查找Action对象里面有没有user对象,然后它就发现有user

然后它就再找user里面有没有getVOMethod()方法,然后它发现有,于是调用getVOMethod()

实际上调用User中的getVOMethod()方法的过程与获取表单中的姓名密码的方式都是相同的

都是到值栈里面查找,找是否存在user对象,如果存在,接着查找user中是否存在某某属性或方法

调用Action中的静态方法

同样我们也可以在JSP页面中写一个OGNL表达式调用Action中的静态方法

调用Action中的静态方法时,与调用user对象的getVOMethod()方法的过程,是截然不同的

此时value的写法是固定的,以@开头,后面跟上具体的包名,然后@加上静态方法

比如

另外user对象是LoginAction中的一个属性,这个属性会自动的放到值栈里面

而值栈调用的时候,不用加上@或者包名等等,所以直接user.getVOMethod()就可以了

调用JDK类中的静态方法

可以使用输出floor()的执行结果

这就意味着如果不在@@中指定类的话,默认的就表示java.lang.Math类

当前大多数情况下,我们都不会省略这个类,都会写全了的,然后在后面加上静态方法

集合的伪属性

OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBean模式,例如size()、length()

当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性

比如获取List的大小:

List的伪属性:size、isEmpty、iterator

Set的伪属性:size、isEmpty、iterator

Map的伪属性:size、isEmpty、keys、values

Iterator的伪属性:next、hasNext

Enumeration伪属性:next、hasNext、nextElement、hasMoreElements

获取集合中元素的实质就是调用它的toString()方法

它还可以直接获取集合中的元素,事实上是在调用集合的toString()方法

所以我们可以根据实际情况通过重写集合的toString()方法来实现个性  化输出

甚至它还可以像访问数组那样,直接testList[2]获取集合中的元素

但这种方法只适用于List,不适用于Map。因为Map的索引是key,不是数值

另外,由于HashSet中的元素是没有顺序的,所以也不能用下标获取单个元素

Lambda表达式

补充一下:使用Lambda表达式可以在OGNL中书写递归式子,在帮助中对它有很详细的说明

打开帮助中的//struts-2.0.14-all//struts-2.0.14//docs//index.html页面

在左侧的Documentation下面点击Guides链接,然后在这个页面中点击OGNL

最后跳转到//struts-2.0.14-all//struts-2.0.14//docs//docs//ognl.html

将这个页面右侧的下拉条拖放到最下面,就会看到它的说明了,它举的例子如下所示

Lambda表达式的语法是:[...] ,中括号前面有一个冒号,所有东西都在中括号里面写

也就是说我们只要看到一个冒号跟着一个中括号,就表示这里使用的是Lambda表达式

#this指的是表达式的参数

所以这个例子可以这样理解:先判断这个参数是否等于零,如果等于零,那么它的值最后就是零

如果参数不等于零,就再判断它是否等于壹。如果参数等于壹,那么它的值最后就是壹

如果参数不等于壹,就继续调用#fib。注意这里已经用中括号将整体的值赋给了fib

实际上很少能够用得到Lambda表达式

利用投影获取属性

利用投影获取List中对象的username属性时,其中{}表示的是一个集合

stus.{username}就表示将suts中所有的username属性取出组成一个新的列表

利用选择获取属性

OGNL表达式是很灵活的,可以同时使用选择技术与投影技术获取属性

使用选择技术时,#this代表当前元素,问号?是把所有满足条件的元素都取出来

上箭头^是开始的意思,所以stus.{^#this.grade>=60}.{username}输出的是[张三]

注意,此时输出文本中包含中括号,这表示它是一个列表

而stus.{?#this.grade>=60}.{username}[0]输出的是张三,是字符串,二者是不同的

美元符号$是结束的意思,所以stus.{$#this.grade>=60}.{username}输出的是[王五]

这三个符合:问号、上箭头、美元符所返回的都是List

补充

1..当OGNL取不到值的时候,它不会报错,而是什么都不显示

2..返回的是ValueStack中从上至下的所有的Object

返回的是ValueStack中从上至下的第二个Object

3..返回的是成员变量username的值

假设ValueStack中存在两个Action的话,如果第一个Action如果没有username变量

那么它会继续找第二个Action。那么在什么情况下ValueStack中会存在两个Action呢

答案是在struts.xml中配置的是从一个Action通过跳转到另一个Action

4..

在Struts2.1.6中必须设置struts.ognl.allowStaticMethodAccess为true之后

才允许使用OGNL访问静态方法。而在Struts2.0.11则无需设置,即可直接访问

下面是OGNL测试的工程代码,这是一个Struts2.0.11应用

首先是web.xml文件

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

struts2

org.apache.struts2.dispatcher.FilterDispatcher

struts2

/*

login.jsp

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

struts2

org.apache.struts2.dispatcher.FilterDispatcher

struts2

/*

login.jsp

然后是用于输入用户名和密码等信息的测试页面login.jsp

pagelanguage="java"pageEncoding="UTF-8"%>

这是测试OGNL使用的登录页面

提示:程序设定的用户名和密码各为adminjadyer

注意:用户名和密码不正确时将停留在页面不动

/login.action"method="POST">

姓名:

密码:

地址:

这是测试OGNL使用的登录页面

提示:程序设定的用户名和密码各为adminjadyer

注意:用户名和密码不正确时将停留在页面不动

/login.action"method="POST">

姓名:

密码:

地址:

然后是用于显示OGNL处理结果的loginSuc.jsp页面

pagelanguage="java"pageEncoding="UTF-8"%>

taglibprefix="s"uri="/struts-tags"%>

这是使用OGNL输出的结果页面

获取姓名属性:

另外还有两种写法也是可以正常输出值栈中对象的普通属性的 --%>

--%>

--%>

但是如果写成下面这种形式的话,就什么都不会输出了 --%>

--%>

获取地址属性:

调用值栈中的对象的普通方法:

调用值栈中Action的普通方法:


获取普通类的静态属性:

访问普通类的构造方法:

com.jadyer.vo.Student('张小三',22).username"/>

调用Action中的静态方法:

调用JDK中的类的静态方法:

调用JDK中的类的静态方法:

调用JDK中的类的静态方法:


获取List中的所有元素:

获取Set中的所有元素:

获取Map中的所有元素:

获取Map中的某个元素:

另外还有两种写法也是可以正常获取Map中的某个具体元素的 --%>

--%>

--%>

获取Set中的某个元素:

由于Set中的元素是无顺序的,所以不能使用下标获取数据,所以这里什么也得不到 --%>

获取List中的某个元素:


获取List的大小:

获取Set的大小:

获取Map的大小:

获取Map中所有的键:

获取Map中所有的值:

Lambda计算4的阶乘:

:[#this==1?1 : #this*#f(#this-1)],#f(4)"/>


获取List中的所有对象:

利用投影获取List中对象的名字:

利用投影获取List中第二个对象的名字:

使用获取到的值为:[李四]

--%>

二者的区别在于:后者比前者多了一个中括号 --%>

利用选择获取List中成绩及格的所有对象:

=60}"/>

利用选择获取List中成绩及格的第一个对象:

=60}"/>

利用选择获取List中成绩及格的最后一个对象:

=60}"/>


利用选择获取List中成绩及格的所有对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的第二个对象的名字:

=60}.{username}[1]"/>

利用选择获取List中成绩及格的第一个对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的最后一个对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的第一个对象然后求大小:

=60}.{username}.size"/>


利用OGNL中的#号获取attr中的属性:

利用OGNL中的#号获取request范围中的属性:

利用OGNL中的#号获取session范围中的属性:

利用OGNL中的#号获取Paraments对象的属性:

使用<%=request.getParameter("")%>或者${param.name}获取链接参数值:

${param.netname}

查看值栈中的信息:

这是使用OGNL输出的结果页面

获取姓名属性:

--%>

--%>

--%>

获取地址属性:

调用值栈中的对象的普通方法:

调用值栈中Action的普通方法:


获取普通类的静态属性:

访问普通类的构造方法:

调用Action中的静态方法:

调用JDK中的类的静态方法:

调用JDK中的类的静态方法:

调用JDK中的类的静态方法:


获取List中的所有元素:

获取Set中的所有元素:

获取Map中的所有元素:

获取Map中的某个元素:

--%>

--%>

获取Set中的某个元素:

获取List中的某个元素:


获取List的大小:

获取Set的大小:

获取Map的大小:

获取Map中所有的键:

获取Map中所有的值:

Lambda计算4的阶乘:


获取List中的所有对象:

利用投影获取List中对象的名字:

利用投影获取List中第二个对象的名字:

获取到的值为:[李四] --%>

利用选择获取List中成绩及格的所有对象:

=60}"/>

利用选择获取List中成绩及格的第一个对象:

=60}"/>

利用选择获取List中成绩及格的最后一个对象:

=60}"/>


利用选择获取List中成绩及格的所有对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的第二个对象的名字:

=60}.{username}[1]"/>

利用选择获取List中成绩及格的第一个对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的最后一个对象的名字:

=60}.{username}"/>

利用选择获取List中成绩及格的第一个对象然后求大小:

=60}.{username}.size"/>


利用OGNL中的#号获取attr中的属性:

利用OGNL中的#号获取request范围中的属性:

利用OGNL中的#号获取session范围中的属性:

利用OGNL中的#号获取Paraments对象的属性:

使用<%=request.getParameter("")%>或者${param.name}获取链接参数值:

${param.netname}

查看值栈中的信息:

然后是struts.xml文件

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

/login.jsp

/loginSuc.jsp?netname=hongyu

struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

/login.jsp

/loginSuc.jsp?netname=hongyu

接着是用到的三个VO类

packagecom.jadyer.vo;

publicclassUser

{

privateString

username;

privateString

password;

privateAddress

address;

/* 三个属性的setter和getter略 */

publicString

getVOMethod(){

return"这是User类中的一个普通方法";

}

}

packagecom.jadyer.vo;

publicclassAddress

{

//如果将TIPS设为private的话,loginSuc.jsp中就无法获取它的属性值了

//事实上将一个静态的final属性设为private是毫无意义的

//因为既然设置成了静态,那么就是供他人调用的,如果再设成private的话,别的地方根本就无法调用了

//即使OGNL再怎么强大,它也不可能违反Java的规则,所以不要将静态的属性设为私有

publicstaticfinalString

TIPS ="玄玉加油!!";

//addr属性的setter和getter略

privateString

addr;

}

packagecom.jadyer.vo;

publicclassStudent

{

privateString

username;

privateintgrade;

/* 两个属性的setter和getter略 */

//只要是重写一个类的构造方法,就必须要为这个类保留空的构造方法

//因为框架默认的都会去调用无参的空的构造方法

publicStudent(){};

publicStudent(String

username,intgrade){

this.username

= username;

this.grade

= grade;

}

@Override

publicString

toString() {

//如果不重写它的toString()方法的话,默认调用toString()将输出【类型+@+内存地址的哈希值】

return"{学生姓名:"+

username +",成绩:"+ grade +"}";

}

}

packagecom.jadyer.vo;

publicclassUser {

privateString username;

privateString password;

privateAddress address;

/* 三个属性的setter和getter略 */

publicString getVOMethod(){

return"这是User类中的一个普通方法";

}

}

packagecom.jadyer.vo;

publicclassAddress {

//如果将TIPS设为private的话,loginSuc.jsp中就无法获取它的属性值了

//事实上将一个静态的final属性设为private是毫无意义的

//因为既然设置成了静态,那么就是供他人调用的,如果再设成private的话,别的地方根本就无法调用了

//即使OGNL再怎么强大,它也不可能违反Java的规则,所以不要将静态的属性设为私有

publicstaticfinalString TIPS ="玄玉加油!!";

//addr属性的setter和getter略

privateString addr;

}

packagecom.jadyer.vo;

publicclassStudent {

privateString username;

privateintgrade;

/* 两个属性的setter和getter略 */

//只要是重写一个类的构造方法,就必须要为这个类保留空的构造方法

//因为框架默认的都会去调用无参的空的构造方法

publicStudent(){};

publicStudent(String username,intgrade){

this.username = username;

this.grade = grade;

}

@Override

publicString toString() {

//如果不重写它的toString()方法的话,默认调用toString()将输出【类型+@+内存地址的哈希值】

return"{学生姓名:"+ username +",成绩:"+ grade +"}";

}

}

最后是用来提供OGNL测试的数据的LoginAction.java

packagecom.jadyer.action;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.HashSet;

importjava.util.List;

importjava.util.Map;

importjava.util.Set;

importorg.apache.struts2.interceptor.RequestAware;

importorg.apache.struts2.interceptor.SessionAware;

importcom.jadyer.vo.Student;

importcom.jadyer.vo.User;

importcom.opensymphony.xwork2.ActionSupport;

@SuppressWarnings({"serial","unchecked"})

publicclassLoginActionextendsActionSupportimplementsRequestAware,SessionAware

{

privateUser

user;

privateList

testList =newArrayList();

privateSet

testSet =newHashSet();

privateMap

testMap =newHashMap();

privateList

stus =newArrayList();

/* 以上五个属性的setter和getter略 */

privateMap

request;

privateMap

session;

publicvoidsetRequest(Map

request) {

this.request

= request;

}

publicvoidsetSession(Map

session) {

this.session

= session;

}

publicstaticString

getStatic(){

return"这是LoginAction中的一个静态方法";

}

publicString

getCommon(){

return"这是LoginAction中的一个普通方法";

}

@Override

publicString

execute()throwsException {

if(user.getUsername().trim().equalsIgnoreCase("admin")

&& user.getPassword().equals("jadyer")){

testList.add("list11");

testList.add("list22");

testList.add("list33");

testList.add("list44");

testList.add("list55");

testSet.add("set11");

testSet.add("set22");

testSet.add("set33");

testSet.add("set22");

testSet.add("set11");

testMap.put("m11","map11");

testMap.put("m22","map22");

testMap.put("m33","map33");

testMap.put("m44","map44");

testMap.put("m55","map55");

stus.add(newStudent("张三",88));

stus.add(newStudent("李四",77));

stus.add(newStudent("王五",66));

stus.add(newStudent("马六",55));

request.put("req","这是通过OGNL中的#号获取的request属性范围的值");

session.put("ses","这是通过OGNL中的#号获取的session属性范围的值");

request.put("BB","这是通过OGNL中的#号获取的request属性范围的BB");

session.put("BB","这是通过OGNL中的#号获取的session属性范围的BB");

returnSUCCESS;

}else{

returnINPUT;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值