Struts 04 OGNL的应用案例

任务:

创建业务控制类OgnlAction,测试基本属性、基本方法、类对象、静态属性、静态方法、List列表、Set集合、Map映射等各种类型参数采用OGNL表达式获取的办法。

注意:(在struts2.1.2中不能使用ognl访问静态方法的原因)

在目前的2.1.2及其以上版本要通过ognl访问静态方法,必须在struts.properties或者struts.xml中将选项struts.ognl.allowStaticMethodAccess设置为true

案例实现

1. action类

package com.dhl.beyond.action;

import com.dhl.beyond.javabean.Cat;
import com.dhl.beyond.javabean.Dog;
import com.dhl.beyond.javabean.User;
import com.dhl.beyond.javabean.Static;
import com.opensymphony.xwork2.ActionSupport;

import java.util.*;

public class OgnlAction extends ActionSupport {
    private String username;
    private String password;
    private User user;
    private Cat cat;
    private List<User> users = new ArrayList<User>();
    private Set<Dog> dogs = new HashSet<Dog>();

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public Set<Dog> getDogs() {
        return dogs;
    }

    public void setDogs(Set<Dog> dogs) {
        this.dogs = dogs;
    }

    public Map<String, Dog> getDogMap() {
        return dogMap;
    }

    public void setDogMap(Map<String, Dog> dogMap) {
        this.dogMap = dogMap;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    private Map<String,Dog> dogMap = new HashMap<>();
    public String m(){
        return "actionMethod!";
    }

    public OgnlAction(){
        user = new User();
        username = "DHL";
        password = "123";
        cat = new Cat();
        cat.setFriend(new Dog("dog0"));
        users.add(new User(1));
        users.add(new User(2));
        users.add(new User(3));

        dogs.add(new Dog("dog1"));
        dogs.add(new Dog("dog2"));
        dogs.add(new Dog("dog3"));

        dogMap.put("dog100",new Dog("dog100"));
        dogMap.put("dog101",new Dog("dog101"));
        dogMap.put("dog102",new Dog("dog102"));
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2. javabean

Cat

package com.dhl.beyond.javabean;

public class Cat {
    private Dog friend;
    public String miaomiao(){
        return "miaomiao";
    }

    public Dog getFriend() {
        return friend;
    }

    public void setFriend(Dog friend) {
        this.friend = friend;
    }
}

Dog

package com.dhl.beyond.javabean;

public class Dog {
    private String name;

    @Override
    public String toString() {
        return "dog:" +name;
    }

    public String getName() {
        return name;
    }

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

    public Dog(String name) {
        this.name = name;
    }

    public Dog() {
    }
}

Static

package com.dhl.beyond.javabean;

public class Static {
    public static String STR = "static string!!!";
    public static String s(){
        return "static method!!";
    }
}

User

package com.dhl.beyond.javabean;

public class User {
    private int age = 00;

    public User(int age) {
        this.age = age;
        System.out.println("访问构造方法:age="+age);
    }

    public User() {
    }

    @Override
    public String toString() {
        return "user:" + age;
    }

    public int getAge() {
        return age;
    }

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

3. jsp页面(ognlTest.jsp)

<%--
  Created by IntelliJ IDEA.
  User: DHL
  Date: 2020/6/4
  Time: 0:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>OGNL</title>
</head>
<body>
<s:debug/>
1.访问值栈中action的普通属性:<br>
    username = <s:property value="username" /><br>
    passwrod = <s:property value="password"/>
    <br><br>
2.访问值栈中对象的普通属性:<br>
    age = <s:property value="user.age"/>
<br><br>
3.访问值栈中对象普通属性:<br>
cat.friend.name = <s:property value="cat.friend.name"/>
<br><br>
4.访问值栈中对象的普通方法:<br>
password.length()= <s:property value="password.length()"/>
<br><br>
5.访问值栈中对象的普通方法:<br>
cat.miaomiao()= <s:property value="cat.miaomiao()"/>
<br><br>
6.访问action中的普通方法<br>
m()=<s:property value="m()"/>
<br><br>
<hr color="red" width="100%"/>
7.访问静态属性:<br>
<s:property value="@com.dhl.beyond.javabean.Static@STR"/>
<br><br>
8.访问静态方法:(*)<br>
<s:property value="@com.dhl.beyond.javabean.Static@s()"/>
<br><br>
9.访问Math类的静态方法:(*)<br>
5和10的最大值:<s:property value="@@max(5,10)"/>
<br><br>
<hr color="red" width="100%"/>
10.访问普通类的构造方法:<br>
<s:property value="new com.dhl.beyond.javabean.User(20)"/>
<br><br>
11.访问List列表<br>
users= <s:property value="users"/>
<br><br>
12.访问List中某个元素<br>
users[1]=<s:property value="users[1]"/>
<br><br>
13.访问List元素中某个属性的集合<br>
users.{age} =<s:property value="users.{age}"/>
<br><br>
14.访问List元素中某个属性集合的特定值<br>
users.{age}[0] =<s:property value="users.{age}[0]"/>
<br><br>
15.访问Map映射<br>
dogMap = <s:property value="dogMap"/>
<br><br>
16.访问Map映射某个元素<br>
dogMap.dog102=<s:property value="dogMap.dog102"/>
<br><br>
17.访问Map映射所有的key<br>
dogMap.keys = <s:property value="dogMap.keys"/>
<br><br>
18.访问Map映射所有的value<br>
dogMap.values:<s:property value="dogMap.values"/>
<br><br>
19.访问Set集合<br>
dogs=<s:property value="dogs"/>
<br><br>
20.访问Set集合中某一元素<br>
dogs[0]=<s:property value="dogs[0]"/>
<br><br>
21.访问容器的大小<br>
dogMap.size()=<s:property value="dogMap.size()"/><br>
dogs.size()=<s:property value="dogs.size()"/><br>
users.size()=<s:property value="users.size()"/><br>
<br>
22.投影:
<s:property value="users.{?#this.age == 1}[0]" />
<br><br>
23.投影:
<s:property value="users.{?#this.age > 1}.{age}" />
<br><br>
24.投影:
<s:property value="users.{^#this.age >1}.{age}" />
<br><br>
25.投影:
<s:property value="users.{$#this.age > 1}.{age} == null" />
<br><br>
26.跟对象root:
<s:property value="[0].username" />
<br><br>
</body>
</html>

4. 配置文件

strurs.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.devMode" value="true" />
    <!--    允许ognl访问静态方法-->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

    <package name="default" namespace="/" extends="struts-default">
        <action name="ognl" class="com.dhl.beyond.action.OgnlAction">
            <result>/ognlTest.jsp</result>
        </action>
    </package>


</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 配置struts过滤器(拦截所有请求)-->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <!--    struts过滤器 拦截请求的规则-->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

目录结构及所需要jar包

在这里插入图片描述

5. 结果集

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_大木_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值