在数据库的设计中,字典项是经常使用的技巧。
比如在一个图书馆系统中,书籍表(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来传递和操作数据。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来访问和修改对象的属性,甚至可以处理复杂的对象结构。以下是一些关于...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
在JSP中,你可以直接在OGNL表达式中使用这些运算符,以实现动态内容的显示。 除了基本的属性访问,OGNL还支持Map和集合的操作。对于Map,可以使用`map[key]`来获取或设置值;对于集合,可以使用索引来访问元素,如`...
4. JSP标签库:Struts2提供了丰富的JSP标签库,这些标签内部也大量使用了OGNL来获取和显示数据。 四、OGNL的安全性问题 由于OGNL的强大功能,如果不加以限制,可能会引发安全风险,比如OGNL注入。攻击者可以通过...
在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...
Struts2 是一个流行的Java Web框架,它广泛使用OGNL(Object-Graph Navigation Language)作为其默认的表达式语言。OGNL 提供了一种强大的方式来访问和操作Java对象的属性,使得在视图层的表示更加简洁和高效。本文...
2. **Struts2动作和结果**:如何在配置文件中使用OGNL定义Action和结果。 3. **JSP标签库**:Struts2提供的JSP标签库,如`s:property`、`s:iterator`等,它们内部使用了OGNL。 4. **安全问题**:理解OGNL注入的风险...
- Struts2提供了一些内置的状态变量,这些变量可以直接在OGNL表达式中使用。 - 示例代码: ```xml ()"/> ``` 6. **Lambda表达式** - Lambda表达式提供了一种简洁的方式来定义简单的函数或方法。 - 示例代码...
Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...
Struts2是一个流行的Java web开发框架,其核心特性之一就是使用OGNL(Object-Graph Navigation Language)作为表达式语言,并提供了丰富的标签库来简化视图层的开发。本篇文章将详细探讨Struts2中的OGNL表达式语言...
struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...
总的来说,OGNL是Struts2框架中不可或缺的一部分,它使得数据绑定和表达式求值变得简单而强大。通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在...
Struts2 OGNL(Object-Graph Navigation Language)表达式是一种强大的、动态的数据绑定和脚本语言,广泛应用于Struts2框架中。它允许开发者在视图层与模型层之间灵活地传递数据,增强了MVC架构中的灵活性。本文将...
2. **使用OGNL表达式**:接下来,在JSP页面中使用OGNL表达式展示数据,例如: ```jsp ``` 这里`#request.name`表示从请求范围(request scope)中获取名为`name`的对象。 #### 六、总结 OGNL表达式作为一种强大...
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达语言,用于在视图层与模型层之间传递数据。在深入理解OGNL的源码之前,我们首先需要了解OGNL的基本概念和用法。 OGNL是一种强大的表达式语言...
- **框架集成**:许多 Java 框架,如 Struts2、Hibernate Validator 等,都集成了 OGNL 表达式用于数据绑定和验证。 - **模板引擎**:在模板引擎中使用 OGNL 表达式来动态渲染页面。 - **业务逻辑处理**:在复杂的...
OGNL(Object-Graph Navigation Language)是一种功能强大的表达式语言,用于获取和设置Java对象的属性,它广泛应用于Struts2框架中用于数据访问和表达式的解析。OGNL表达式提供了简洁的语法来访问和操作对象图,...
在Struts2中,OGNL表达式的使用大大提升了代码的可读性和维护性。 首先,`#`字符在OGNL中扮演着关键角色。它主要用于访问OGNL上下文和Action上下文。`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:...