• ognl


    一:什么是值栈

    1:ValueStack:值栈。其本身的数据结构是一个栈,使用者可以把一些对象存入栈中。然后使用动态的表达式来读取bean的属性。由于值栈中可能有多个对象

    值栈会按照对象出栈的顺序依次尝试使用动态的表达式来读取值,知道成功读取值为止。struts2默认使用的是OgnlValueStack,即使用ognl这个动态表达式语言来读取值。

    2:在Struts2执行一次请求的过程中,Struts2会把当前的Action对象自动放入值栈。这样,在渲染JSP时,JSP里的代码使用<s:property value="..."/>之类标签中的Ognl表达式

    会直接作用于Action对象,从而方便的读取Action的属性。

    二:如何获得值栈

    1.1在自定义的拦截器中,使用ActionInvocation.getStack()方法。(ActionInvocation是拦截器的方法参数)

    1.2在Action类中,让拦截器植入ValueStack或者使用ActionContext.getContext().getValueStack()来获取值栈。

    注意:使用ActionContext分配的context的方式是基于线程的,如果使用这种方法,请确保其不出错!

    1.3在jsp中,可以使用标签即可获取栈值栈中的数据!

    三:如何将对象存入值栈

    1.struts2自动存入Action:之前提到,,Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中。

    2.ModelDrivenInterceptor会存入Action的model属性:如果你使用了Struts2提供的 ModelDrivenInterceptor,则它会把Action对象的getModel()方法得到的对象存入值栈中。此时,值栈最底层为Action类,其次为这个model。

    3.在自定义的拦截器中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。

    4.在Action类中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。

    5.在JSP中存入值栈:标签<s:push value="..."></s:push>是专门用来在JSP中把指定的value放入值栈的,但value被放入值栈的时间仅在s:push标签内,即程序运行到</s:push>标签处会把value从值栈中移出。另外,还有一些标签比如<s:iterator/>由于其功能的需要也会把一些对象放到值栈中。

    代码如下:

    通过调试可以发现其中的root对象是以ArrayList的方式存入user对象的!

    Stack Context中的数据则存放在Context中其是以map集合的形式来存放数据的。在是用OGNL表达式来访问时需要加上“#”作为前缀。

    使用ognl表达式:

    1)“#”符号有三种用途

    a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

    名称   作用域 

    eg:

    1-1)parameters :包含当前HTTP请求参数的Map

    #parameters.id[0]=>作用相当于request.getParameter("id")

     

    1-2)request:包含当前HttpServletRequest的属性(attribute)的Map

    #request.userName=>作用相当于request.getAttribute("userName");

     

    1-3)session:包含当前HttpSession属性(attribute)的Map

    #session.userName=>session.getAttribute("userName");

     

    1-4)application:包含当前应用的ServletContext的属性(attribute)的Map

    #application.userName=>application.getAttribute("userName");

    演示案例:(省略javabean)

    1:原始类型和包装类型

    action类

    private User user;
        private String message;
        public String execute(){
            setUser(new User());
            getUser().setName("jbit");
            getUser().setAge(23);
            Address address=new Address();
            address.setCountry("中国");
            address.setCity("北京");
            address.setStreet("长安街");
            getUser().setAddress(address);
            setMessage("展示原始类型和JavaBean");
            return SUCCESS;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }

    展示数据的result.jsp页面

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'result.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
           信息:<s:property value="message" default="展示数据" /><br/>
           姓名:<s:property value="user.name" /><br/>
           年龄:<s:property value="user.age"  /><br/>
          国家:<s:property value="user.address.country" />
      </body>
    </html>

    2:多值类型的数据处理

    action类代码:(数组)

        private String[] hobbies;
        private Double[] numbers=new Double[3];
        
        public String execute(){
            System.out.println("hobbies的长度是"+hobbies.length);
            for(int i=0;i<hobbies.length;i++){
                System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies[i]);
            }
            System.out.println("numbers的长度是"+numbers.length);
            for(int i=0;i<numbers.length;i++){
                System.out.println("numbers数组中第"+i+"个元素是:"+numbers[i]);
            }
            
            return SUCCESS;
        }
        public String[] getHobbies() {
            return hobbies;
        }
        public void setHobbies(String[] hobbies) {
            this.hobbies = hobbies;
        }
        public Double[] getNumbers() {
            return numbers;
        }
        public void setNumbers(Double[] numbers) {
            this.numbers = numbers;
        }

    action类代码:泛型

    private List<String> hobbies;
        private List<Double> numbers;
        private List<User> users;
        
        public String execute(){
            System.out.println("hobbies的长度是"+hobbies.size());
            for(int i=0;i<hobbies.size();i++){
                System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies.get(i));
            }
            System.out.println("numbers的长度是"+numbers.size());
            for(int i=0;i<numbers.size();i++){
                System.out.println("numbers数组中第"+i+"个元素是:"+numbers.get(i));
            }
            System.out.println("users的长度是"+users.size());
            for(int i=0;i<users.size();i++){
                System.out.println("users数组中第"+i+"个元素是:"+users.get(i).getName());
            }
            return SUCCESS;
        }
        public List<String> getHobbies() {
            return hobbies;
        }
        public void setHobbies(List<String> hobbies) {
            this.hobbies = hobbies;
        }
        public List<Double> getNumbers() {
            return numbers;
        }
        public void setNumbers(List<Double> numbers) {
            this.numbers = numbers;
        }
        public List<User> getUsers() {
            return users;
        }
        public void setUsers(List<User> users) {
            this.users = users;
        }

    array.jsp展示数据

    <body>
        <s:form action="ArraysDataTransfer.action">
            <s:textfield name="hobbies" label="爱好:"/>
            <s:textfield name="hobbies" label="爱好:"/>
            <s:textfield name="hobbies" label="爱好:"/>
            
            <s:textfield name="numbers[0]" label="数字:"/>
            <s:textfield name="numbers[1]" label="数字:"/>
            <s:textfield name="numbers[2]" label="数字:"/>
            <s:submit value="提交"/>
        </s:form>
      </body>

    list.jsp展示数据

    <body>
        <s:form action="listDataTransfer">
            <s:textfield name="hobbies" label="爱好:"/>
            <s:textfield name="hobbies" label="爱好:"/>
            <s:textfield name="hobbies" label="爱好:"/>
            
            <s:textfield name="numbers[0]" label="数字:"/>
            <s:textfield name="numbers[1]" label="数字:"/>
            <s:textfield name="numbers[2]" label="数字:"/>
            
            <s:textfield name="users.name" label="姓名:"/>
            <s:textfield name="users.name" label="姓名:"/>
            <s:textfield name="users.name" label="姓名:"/>
            <s:submit value="提交"/>
        </s:form>
      </body>
  • 相关阅读:
    CH和CN图标去除及语言栏变短
    vim命令学习总结
    《Applications=Code+Markup》读书札记(2)——创建一个简单的 WPF 程序的代码结构及关于 Window 实例位置设置问题
    linux 开机时自动挂载分区
    Windows/linux双系统的时间修改问题
    关于RHEL6.1你可能想知道的那点事
    C语言的重要概念
    sprintf你知道多少
    《Applications=Code+Markup》读书札记(1)——一个简单的 WPF 程序
    Linux命令——tar
  • 原文地址:https://www.cnblogs.com/chimingyang/p/5942457.html
Copyright © 2020-2023  润新知