`
hilliate
  • 浏览: 135107 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使用struts2中的ognl表达式显示数据表字典项的值

    博客分类:
  • Java
阅读更多

在数据库的设计中,字典项是经常使用的技巧。
比如在一个图书馆系统中,书籍表(Book)会有一个分类字段,这时候我们一般会单独建立一张分类表(Category),在书籍表只保存分类表的ID。
在用户界面上显示书籍明细的时候,会要求显示CategoryID在Category表中对应的名称。
这样通常的做法是把Book和Category两张表进行关联。
但在实际应用中,Category一般都是Cache在应用服务器端,再使用数据表的连接就不够高效。
我的做法是这样的:在iBatis中使用SqlMap从表中将数据取出,此时不使用数据表的连接。

<!---->package com.demo;
public class Book {
      
/* 省略了getter和setter方法 */
        private int id;
        
private String name;
        
private int categoryId;
        
private String author;
}


<!---->package com.demo;

public class Category {
       
private static Map<Integer, Category> cacheMap;

        
/* 省略了这两个属性的getter和setter方法 */

        
private int id;
        
private String name;
       
public static Category getCategory(int id) {
             init();
            
return cacheMap.get(id);
        }
 
        
public static Map<Integer, Category> getCategoryMap() {
            init();
           
return cacheMap();
        }

       
private init() {
            
if ( cacheMap != null ) return;

            
// the code to load category from datebase
            
// 在这里为了演示的需要,使用以下代码

             cacheMap 
= new HashMap<Integer, Category>();
             Category category 
= new Category();
             category.setId(
1);
             category.setName(
"Fiction");
             cacheMap.put(
1, category);
 
             category 
= new Category();
             category.setId(
2);
             category.setName(
"Cartoon");
        }
}


<!---->package com.demo;

public class BookAction  {
        
/* 省略了属性的getter和setter方法 */
        Book book;

        
public String execute() {
                book 
= new Book();
                book.setId(
1);
                book.setName(
"Thinking in java");
                book.setCategoryId(
1);
                bookList.add(book);
                
                
return SUCCESS;                
        }
}


JSP:

<!----><%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 
<head>
  
<s:head />
 
</head>

 
<body>

  
<table border="1">
    
<tr>
     
<td>
      
<s:text name="page.label.userName" />
     
</td>
     
<td>
      
<s:property value="book.name" />
     
</td>
    
</tr>
    
<tr>
     
<td>
      
<s:text name="page.label.category" />
     
</td>
     
<td>
       
<s:property value="@com.demo.Category@getCategory(book.categoryId).getName()"/></td>
    
</tr>
 
</body>
</html>

 

 

: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论    2008-03-17 17:57 by 雨奏

@云自无心水自闲

其实如果修改一下Book为

public class Book {
/* 省略了getter和setter方法 */
private int id;
private String name;
private Category category; //Modify code here
private String author;
}

(当然你的action、dao等需要进行相应的修改)

可以考虑在JSP页面中这样访问:

<s:property value="book.category.name"/>

# re: 使用struts2中的ognl表达式显示数据表字典项的值[未登录]  回复  更多评论   

2008-03-17 19:00 by 云自无心水自闲
@雨奏
这篇文章主要就是想利用数据的缓存简化数据存取。
Category这样的缓存方法只是一个示例,其实数据完全可以以其他的方式缓存,这里只是介绍有这么一种方法可以使用。

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-17 21:06 by 长江三峡
学习

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-18 00:12 by Edward's
ognl原来可以这样用啊

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-18 09:37 by 雨奏
@云自无心水自闲
没错,数据缓存方式有多种,你的文章也确实展现了ognl的更多的用法。我只是提出一点个人的看法供参考:就你提供的代码来看,感觉换一种方式似乎更简洁、更易理解一点

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-18 09:59 by hejianhuacn
webwork2 里也支持“@com.demo.Category@getCategory(book.categoryId).getName()"的语法?看来要试一下了

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-18 20:55 by 云自无心水自闲
@雨奏
想请教一下,你准备如何修改action和Dao? 
即如何获得book实例中category的值呢?

# re: 使用struts2中的ognl表达式显示数据表字典项的值  回复  更多评论   

2008-03-18 21:53 by 雨奏
@云自无心水自闲
因为我使用的是Hibernate,当把Category作为Book的一个属性,获得一个Book实例后可直接访问该属性取得相应的Category,Hibernate会自动地加载它(如果设置了laze initialization,Hibernate会在程序第一次访问该属性时加载,否则加载Book时同时加载)
我才注意到你使用的是iBatis,很抱歉我对它并不了解,我提到的这种做法可能并不适合
分享到:
评论

相关推荐

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    Struts2 使用OGNL表达式

    这篇博客文章可能详细探讨了如何在Struts2中使用OGNL来传递和操作数据。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来访问和修改对象的属性,甚至可以处理复杂的对象结构。以下是一些关于...

    struts2-OGNL表达式测试

    这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...

    Struts2 如何使用OGNL表达式(三十八)

    在JSP中,你可以直接在OGNL表达式中使用这些运算符,以实现动态内容的显示。 除了基本的属性访问,OGNL还支持Map和集合的操作。对于Map,可以使用`map[key]`来获取或设置值;对于集合,可以使用索引来访问元素,如`...

    struts2中ognl表达式的理解和用法

    4. JSP标签库:Struts2提供了丰富的JSP标签库,这些标签内部也大量使用了OGNL来获取和显示数据。 四、OGNL的安全性问题 由于OGNL的强大功能,如果不加以限制,可能会引发安全风险,比如OGNL注入。攻击者可以通过...

    ognl表达式 ognl表达式

    在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...

    struts2_OGNL表达式ActionContext及valuesStack

    Struts2 是一个流行的Java Web框架,它广泛使用OGNL(Object-Graph Navigation Language)作为其默认的表达式语言。OGNL 提供了一种强大的方式来访问和操作Java对象的属性,使得在视图层的表示更加简洁和高效。本文...

    struts2 OGNL表达式

    2. **Struts2动作和结果**:如何在配置文件中使用OGNL定义Action和结果。 3. **JSP标签库**:Struts2提供的JSP标签库,如`s:property`、`s:iterator`等,它们内部使用了OGNL。 4. **安全问题**:理解OGNL注入的风险...

    精通struts2的ognl表达式

    - Struts2提供了一些内置的状态变量,这些变量可以直接在OGNL表达式中使用。 - 示例代码: ```xml ()"/&gt; ``` 6. **Lambda表达式** - Lambda表达式提供了一种简洁的方式来定义简单的函数或方法。 - 示例代码...

    struts2 ognl表达式

    Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...

    Struts2的标签库及OGNL表达式语言

    Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...

    struts2 OGNL表达式使用

    struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...

    Struts2深入学习----OGNL表达式原理

    总的来说,OGNL是Struts2框架中不可或缺的一部分,它使得数据绑定和表达式求值变得简单而强大。通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在...

    struts2 OGNL 表达式及各种标签的使用

    Struts2 OGNL(Object-Graph Navigation Language)表达式是一种强大的、动态的数据绑定和脚本语言,广泛应用于Struts2框架中。它允许开发者在视图层与模型层之间灵活地传递数据,增强了MVC架构中的灵活性。本文将...

    OGNL表达式

    2. **使用OGNL表达式**:接下来,在JSP页面中使用OGNL表达式展示数据,例如: ```jsp ``` 这里`#request.name`表示从请求范围(request scope)中获取名为`name`的对象。 #### 六、总结 OGNL表达式作为一种强大...

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...

    struts2中的OGNL的源码

    其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...

    JS:ognl表达式

    - **框架集成**:许多 Java 框架,如 Struts2、Hibernate Validator 等,都集成了 OGNL 表达式用于数据绑定和验证。 - **模板引擎**:在模板引擎中使用 OGNL 表达式来动态渲染页面。 - **业务逻辑处理**:在复杂的...

    struts2标签和OGNL表达式.pdf

    OGNL(Object-Graph Navigation Language)是一种功能强大的表达式语言,用于获取和设置Java对象的属性,它广泛应用于Struts2框架中用于数据访问和表达式的解析。OGNL表达式提供了简洁的语法来访问和操作对象图,...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    在Struts2中,OGNL表达式的使用大大提升了代码的可读性和维护性。 首先,`#`字符在OGNL中扮演着关键角色。它主要用于访问OGNL上下文和Action上下文。`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:...

Global site tag (gtag.js) - Google Analytics