struts2入门之OGNL

OGNL是一个表达式语言,可以和EL表达式做类比,至于OGNL和struts2的关系,我想说的是,它们之间根本没有关系。之所以二者经常一起提起,是因为二者经常会一起用,struts2提供的标签中的属性里可以写ognl表达式,用于获取数据,这些数据既可以从域对象中获取,也可以从值栈中获取,这取决于你的数据是放在域对象中还是值栈中,下面贴出jsp页面获取值栈中的数据对象集合:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2 pageEncoding="UTF-8"%>
 3 <%@ taglib uri="/struts-tags" prefix="s" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 <p>action中定义变量并生成get方法,来获取值栈中的数据(对象)</p>
12 <s:property value="user.userName"/>
13 <s:property value="user.passWord"/>
14 <p>action中定义变量并生成get方法,来获取值栈中的数据(list集合)</p>
15 <s:iterator value="list">
16 <s:property value="userName"/>
17 <s:property value="passWord"/>
18 </s:iterator>
19 <p>action中定义变量并生成get方法,来获取值栈中的数据(list集合另一种方式)</p>
20 <s:iterator value="list" var="user">
21 <s:property value="#user.userName"/>
22 <s:property value="#user.passWord"/>
23 </s:iterator>
24 </body>
25 </html>

我的action代码如下,提供了存储对象集合到值栈中:

 1 package com.cczhao.struts.valuestack;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.cczhao.struts.entity.User;
 7 import com.opensymphony.xwork2.ActionContext;
 8 import com.opensymphony.xwork2.ActionSupport;
 9 import com.opensymphony.xwork2.util.ValueStack;
10 
11 /**
12  * 
13  * 功能: TODO 往值栈中存放数据.<br/>
14  * date: 2017年6月25日 下午12:05:55 <br/>
15  *
16  * @author cczhao
17  * @version
18  * @since JDK 1.8
19  */
20 public class ValueStack3Action extends ActionSupport {
21     private static final long serialVersionUID = 1L;
22     private User user = new User();
23     private User user2 = new User();
24     private List<User> list = new ArrayList<>();
25 
26     public List<User> getList() {
27         return list;
28     }
29 
30     public User getUser2() {
31         return user2;
32     }
33 
34     public User getUser() {
35         return user;
36     }
37 
38     // 方式3:通过在action中定义变量,并生成get方法
39     public String execute() throws Exception {
40         ActionContext context = ActionContext.getContext();
41         ValueStack stack = context.getValueStack();
42         
43         user.setPassWord("123456");
44         user.setUserName("曾柔");
45         user2.setPassWord("111");
46         user2.setUserName("双儿");
47         list.add(user);
48         list.add(user2);
49         return "success";
50     }
51 }

OGNL表达式语言结合struts2的标签进行使用能很好的用于获取后台的实体数据,上面的action只显示了一种往值栈中存放数据,然后在jsp中利用struts2标签+ognl来获取数据,其实往值栈中存放数据还有两种方式:set方式和push方式。但这两种方式占用空间较大,但是灵活度高点,可以斟酌使用,但在实际开发中我觉的在action中声明变量并生成get方法,这种方式往值栈中存放数据的方式更常用一点,因为平时前后台交互的时候大多是对象在交互,且可能是对象集合。

刚看了这么多,以后如果有新的认识会继续更新。

--------------------------------------------分割线---------------------------------------------

新增常见的几个struts2的标签:

s:property 和ognl表达式在jsp中获取值栈数据
s:iterator 获取值栈list集合数据
s:debug 查看值栈结构和数据
还有一个比较重要的struts2标签:s:form
<s:form action="" method="" enctype="">
<!-- 普通输入框 -->
<s:textfield name="userName" label="用户名"></s:textfield>

<!-- 密码框 -->
<s:password name="passWord" label="密码"></s:password>

<!-- 单选框(页面显示值可能和value值不一样) -->
<s:radio list="{'男','女'}" name="gender"></s:radio>
<s:radio list="#{'1':'男','0':'女'}" name="gender" label="性别"></s:radio>

<!-- 复选框 -->
<s:checkbox list="{'吃饭','睡觉','泡妞'}" name="hobby" label="爱好"></s:checkbox>

<!-- 下拉框 -->
<s:select list="{'小学','初中','高中'}" name="college" label="学历"></select>

<!--文件上传项-->
<s:file name="file" label="上传文件"></s:file>

<!--隐藏项-->
<s:hidden name="hid" value="abcd"></s:hidde>

<!--文本域-->
<s:textarea cols="10" rows="10" name="resume" label="简历"></s:textarea>

<!--提交按钮-->
<s:submit value="提交"></s:submit>

<!--重置按钮-->
<s:reset value="重置"></s:reset>
</s:form>

原文地址:https://www.cnblogs.com/ZT-SummerRain/p/7076607.html