概述
2013年2月19日 天气晴
Struts 2 第19part OGNL 表达式的初步使用
新的一part,OGNL表达式的学习,这里只是为了说明什么是OGNL表达式,OGNL用在什么位置,怎么使用这些问题?
那么,OGNL的全称是什么?
Object Graph Navigation Language 对象图导航语言
OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:
- 属性名称(property)
- 方法调用(method invoke)
- 数组元素
所有的OGNL表达式都基于当前对象的上下文来完成求值运算,链的前面部分的结果将作为后面求值的上下文。
关于OGNL可不是一个能简单介绍完的东西,但使用起来确实是比较爽的。
具体怎么用,下面例子,看完之后就能知道一二了。
实例:/Struts2_OGNL
我们要得到的效果如下图,内容稍微多一点,不过都不难。
看到上面的结果,一下子可能就懵了,但没有说一下子把所有结果都能显示出来,一条一条来试,当然小巫已经试过了,就不再这里再一条条来写。直接给出源代码。
- <?xml version="1.0" encoding="GB18030" ?>
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
- <title>OGNL表达式语言学习</title>
- </head>
- <body>
- <ol>
- <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
- <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user["age"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
- <li>访问值栈中对象的普通属性(get set方法):<s:property value="cat.friend.name"/></li>
- <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
- <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()"/></li>
- <li>访问值栈中action的普通方法:<s:property value="m()"/></li>
- <hr/>
- <li>访问静态方法:<s:property value="@com.wwj.struts2.ognl.S@s()"/></li>
- <li>访问静态属性:<s:property value="@com.wwj.struts2.ognl.S@STR"/></li>
- <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
- <hr/>
- <li>访问普通类的构造方法:<s:property value="new com.wwj.struts2.ognl.User(8)"/></li>
- <hr/>
- <li>访问List:<s:property value="users"/></li>
- <li>访问List中某个元素:<s:property value="users[1]"/></li>
- <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
- <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
- <li>访问Set:<s:property value="dogs"/></li>
- <li>访问Map:<s:property value="dogMap"/></li>
- <li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap["dog101"]"/></li>
- <li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
- <li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
- <li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
- <hr/>
- <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
- <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
- <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
- <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
- <hr />
- <li>[]:<s:property value="[0].username"/></li>
- </ol>
- <s:debug></s:debug>
- </body>
- </html>
再来看看项目结构:
整个项目执行流程:从index.jsp开始->struts.xml->Action类->struts.xml->ognl.jsp
index.jsp
- <body>
- 访问属性
- <a href="<%=contextPath %>/ognl.action?username=u&password=p">ognl</a>
- </body>
struts.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.enable.DynamicMethodInvocation" value="false" />
- <constant name="struts.devMode" value="true" />
- <!-- 允许访问静态方法 -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
- <include file="/com/wwj/struts2/ognl/ognl.xml"/>
- </struts>
包含进来的ognl.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>
- <package name="ognl" extends="struts-default">
- <action name="ognl" class="com.wwj.struts2.ognl.OgnlAction">
- <result>/ognl.jsp</result>
- </action>
- </package>
- </struts>
OgnlAction.java
- package com.wwj.struts2.ognl;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import com.opensymphony.xwork2.ActionSupport;
- public class OgnlAction extends ActionSupport {
- //1.普通属性
- private String username;
- private String password;
- //2.对象
- private User user;
- //3.对象
- private Cat cat;
- private List<User> users = new ArrayList<User>();
- private Set<Dog> dogs = new HashSet<Dog>();
- private Map<String, Dog> dogMap = new HashMap<String, Dog>();
- public OgnlAction() {
- 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 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;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public Cat getCat() {
- return cat;
- }
- public void setCat(Cat cat) {
- this.cat = cat;
- }
- //action的普通方法
- public String m() {
- return "hello";
- }
- 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 Map<String, Dog> getDogmap() {
- return dogMap;
- }
- public void setDogmap(Map<String, Dog> dogmap) {
- this.dogMap = dogmap;
- }
- @Override
- public String execute() throws Exception {
- // TODO Auto-generated method stub
- return SUCCESS;
- }
- }
User.java
- package com.wwj.struts2.ognl;
- public class User {
- private int age = 8;
- //必须要有这个默认构造方法
- public User() {
- super();
- }
- public User(int age) {
- super();
- this.age = age;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "user" + age;
- }
- }
Cat.java
- package com.wwj.struts2.ognl;
- public class Cat {
- private Dog friend;
- public Dog getFriend() {
- return friend;
- }
- public void setFriend(Dog friend) {
- this.friend = friend;
- }
- public String miaomiao() {
- return "miaomiao";
- }
- }
Dog.java
- package com.wwj.struts2.ognl;
- public class Dog {
- private String name;
- public Dog() {
- super();
- }
- public Dog(String name) {
- super();
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Dog [name=" + name + "]";
- }
- }
S.java
- package com.wwj.struts2.ognl;
- public class S {
- public static String STR = "STATIC STRING";
- public static String s() {
- return "static method";
- }
- }
整个项目的代码贴放完毕,关于OGNL这一part的学习,就这么多。不多说了。
转载于:https://blog.51cto.com/wwj9520/1135341
最后
以上就是愉快水池为你收集整理的Struts 2 第19part OGNL 表达式的初步使用的全部内容,希望文章能够帮你解决Struts 2 第19part OGNL 表达式的初步使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复