文章目录
任务:
创建业务控制类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>