1 ognl概述

2 ognl入门案例

3 什么是值栈

(1)servlet和action区别

(2)值栈存储位置

4 如何获取值栈对象

5 值栈内部结构

6 向值栈放数据

(1)s:debug标签

(2)向值栈放字符串

(3)向值栈放对象

(4)向值栈放list集合

7 从值栈获取数据

(1)从值栈获取字符串

(2)从值栈获取对象

(3)从值栈获取list集合

OGNL的作用

Struts2默认的表达式语言就是OGNL,它具有以下特点:

①支持对象方法调用。例如:objName.methodName()。

OGNL概述

1 之前web阶段,学习过EL表达式,EL表达式在jsp中获取域对象里面的值

2 OGNL是一种表达式,这个表达式更加强大

(1)在struts2里面操作值栈数据

(2)一般把ognl在struts2操作,和struts2标签一起使用操作值栈

3 OGNL不是struts2的一部分:和struts2标签一起使用

(1)使用ognl时首先导入jar包,struts2提供jar包

OGNL入门案例

1 使用ognl+struts2标签计算字符串长度

支持对象方法调用。例如:objName.methodName()。

(1)在java代码中,调用字符串.length()。

2 使用struts2标签

(1)使用jstl时候,导入jar之外,在jsp页面中引入标签库

使用struts2标签时候,在jsp中引入标签库。

<%@ taglib uri="/struts-tags" prefix="s" %>

在body这样写

<s:property value="'haha'.length()"></s:property>

运行

什么是值栈

1 之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内,存值和取值。

2 在struts2里面提供本身一种存储机制,类似于域对象,是值栈。可以存值和取值。

(1)在action里面把数据放到值栈里面,在页面中获取到值栈数据

3 servlet和action区别

(1)servlet,默认在第一次访问时候创建,创建一次,

(2)Action:访问时创建,每次访问action时候,都会创建action对象,创建多次,多实例对象。

实验:在action的构造方法中输出一条语句,每次访问的时候这条语句都会输出(记得实现execute()方法)。

4 值栈存储位置

(1)每次访问action时候,都会创建action对象

(2)在每个action对象里面都会有一个值栈对象(只有一个)

获取值栈对象

1 获取值栈对象有多种方式

(1)常用方式:使用ActionContext类里面的方法得到值栈对象

(2)每个action对象只有一个值栈对象

public String execute(){
//1 获取ActionContext类的对象
ActionContext context = ActionContext.getContext();
//2 调用方法得到值栈对象
ValueStack stack1 = context.getValueStack();
ValueStack stack2 = context.getValueStack();
//每个action中只有一个值栈
System.out.println(stack1==stack2); return NONE;
}

输出true。

值栈

值栈的内部结构

1 值栈分为两部分结构

第一部分 root,结构是list集合

(1)一般操作都是root里面的数据

第二部分 context,结构map集合

root 结构是ArrayList集合

一般操作都是root里面数据。

2 Struts2里面标签,s:debug,使用这个标签可以查看值栈结构和存储值

在jsp中,这样添加即可

<body>
<!-- 使用struts2标签查看值栈结构 -->
<s:debug></s:debug>
</body>

(1)访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签。

查看结构

(3)在action中没有任何操作,栈顶元素是action引用

-action对象里有值栈对象

-值栈对象里面有action引用

向值栈放数据

1 向值栈放数据多种方式

第一种  获取值栈对象,调用值栈对象里面的set方法

ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 调用方法set方法
stack.set("username", "itcast");

栈顶元素是:

第二种 获取值栈对象,调用值栈对象里面的push方法

//3 调用方法push方法
stack.push("abcd");

栈顶元素和下一个元素

第三种 在action定义变量,生成变量的get方法(主要使用这种方式)

private String name;
//2 生成变量的get方法
public String getName(){
return name;
} public String execute(){ //在执行的方法里面向变量设置值
name = "abcdefg";
}

debug中

不用第一种和第二种方式的原因是,它们都要新分配空间,费内存。

向值栈放对象

1 实现步骤

第一步 定义对象变量

第二步 生成变量的get方法

第三步 在执行的方法里面向对象中设置值

public class ObjectDemoAction extends ActionSupport {

    //1 定义对象变量
private User user = new User();
//2 生成get方法
public User getUser() {
return user;
} public String execute(){
//3 向值栈的user里面放数据
user.setUsername("lucy");
user.setPassword("123");
user.setAddress("Aremican"); return SUCCESS;
}
}

向值栈放list对象

第一步 定义list集合变量

第二步 生成变量的get方法

第三步 在执行的方法里面向list集合设置值

public class ListDemoAction extends ActionSupport {

    // 1 定义对象变量
private List<User> list = new ArrayList<User>(); // 2 get方法
public List<User> getList() {
return list;
} public String execute() {
// 3 向list中设置值
User user1 = new User();
user1.setUsername("xiaoao");
user1.setPassword("123");
user1.setAddress("Aremican"); User user2 = new User();
user2.setUsername("xiaoxi");
user2.setPassword("456");
user2.setAddress("China"); list.add(user1);
list.add(user2); return SUCCESS;
} }

运行后,在debug中情况是

从值栈中取数据

1 使用struts2的标签+ognl表达式获取值栈数据

(1)<s:property value="ognl表达式"/>

获取字符串

public class ValueStackAction extends ActionSupport {

    private String username;

    public String getUsername() {
return username;
} public String execute(){ username = "itcase";
return SUCCESS;
} }

2 在jsp中使用struts2标签+ognl表达式获取

jsp中

<s:property value="username"></s:property>

页面中显示:

获取对象

action

public class ValueStackAction extends ActionSupport {

    private User user = new User();
public User getUser() {
return user;
} public String execute(){
user.setUsername("marry");
user.setPassword("250");
user.setAddress("china"); return SUCCESS;
} }

jsp中

<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>

获取list集合

public class ValueStackAction extends ActionSupport {

    private List<User> list = new ArrayList<User>();

    public List<User> getList() {
return list;
} public String execute(){
User user1 = new User();
user1.setUsername("xiaoao");
user1.setPassword("123");
user1.setAddress("Aremican"); User user2 = new User();
user2.setUsername("xiaoxi");
user2.setPassword("456");
user2.setAddress("China"); list.add(user1);
list.add(user2); return SUCCESS;
} }

第一种获取方式

<!-- 第一种方式实现 -->
<s:property value="list[0].username"/>
<s:property value="list[0].password"/>
<s:property value="list[0].address"/>
<br/> <s:property value="list[1].username"/>
<s:property value="list[1].password"/>
<s:property value="list[1].address"/>
<br/>

第二种方式

<!-- 使用struts2标签类似jstl的foreach标签
s:iterator:遍历值栈的list集合
-->
<s:iterator value="list">
<!-- 遍历list得到list里面的每个user对象 -->
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
<br/>
</s:iterator>

第三种方式

每次遍历list的User对象临时放到context中去,而context中是map集合,而map的key就是var值,

而使用这种方式就要在value前加#。

获取list的值第三种方式:
<br />
<s:iterator value="list" var="user">
<!--
遍历值栈list集合。得到list(root里面)中的每个user对象
机制:把每次遍历出来的user对象放到context里面
获取context里面数据 特点:写ognl表达式,
使用特殊符号#
-->
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
</s:iterator>

一般是第二种和第三种用得比较多。

其他操作

1 使用set方法向值栈放数据,获取

在ValueStackDemoAction中

stack.set("itcast", "itcastitheima");

jsp中的代码是

<s:property value="itcast"/>

在地址栏中输入valueStackDemo1.action进行访问,得到

itcastitheima

值。

2 使用push方法向值栈放数据,获取

push方法是没有名字的,

(1)使用push方法设置值,没有名称,只有设置的值

(2)向值栈放数据,把向值栈放数据存到数组里面,数组名称top,根据数组获取值。

使用方法

action中

stack.push("abcd");

jsp中

<s:property value="[0].top"/>

得到结果:

EL表达式获取值栈数据(为什么)

要引入jstl.jar和standard.jar包

在jsp页面开头添加如下语句

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

jsp中的代码如下所示:

<!-- 使用foreach标签+el表达式获取值栈list集合数据 -->

    <c:forEach items="${list }" var="user">
${user.username }
${user.password }
${user.address }
<br/>
</c:forEach>

1 EL表达式获取域对象值

2 向域对象里面放值使用setAttribute方法,获取值使用getAttribute方法

3 底层增强request对象里面的方法getAttribute方法

(1)首先从request域获取值,如果获取到,直接返回

(2)如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象里面。

4 查看源码

但是一般不用EL表达式,因为性能比较低。

OGNL的#、%使用

#使用

1 使用#获取context里面数据

<s:iterator value="list" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
<br/>
</s:iterator>

2 演示# 操作

(1)向request域放值

(2)在页面中使用ognl获取

<!--
获取context里面的数据,写ognl时候,首先要添加符号
#context的key名称.域对象名称
-->
<s:property value="#request.req"/>

%使用

1 在struts2标签中表单标签

(1)在struts2标签里面使用ognl表达式。如果直接在struts2表单标签里面使用ognl表达式,则不识别,只有写了%之后才识别。

<s:textfield name="username" value="#request.req"></s:textfield>

无法识别,

改成这样以后才行

<s:textfield name="username" value="%{#request.req}"></s:textfield>
    

prefix="c",就是<c:foreach>

prefix="a",就是<a:foreach>

案例

在Jsp中用foreach可以遍历,但是建议使用iterator.

struts学习(3)的更多相关文章

  1. struts 学习

    1.在Struts2的Action中取得请求参数值的几种方法 public class GetRequestParameterAction extends ActionSupport { privat ...

  2. Struts学习总结 学习

    ContextMap 包含值栈包含 root(list结构)和context(map结构)  值栈包含contextMap的引用.  Actioncontext是工具类 可以获取他们 Struts2拥 ...

  3. mzy,struts学习(一)

    大家都在讲struts已经过时了,现在都是前后台分离,没有必要去学一个淘汰的框架,但是怎么讲呢?我觉得,struts能够流行那么多年,肯定有它的原因,肯定有很多优秀和好的地方,有一个指导过我的人给我讲 ...

  4. struts学习

    1.集成tomcat到eclipse http://www.eclipsetotale.com/tomcatPlugin.html 下载最新的plug后,解压.解压后的文件放到eclipse的plug ...

  5. Struts学习总结-04 上传文件

    1. upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  6. Struts学习总结-02 类型转换

    一 类型转换 input.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...

  7. struts 学习之问一

    今天在进行struts全局类型和局部类型转换时,发现一个问题,如下: 当输入一个点的坐标时,我使用全局转换提示错误,找不到类,当改变成局部类型转换时,可以成功转换,不知道这个是什么原因,难道全局不可以 ...

  8. Struts学习之流程汇总

    struts2 架构图如下图所示: 依照上图,我们可以看出一个请求在struts的处理大概有如下步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的 ...

  9. Struts学习之手动验证

    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法    * 要继承ActionSupport类或者实现Validateable接口     ...

  10. Struts学习之文件上传

    * 单文件上传:        * 在动作类action中声明相关属性:            * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型:  ...

随机推荐

  1. linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)

    linux 传入 传出文件 swp  port  22 怎样通过swp通过docker 容器向外传文件 通过scp Linux互传文件,需要知道文件源 file source 所在系统的ip wuse ...

  2. Maven 手动把本地jar安装到本地仓库

    首先,你要安装的.jar包要下载下来放在电脑上面,然后maven已经配置好了,如下图: 然后,执行一下命令就可以了 mvn install:install-file -Dfile=path-to-fi ...

  3. MySQL中B+树索引的使用

    1)         不同应用中B+树索引的使用 对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的 对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的. ...

  4. 江卓尔与比特币增发,谣言or先知-千氪

    最近,很多圈内人都在讨论比特币是否应该增发,但等等,比特币真的会增发吗?到底是真有增发计划还是某些人别有用心地在散布谣言? 那么消息是从哪里出来的?北京时间 2 月 10 日晚,莱比特矿池创始人江卓尔 ...

  5. English Phrases

    @1:Phrases requst sth from/of sb 向某人要求某物 a new lease on life   重获新生.焕发生机 state of the art 最先进的 at th ...

  6. 工作了3年的JAVA程序员应该具备什么技能?(转)

    工作了3年的JAVA程序员应该具备什么技能? 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发 ...

  7. active admin

    activeadmin 1.0.0.pre4 所依赖的库 gem 'jquery-rails', '~> 4.0.4' 4.2版本会出现找不到jquery-ui 的datepicker错误 使用 ...

  8. 026_默认的MapReduce Driver(最小驱动问题)

    1. 最小配置的MapReduce Driver 读取输入文件中的内容,输出到指定目录的输出文件中,此时文件中的内容为: Key---输入文件每行内容的起始位置. Value---输入文件每行的原始内 ...

  9. [转]Navicat for oracle 提示 cannot load oci dll,193的解决方法 orcale 11g

    Navicat for oracle 提示 cannot load oci dll,193的解决方法   内网有一台windows server 2012,安装了Navicat 11.1.8 连接or ...

  10. Cisco学习笔记

    目录 1. 路由 1.1 静态路由 1.2 动态路由 2. 访问控制列表 2.1 标准访问控制列表 2.2 扩展访问控制列表 2.3 命名访问控制列表 3. VLAN 3.1 基础知识 3.2 配置实 ...