Struts框架笔记03_OGNL表达式与值栈

2019-04-30  本文已影响0人  itzhouq的笔记
结构图

1. OGNL

1.1 OGNL概述

1.1 什么是OGNL

1.1.2 OGNL的优势

1.1.2 OGNL使用的要素

1.2 OGNL的Java环境入门【了解】

1.2.1 访问对象的方法

@Test   // OGNL调用对象的方法
public void test1() throws OgnlException {
    // 获得context
    OgnlContext context = new OgnlContext();
    // 获得根对象
    Object root = context.getRoot();
    // 执行表达式
    Object object = Ognl.getValue("'helloworld'.length()", context, root);
    System.out.println(object);//10
}

1.2.2 访问对象的静态方法

@Test   // OGNL访问对象的静态方法
public void test2() throws OgnlException {
    // 获得context
    OgnlContext context = new OgnlContext();
    // 获得根对象
    Object root = context.getRoot();
    // 执行表达式@类名@方法名
    Object object = Ognl.getValue("@java.lang.Math@random()", context, root);
    System.out.println(object);// 0-1的随机数
}

1.2.3 获得Root中的数据

@Test   // 访问Root中的数据,不需要加#
public void test3() throws OgnlException {
    // 获得context
    OgnlContext context = new OgnlContext();
    // 执行表达式
    User user = new User("aaa", "123");
    context.setRoot(user);
    // 获得根对象
    Object root = context.getRoot();
    Object username = Ognl.getValue("username", context,root);
    Object password = Ognl.getValue("password", context,root);
    System.out.println(username+"   "+password);
}

1.2.4 获得OgnlContext中的数据

@Test   // 访问Context中的数据,需要加#
    public void test4() throws OgnlException {
    // 获得context
    OgnlContext context = new OgnlContext();
    // 获得根对象
    Object root = context.getRoot();
    // 向context中存入数据
    context.put("name", "张三");
    // 执行表达式
    Object object = Ognl.getValue("#name", context, root);
    System.out.println(object);
}

1.3 OGNL的Struts2的环境入门

1.3.1 访问对象的方法

<!-- 配置核心过滤器 -->
  <filter>
    <filter-name>struts</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts</filter-name>  
    <url-pattern>/*</url-pattern>
  </filter-mapping>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"  prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>OGNL在Struts2环境中的入门</h1>
<h3>调用对象的方法</h3>
<s:property value="'struts'.length()"/>
</body>
</html>

1.3.2 访问对象的静态方法

<struts>
    <!-- 开启静态方法 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
</struts>
<h1>OGNL在Struts2环境中的入门</h1>
<h3>调用对象的方法</h3>
<s:property value="'struts'.length()"/>

<h3>调用对象的静态方法</h3>
<!-- 静态方法访问在Struts2中默认是关闭的,需要手动开启一个常量 -->
<s:property value="@java.lang.Math@random()"/>

2. 值栈

2. 1什么是值栈

2.2 值栈的内部结构

值栈的内部结构

2.3 值栈与ActionContext的关系

2.4 获得值栈

package com.itzhouq.struts.valueStack;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

/**
 *  获得值栈的方式
 * @author itzhouq
 *
 */
public class ValueStackDemo1 extends ActionSupport {
    @Override
    public String execute() throws Exception {
        // 方式一:
        ValueStack valueStack1 = ActionContext.getContext().getValueStack();
        
        // 方式二:
        ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
        
        // 一个Action的实例,只会创建一个ValueStack的对象
        System.out.println(valueStack1 == valueStack2);//true
        return NONE;
    }
}

2.5 操作值栈

2.5.1 方式一:在Action中提供属性的get方法的方式

2.5.2 使用ValueStack中本身的方法的方式

2.6 获得值栈数据

2.7 EL为何能访问值栈的数据

3. OGNL中的特殊字符

3.1 #号

3.1.1 获取context的数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"  prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>#的用法</h1>
<%
    request.setAttribute("name", "李斌");
%>
<s:property value="#request.name"/>
<hr>

</body>
</html>

3.1.2 使用#号构建Listmap集合

<h3>构建list集合</h3>
<s:iterator var="i" value="{'aa','bb','cc'}">
    <s:property value="i"/> -- <s:property value="#i"/> <br>
</s:iterator>

<h3>构建Map集合1</h3>
<s:iterator value="#{'aa':'11111', 'bb':'22222', 'cc':'33333' }">
    <s:property value="key"/>--<s:property value="value"/><br>
</s:iterator>

<h3>构建Map集合2</h3>
<s:iterator var="entry" value="#{'aa':'11111', 'bb':'22222', 'cc':'33333' }">
    <s:property value="#entry.key"/>--<s:property value="#entry.value"/><br>
</s:iterator>

<h3>实例1</h3>
<s:radio list="{'男', '女' }" name="sex1" label="性别"/><br>
<h3>实例2</h3>
<s:radio list="#{'1':'男','2': '女' }" name="sex2" label="性别"/>

3.2 %号

3.3 $号

上一篇 下一篇

猜你喜欢

热点阅读