Struts2 值栈和OGNL 的使用

一、值栈简介:

值栈是对应每个请求对象的一套内存数据的封装,Struts2 会给每个请求创建一个新的值栈。
值栈能够线程安全地为每个请求提供公共的数据存取服务。

二、OGNL引入:

OGNL 是对象图导航语言 Object-Graph Navigation Language 的缩写,它是一种功能强大的表达式语言。
OGNL 访问 ValueStack 数据
<s:property value=”account” />
OGNL 访问 ActionContext 数据
访问某个范围下的数据要用#
#parameters 请求参数 request.getParameter(...);
#request 请求作用域中的数据 request.getAttribute(...);
#session 会话作用域中的数据 session.getAttribute(...);
#application 应用程序作用域中的数据 application.getAttribute(...);
#attr 按照 page request session application 顺序查找值

om.cy.action.HelloAction.java:

package com.cy.action;

import java.util.Map;

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

public class HelloAction extends ActionSupport{
    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {
        ActionContext actionContext = ActionContext.getContext();
        ValueStack valueStack = actionContext.getValueStack();
        valueStack.set("name", "张三(valueStack)");
        valueStack.set("age", 11);
        
        Map<String, Object> session = actionContext.getSession();
        session.put("name", "王五(session)");
        session.put("age", 13);
        
        Map<String, Object> application = actionContext.getApplication();
        application.put("name", "赵六(application)");
        application.put("age", 14);
        
        return SUCCESS;
    }
    
}

struts.xml:

扫描二维码关注公众号,回复: 5809962 查看本文章
<struts>
    
    <package name="manage" namespace="/" extends="struts-default">
        <action name="hello" class="com.cy.action.HelloAction">
            <result name="success">success.jsp</result>
        </action>
                    
    </package>
    
</struts>

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
    request.setAttribute("name", "李四(request)");
    request.setAttribute("age", 12);
    

   // pageContext.setAttribute("name", "小沛(page)");
    //pageContext.setAttribute("age", "18");
%>
</head>
<body>
    获取狭义上的值栈数据:<s:property value="name"/>
    <s:property value="age"/><br>    
    请求参数:<s:property value="#parameters.name"/>
    <s:property value="#parameters.age"/><br>
    request:<s:property value="#request.name"/>
    <s:property value="#request.age"/><br>
    session:<s:property value="#session.name"/>
    <s:property value="#session.age"/><br>
    application:<s:property value="#application.name"/>
    <s:property value="#application.age"/><br>
    attr取值:<s:property value="#attr.name"/>
    <s:property value="#attr.age"/><br>
</body>
</html>

测试结果:

说明如果不注释掉

ActionContext actionContext = ActionContext.getContext(); ValueStack valueStack = actionContext.getValueStack();

valueStack.set("name", "张三(valueStack)");

valueStack.set("age", 11);这段代码的attr取值为张三(valueStack),11

然后不注释掉

 pageContext.setAttribute("name", "小沛(page)");

pageContext.setAttribute("age", "18");这段代码的话attr取值位小沛(page),18

 三、OGNL访问复杂对象:

1,访问 javaBean 对象;
2,访问集合对象;
3,访问 Map 对象

第四节:OGNL 访问静态方法和属性

1,访问静态属性;
2,访问静态方法;<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
    request.setAttribute("name", "李四(request)");
    request.setAttribute("age", "12");
%>
</head>
<body>
获取狭义上的值栈数据:<s:property value="name"/>
<s:property value="age"/><br/>
请求参数:<s:property value="#parameters.name"/>
<s:property value="#parameters.age"/><br/>
request:<s:property value="#request.name"/>
<s:property value="#request.age"/><br/>
session:<s:property value="#session.name"/>
<s:property value="#session.age"/><br/>
application:<s:property value="#application.name"/>
<s:property value="#application.age"/><br/>
attr取值:<s:property value="#attr.name"/>
<s:property value="#attr.age"/><br/>
ognl访问javaBean对象:<s:property value="student.name"/>
<s:property value="student.age"/><br/>
ognl访问List集合:<s:property value="students[0].name"/>
<s:property value="students[0].age"/><br/>
<s:property value="students[1].name"/>
<s:property value="students[1].age"/><br/>
ognl访问Map:<s:property value="studentMap['goodStudent'].name"/>
<s:property value="studentMap['goodStudent'].age"/><br/>
<s:property value="studentMap['badStudent'].name"/>
<s:property value="studentMap['badStudent'].age"/><br/>
</body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    
  <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 
  
  <package name="manage" namespace="/" extends="struts-default">
      
      <action name="hello" class="com.java1234.action.HelloAction">
          <result name="success" >success.jsp</result>
      </action>
  </package>

</struts>

Student.java

package com.java1234.model;

public class Student {

    private String name;
    private int age;
    
    
    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
}

HelloAction.java

package com.java1234.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.java1234.model.Student;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class HelloAction extends ActionSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    private Student student;
    
    private List<Student> students;
    
    private Map<String,Student> studentMap;
    
    
    

    public Map<String, Student> getStudentMap() {
        return studentMap;
    }

    public void setStudentMap(Map<String, Student> studentMap) {
        this.studentMap = studentMap;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public String execute() throws Exception {
        ActionContext actionContext=ActionContext.getContext();
        // 获取狭义上的值栈
        ValueStack valueStack=actionContext.getValueStack();
        valueStack.set("name", "张三(valueStack)");
        valueStack.set("age", 11);
        
        Map<String, Object> session=actionContext.getSession();
        session.put("name", "王五(session)");
        session.put("age", 13);
        
        Map<String, Object> application=actionContext.getApplication();
        application.put("name", "赵六(application)");
        application.put("age", 14);
        
        student=new Student("小扒", 12);
        
        students=new ArrayList<Student>();
        students.add(new Student("老九",13));
        students.add(new Student("老十",14));
        
        studentMap=new HashMap<String,Student>();
        studentMap.put("goodStudent", new Student("学霸",20));
        studentMap.put("badStudent", new Student("学渣",19));
        return SUCCESS;
    }
    
}

输出结果


struts.xml配置,开启ognl允许访问静态方法:

 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

package com.java1234.common;

public class MyStatic {

    public static final String str="Java知识分享网";
    
    public static String printUrl(){
        System.out.println("http://www.java1234.com");
        return "http://www.java1234.com";
    }
}
 

ognl_static.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
访问静态属性: <s:property value="@com.java1234.common.MyStatic@str"/><br/>
访问静态方法:<s:property value="@com.java1234.common.MyStatic@printUrl()"/>
</body>
</html>

直接在下面的网址中输入下面的url

猜你喜欢

转载自blog.csdn.net/qq_40135955/article/details/89086638
今日推荐