zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    实验综合-2021.1.31
    利用文件上传漏洞远程控制服务器
    [转载]文件上传漏洞
    第五周学习视频(二)
    第五周学习视频(一)
    第四周——上课笔记(二)
    第四周——上课笔记(一)
    第四周学习视频(一)
    mooc视频笔记(哈工大)第4讲-关系模型之关系代数
    第三周学习视频(二)
  • 原文地址:https://www.cnblogs.com/xdzy/p/9994791.html
Copyright © 2011-2022 走看看