Struts2进阶学习3

Struts2进阶学习3

OGNL表达式与Struts2的整合

核心配置文件与页面

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

    <package name="show" namespace="/" extends="struts-default" >
        <action name="ShowAction" class="com.struts2.action.ShowAction" method="execute" >
            <result name="success" type="dispatcher" >/show.jsp</result>
        </action>

        <action name="ShowAction2" class="com.struts2.action.ShowAction" method="getParam" >
            <result name="success" type="dispatcher" >/form.jsp</result>
        </action>

        <action name="redirect" class="com.struts2.action.RedirectAction" method="redirect" >
            <result name="success" type="redirectAction" >
                <param name="namespace">/</param>
                <param name="actionName">ShowAction</param>
                <!-- 路径携带参数;以及利用OGNL表达式动态绑定参数 -->
                <param name="name">${name}</param>
            </result>
        </action>
    </package>

</struts>
struts.xml
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/ShowAction">
        name:<input type="text" name="name"/><br>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
form
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<s:debug></s:debug>
</body>
</html>
show
package com.struts2.pojo;

/**
 * @author: 肖德子裕
 * @date: 2018/11/20 21:05
 * @description:
 */
public class User {
    private String name;
    private Integer age;

    /**
     * 回音方法:传什么值返回什么值,一般用于测试
     * @param o
     * @return
     */
    public static Object test(Object o){
        return o;
    }

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
User

OGNL表达式基本语法

package com.struts2.ognl;

import com.struts2.pojo.User;
import ognl.Ognl;
import ognl.OgnlContext;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: 肖德子裕
 * @date: 2018/11/20 21:03
 * @description: 测试OGNL表达式(对象视图导航语言),支持比EL表达式更丰富的语法
 */
public class Demo {
    /**
     * OGNL基本语法
     * @throws Exception
     */
    @Test
    public void test() throws Exception{
        //准备Root(可放置任意对象)
        User rootUser=new User("xdzy",18);
        //准备Context(放置map)
        Map<String,User> context=new HashMap<String,User>();
        context.put("user1",new User("jack",17));
        context.put("user2",new User("rose",27));
        //准备OGNLContext
        OgnlContext oc=new OgnlContext();
        oc.setRoot(rootUser);
        oc.setValues(context);

        //书写OGNL
        //获取rootUser的name和age(第一个参数就是OGNL的语法)
        String rootName = (String) Ognl.getValue("name", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("age", oc, oc.getRoot());
        System.out.println(rootName);
        System.out.println(age);

        //获取context的name与age
        String name = (String) Ognl.getValue("#user1.name", oc, oc.getRoot());
        System.out.println(name);

        //对rootUser属性进行赋值
        String rootName1 = (String) Ognl.getValue("name='张三'", oc, oc.getRoot());
        System.out.println(rootName1);

        //对context属性进行赋值
        String name1 = (String) Ognl.getValue("#user1.name='李四'", oc, oc.getRoot());
        System.out.println(name1);

        //调用rootUser的属性方法
        Ognl.getValue("setName('王五')", oc, oc.getRoot());
        String rootName2 = (String) Ognl.getValue("getName()", oc, oc.getRoot());
        System.out.println(rootName2);

        //调用context的属性方法
        String name2 = (String) Ognl.getValue("#user1.setName('赵六'),#user1.getName()", oc, oc.getRoot());
        System.out.println(name2);

        //调用静态方法;访问静态属性
        String name3 = (String) Ognl.getValue("@com.struts2.pojo.User@test('hello')", oc, oc.getRoot());
        Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc, oc.getRoot());
        System.out.println(name3);
        System.out.println(pi);
    }

    /**
     * OGNL基本语法2
     * @throws Exception
     */
    @Test
    public void test2() throws Exception{
        //准备Root(可放置任意对象)
        User rootUser=new User("xdzy",18);
        //准备Context(放置map)
        Map<String,User> context=new HashMap<String,User>();
        context.put("user1",new User("jack",17));
        context.put("user2",new User("rose",27));
        //准备OGNLContext
        OgnlContext oc=new OgnlContext();
        oc.setRoot(rootUser);
        oc.setValues(context);

        //书写OGNL
        //通过OGNL创建list
        Integer size = (Integer) Ognl.getValue("{'肖','德','子','裕'}.size()", oc, oc.getRoot());
        System.out.println(size);
        //通过OGNL创建map
        Integer size1 = (Integer) Ognl.getValue("#{'name':'xdzy','age':12}.size()", oc, oc.getRoot());
        String name = (String) Ognl.getValue("#{'name':'xdzy','age':12}['name']", oc, oc.getRoot());
        Integer age = (Integer) Ognl.getValue("#{'name':'xdzy','age':12}.get('age')", oc, oc.getRoot());
        System.out.println(size1);
        System.out.println(name);
        System.out.println(age);
    }
}
Demo

测试整合使用

package com.struts2.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.util.ValueStack;
import com.struts2.pojo.User;

/**
 * @author: 肖德子裕
 * @date: 2018/11/21 9:40
 * @description: 测试OGNL表达式与struts2结合
 * OGNL表达式的root在struts2中为栈,栈中保存的是当前访问的action
 * 队列:先进先出;栈:先进后出(list)
 * OGNL表达式的root在struts2中为ActionContext
 * implements Preparable:在参数赋值之前实现
 */
public class ShowAction extends ActionSupport  implements ModelDriven<User> {
    /**
     * 重写默认方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {
        System.out.println("hello action");
        return SUCCESS;
    }

    private User user=new User();

    /**
     * 如果在参数赋值之前压栈,将无法获取参数值
     * @return
     */
    public String getParam(){
        System.out.println(user);
        return SUCCESS;
    }

    /**
     * 该拦截器在参数赋值之前实现,所以可以获取参数值
     * @throws Exception
     */
    /*@Override
    public void prepare() throws Exception {
        //获取值栈
        ValueStack stack = ActionContext.getContext().getValueStack();
        //压入栈顶
        stack.push(user);
    }*/

    @Override
    public User getModel() {
        return user;
    }
}
ShowAction
package com.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author: 肖德子裕
 * @date: 2018/11/21 10:40
 * @description: 重定向时携带参数
 */
public class RedirectAction extends ActionSupport {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String redirect(){
        name="xdzy";
        return SUCCESS;
    }
}
RedirectAction
原文地址:https://www.cnblogs.com/xdzy/p/9994791.html