首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2的OGNL运用

2012-09-21 
struts2的OGNL应用等。大家经常遇到的问题是#、%和$这三个符号的使用。下面我想通过例子讲述这个问题:首先新

struts2的OGNL应用
等。大家经常遇到的问题是#、%和$这三个符号的使用。下面我想通过例子讲述这个问题:

首先新建名为Struts2_OGNL的Web工程,配置开发环境。之前很多朋友在使用Struts 2的过程中都遇到乱码问题。当然乱码问题由来已久,而且涉及多方面的知识,所以并非三言两语可以说明白,而且互联网上也已经有很多这方便的文章,大家可以Google一下。不过,如果你在开发的过程,多注意一下,避免乱码问题也不难。乱码多数是由于编码与解码所使用的方式不同造成的,所以我建议大家将编码方式都设为“utf-8”,如<%@? page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>。另外,在配置web.xml时使用ActionContextCleanUp过滤器(Filter),如下面代码所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
? ? xmlns="http://java.sun.com/xml/ns/j2ee"
? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

? ? <display-name>Struts 2 OGNL</display-name>
? ??
? ? <filter>
? ? ? ? <filter-name>struts-cleanup</filter-name>
? ? ? ? <filter-class>
? ? ? ? ? ? org.apache.struts2.dispatcher.ActionContextCleanUp
? ? ? ? </filter-class>
? ? </filter>
? ??
? ? <filter-mapping>
? ? ? ? <filter-name>struts-cleanup</filter-name>
? ? ? ? <url-pattern>/*</url-pattern>
? ? </filter-mapping>
? ??
? ? <filter>
? ? ? ? <filter-name>struts2</filter-name>
? ? ? ? <filter-class>
? ? ? ? ? ? org.apache.struts2.dispatcher.FilterDispatcher
? ? ? ? </filter-class>
? ? </filter>

? ? <filter-mapping>
? ? ? ? <filter-name>struts2</filter-name>
? ? ? ? <url-pattern>/*</url-pattern>
? ? </filter-mapping>

? ? <welcome-file-list>
? ? ? ? <welcome-file>index.html</welcome-file>
? ? </welcome-file-list>

</web-app>

清单1 WebContent/WEB-INF/web.xml

“#”主要有三种用途:

    访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: ?名称作用例子parameters包含当前HTTP请求参数的Map#parameters.id[0]作用相当于request.getParameter("id")request包含当前HttpServletRequest的属性(attribute)的Map#request.userName相当于request.getAttribute("userName")session包含当前HttpSession的属性(attribute)的Map#session.userName相当于session.getAttribute("userName")application包含当前应用的ServletContext的属性(attribute)的Map#application.userName相当于application.getAttribute("userName")attr用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止用于过滤和投影(projecting)集合,如books.{?#this.price<100}; 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

下面让我们它们的具体写法,首先是Action类代码:

struts2的OGNL运用package tutorial.action;
struts2的OGNL运用
struts2的OGNL运用import java.util.LinkedList;
struts2的OGNL运用import java.util.List;
struts2的OGNL运用import java.util.Map;
struts2的OGNL运用
struts2的OGNL运用import javax.servlet.ServletContext;
struts2的OGNL运用import javax.servlet.http.HttpServletRequest;
struts2的OGNL运用
struts2的OGNL运用import org.apache.struts2.interceptor.ServletRequestAware;
struts2的OGNL运用import org.apache.struts2.interceptor.SessionAware;
struts2的OGNL运用import org.apache.struts2.util.ServletContextAware;
struts2的OGNL运用
struts2的OGNL运用import tutorial.model.Book;
struts2的OGNL运用
struts2的OGNL运用import com.opensymphony.xwork2.ActionSupport;
struts2的OGNL运用
struts2的OGNL运用struts2的OGNL运用public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware ?struts2的OGNL运用{
struts2的OGNL运用 ? ?private static final long serialVersionUID = 1L;
struts2的OGNL运用 ? ?
struts2的OGNL运用 ? ?private HttpServletRequest request;
struts2的OGNL运用 ? ?private Map<String, String> session;
struts2的OGNL运用 ? ?private ServletContext application;
struts2的OGNL运用 ? ?private List<Book> books;
struts2的OGNL运用 ? ? ? ? ? ?
struts2的OGNL运用struts2的OGNL运用 ? ?public void setServletRequest(HttpServletRequest request) struts2的OGNL运用{
struts2的OGNL运用 ? ? ? ?this.request = request; ? ?
struts2的OGNL运用 ? ?}
struts2的OGNL运用
struts2的OGNL运用 ? ?@SuppressWarnings("unchecked")
struts2的OGNL运用struts2的OGNL运用 ? ?public void setSession(Map session) struts2的OGNL运用{
struts2的OGNL运用 ? ? ? ?this.session = session; ? ? ? ?
struts2的OGNL运用 ? ?}
struts2的OGNL运用
struts2的OGNL运用struts2的OGNL运用 ? ?public void setServletContext(ServletContext application) struts2的OGNL运用{
struts2的OGNL运用 ? ? ? ?this.application = application;
struts2的OGNL运用 ? ?}
struts2的OGNL运用 ? ?
struts2的OGNL运用struts2的OGNL运用 ? ?public List<Book> getBooks() struts2的OGNL运用{
struts2的OGNL运用 ? ? ? ?return books;
struts2的OGNL运用 ? ?}
struts2的OGNL运用
struts2的OGNL运用 ? ?@Override
struts2的OGNL运用struts2的OGNL运用 ? ?public String execute() struts2的OGNL运用{
struts2的OGNL运用 ? ? ? ?request.setAttribute("userName", "Max From request");
struts2的OGNL运用 ? ? ? ?session.put("userName", "Max From session");
struts2的OGNL运用 ? ? ? ?application.setAttribute("userName", "Max From application");
struts2的OGNL运用 ? ? ? ?
struts2的OGNL运用 ? ? ? ?books = new LinkedList<Book>();
struts2的OGNL运用 ? ? ? ?books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
struts2的OGNL运用 ? ? ? ?books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));
struts2的OGNL运用 ? ? ? ?books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
struts2的OGNL运用 ? ? ? ?books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
struts2的OGNL运用 ? ? ? ?books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
struts2的OGNL运用 ? ? ? ?
struts2的OGNL运用 ? ? ? ?return SUCCESS;
struts2的OGNL运用 ? ?}
struts2的OGNL运用}

清单2 src/tutorial/action/OgnlAction.java

以上代码分别在request、session和application的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。我还创建了Book对象的列表用于演示“用于过滤和投影(projecting)集合”的功能,至于Book的代码大家可以在我前一文章《在Struts 2中实现CRUD》看到。

下面是Ognl.jsp的代码,内容如下:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!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>
? ? <title>Struts OGNL Demo</title>
</head>
<body> ? ?
? ? <h3>访问OGNL上下文和Action上下文</h3>
? ? <p>parameters: <s:property value="#parameters.userName" /></p>
? ? <p>request.userName: <s:property value="#request.userName" /></p>
? ? <p>session.userName: <s:property value="#session.userName" /></p>
? ? <p>application.userName: <s:property value="#application.userName" /></p>
? ? <p>attr.userName: <s:property value="#attr.userName" /></p>
? ? <hr />
? ? <h3>用于过滤和投影(projecting)集合</h3>
? ? <p>Books more than $35</p>
? ? <ul>
? ? ? ? <s:iterator value="books.{?#this.price > 35}">
? ? ? ? ? ? <li><s:property value="title" /> - $<s:property value="price" /></li>
? ? ? ? </s:iterator>
? ? </ul>
? ? <p>The price of "Code Complete, Second Edition" is: <s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/></p>
? ? <hr />
? ? <h3>构造Map</h3>
? ? <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
? ? <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>
</body>
</html>

清单3 WebContent/Ognl.jsp

以上代码值得注意的是“<s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/>”,因为“books.{?#this.title=='Code Complete, Second Edition'}.{price}”返回的值是集合类型,所以要用“[索引]”来访问其值。

最后是Struts 2的配置文件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.devMode" value="true" />
? ? <package name="Struts2_OGNL_DEMO" extends="struts-default">
? ? ? ? <action name="Ognl" class="tutorial.action.OgnlAction">
? ? ? ? ? ? <result>/Ognl.jsp</result>
? ? ? ? </action> ? ? ? ?
? ? </package>
</struts>

清单4 src/struts.xml

发布运行应用程序,结果如下所示:

struts2的OGNL运用
清单5 示例运行结果1

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:

<hr />
? ? <h3>%的用途</h3>
? ? <p><s:url value="#foobar['foo1']" /></p>
? ? <p><s:url value="%{#foobar['foo1']}" /></p>

清单6 演示%用途的代码片段

刷新页面,结果如下所示:

struts2的OGNL运用清单7 示例运行结果2

“$”有两个主要的用途

    用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》 在Struts 2配置文件中,引用OGNL表达式,如<action name="AddPhoto" class="addPhoto">
    ? ? ? ? ? ? <interceptor-ref name="fileUploadStack" /> ? ? ? ? ? ?
    ? ? ? ? ? ? <result type="redirect">ListPhotos.action?albumId=${albumId}</result>
    ? ? ? ? </action>清单8 演示$用途的代码片段
总结

OGNL是一种功能很大的表达式语言,熟悉它可以使我们的开发变得更快捷。

热点排行