`
朱嘉华
  • 浏览: 238351 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2(Webwork2)一些实战开发技巧

阅读更多

一.

<!---->

使用反射动态取出 Pojo 的属性

这一招在一些特殊的场合下非常管用.比如说,用户在第一个页面,选择了某个实体其中要显示出来的几个属性,那个这个时候用反射是非常不错的选择,少了大量 if 语句:

 

Java代码 复制代码
  1. package com.leo.util;   
  2.   
  3. import java.lang.reflect.Method;   
  4.   
  5. public class HelloWorldBean {   
  6.   
  7.     private String word;   
  8.   
  9.     private String name;   
  10.   
  11.     public String getName() {   
  12.         return name;   
  13.     }   
  14.   
  15.     public void setName(String name) {   
  16.         this.name = name;   
  17.     }   
  18.   
  19.     public String getWord() {   
  20.         return word;   
  21.     }   
  22.   
  23.     public void setWord(String word) {   
  24.         this.word = word;   
  25.     }   
  26.   
  27.     public HelloWorldBean() {   
  28.         name = "superleo";   
  29.         word = "Hello World!!!";   
  30.     }   
  31.   
  32.     public String getProperty(String name) throws Exception {   
  33.         if (name != null && !name.equals("")) {   
  34.             Character ch = name.charAt(0);   
  35.             name = Character.toUpperCase(ch) + name.substring(1, name.length());   
  36.             Class cls = Class.forName("com.leo.util.HelloWorldBean");   
  37.             Method meth = cls.getMethod("get" + name, null);   
  38.             Object retobj = meth.invoke(thisnull);   
  39.             return (String) retobj;   
  40.   
  41.         }   
  42.         throw new RuntimeException();   
  43.     }   
  44.   
  45.     public static void main(String[] args) throws Exception {   
  46.         HelloWorldBean bean = new HelloWorldBean();   
  47.         bean.setName("superleo");   
  48.         bean.setWord("name");   
  49.         System.out.println(bean.getProperty("name"));   
  50.         System.out.println(bean.getProperty("word"));   
  51.     }   
  52.   
  53. }  
package com.leo.util;

import java.lang.reflect.Method;

public class HelloWorldBean {

	private String word;

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getWord() {
		return word;
	}

	public void setWord(String word) {
		this.word = word;
	}

	public HelloWorldBean() {
		name = "superleo";
		word = "Hello World!!!";
	}

	public String getProperty(String name) throws Exception {
		if (name != null && !name.equals("")) {
			Character ch = name.charAt(0);
			name = Character.toUpperCase(ch) + name.substring(1, name.length());
			Class cls = Class.forName("com.leo.util.HelloWorldBean");
			Method meth = cls.getMethod("get" + name, null);
			Object retobj = meth.invoke(this, null);
			return (String) retobj;

		}
		throw new RuntimeException();
	}

	public static void main(String[] args) throws Exception {
		HelloWorldBean bean = new HelloWorldBean();
		bean.setName("superleo");
		bean.setWord("name");
		System.out.println(bean.getProperty("name"));
		System.out.println(bean.getProperty("word"));
	}

}

 

 

OK ,假设我们在 HelloAction 使用了这个 HelloWorldBean ,并且运行后,跳转到相应页面,你可以这样去取 HelloWorldBean word name 属性了:

 

Html代码 复制代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3. <html>  
  4.     <body>  
  5.         <h3>  
  6.             正常方法:<s:property value="helloWorld.name" /> <br />  
  7.             <s:property value="helloWorld.word" /> <br />  
  8.             反射方法:<s:property value="helloWorld.getProperty('name')" /> <br />  
  9.             <s:property value="helloWorld.getProperty('word')" />  
  10.         </h3>  
  11.     </body>  
  12. </html>  
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<body>
		<h3>
			正常方法:<s:property value="helloWorld.name" /> <br />
			<s:property value="helloWorld.word" /> <br />
			反射方法:<s:property value="helloWorld.getProperty('name')" /> <br />
			<s:property value="helloWorld.getProperty('word')" />
		</h3>
	</body>
</html>

 

 

对于公共属性,还可以将此方法移到父类。

 

 

 

<!---->二. <!----> iterator 迭代 Map 对象

 

 

这对显示 Hibernate 多表连接的查询结果非常管用。

 

以前,在使用 Hibernate 的时候,因为涉及到多个表查询是很普遍的,每个表取一些字段,想显示在页面,比较好的办法是新建一个 VO 对象,专门用来显示查询的结果.但缺点就是,如果这样的查询很多, VO 类会越来越多(如果不断的往一个 VO 增加字段的话,那么这个 VO 也越来越大,构造函数会特别夸张),咱们来看一个例子:

 

Java代码 复制代码
  1. List list = session.createQuery("select new MyVO(a.name, b.name, c.id) from .....").list();  
List list = session.createQuery("select new MyVO(a.name, b.name, c.id) from .....").list();

 

 

这样返回的 List 直接就可以在页面上用 iterator 标签迭代了,但假如现在要取 10 呢?不仅 HQL 语句要修改,而且 MyVO 也要修改.下面是一种更好的做法:

 

Java代码 复制代码
  1. List list = session.createQuery("select new Map(a.name as fristName, b.name as secondName, c.id as id from .....").list();  
List list = session.createQuery("select new Map(a.name as fristName, b.name as secondName, c.id as id from .....").list();

 

 

这里改用 Map 了,注意每个属性都用“ as ”重新启了一个别名,这个非常重要,否则在页面显示时,很费劲.

 

现在来看页面调用代码:

 

Html代码 复制代码
  1. <s:iterator value="list" id="maps">  
  2.       <tr class="row1">  
  3.       <input type="checkbox" name="ids" value="<s:property value="#maps.get('id')" />/>  
  4.       <td align="center"><s:property value="#maps.get('fristName')" /></td>  
  5.       <td align="center"><s:property value="#maps.get('secondName')" /></td>  
  6.     </tr>  
  7.     </s:iterator>  
<s:iterator value="list" id="maps">
      <tr class="row1">
      <input type="checkbox" name="ids" value="<s:property value="#maps.get('id')" />" />
      <td align="center"><s:property value="#maps.get('fristName')" /></td>
      <td align="center"><s:property value="#maps.get('secondName')" /></td>
    </tr>
    </s:iterator>

 

 

 

注意上面的页面中 Map 的取值就是当时 hql 语句中“ as ”后的别名.

虽然相对于以往的 JSTL 来说,要写的标签代码更多了,但强大的 OGNL 表达式也让你在视图层拥有更强大的灵活性与扩展性.

 

顺序无关,如果你使用了 select new List(...) 也能达到类似效果,但因为 List 是有序的,所以在页面显示非常不灵活,不推荐使用.

 

 

<!---->三. <!----> if 标签判断汉字问题

 

这个问题具体原因不明,先看下面一段代码:

Java代码 复制代码
  1. <s:if test="user.name == '程序'">   
  2. ...  
<s:if test="user.name == '程序'">
...

 

这样就算 user.name 等于“程序”也是无法通过的,需要修改成以下代码:

Html代码 复制代码
  1. <s:if test="user.name == \'程序\'">  
  2. ...  
<s:if test="user.name == \'程序\'">
...

 

 

如果“程序”是你系统的一个常量,更推荐的作法是:

Html代码 复制代码
  1. <s:if test="user.name == @com.leo.util.Constants@TYPE ">  
  2. ...  
<s:if test="user.name == @com.leo.util.Constants@TYPE ">
...

 

我不知道原因是不是因为版本问题?希望有知道的,回复一下.

 

 

<!---->四. <!----> iterator 双重循环

 

这个也很常用,相信很多人都轻车熟路,那我们来回顾一下。假设 lists 装的都是 Group 对象, Group 持有一个 List<User> 那个我们接下来可以:

Html代码 复制代码
  1. <ww:iterator value="lists" id="top">  
  2. <ww:iterator value="users" id="sub">  
  3. 组名:<s:property value="#top.name" />,成员名:<s:property value="#sub.name" />  
  4. </ww:iterator>  
  5.   应该组总数:<s:property value="users.size" />  
  6. </ww:iterator>  
<ww:iterator value="lists" id="top">
<ww:iterator value="users" id="sub">
组名:<s:property value="#top.name" />,成员名:<s:property value="#sub.name" />
</ww:iterator>
  应该组总数:<s:property value="users.size" />
</ww:iterator>

 

 

上面的写法有很多种,但效果都是一样的,有兴趣可以多看看 OGNL

分享到:
评论

相关推荐

    struts2 实战 实例代码

    通过阅读和实践"Structs2InAction"中的例子,你将能够掌握Struts2的核心概念和实践技巧,提升你的JavaEE开发能力。记得每个实例都要动手操作,这样才能更好地理解和吸收知识。在实践中遇到问题,不要害怕,因为解决...

    Struts.2权威指南--基于WebWork核心的MVC开发.0001.pdf

    《Struts.2权威指南——基于WebWork核心的MVC开发》是一本深入解析Struts.2框架的经典著作,旨在帮助开发者全面理解并熟练掌握基于WebWork核心的模型视图控制器(Model-View-Controller,简称MVC)架构在Web应用开发...

    struts2 学习重点笔记

    - **核心**:Struts2 的核心其实是 WebWork 2,它融合了 Struts 1 的一些优秀思想。 - **优势**:使用 Struts2 可以显著提高开发效率,因为它能够处理很多基础任务,如数据接收、类型转换、验证等。 **1.2 Struts2 ...

    Struts2实战.rar

    总之,这个压缩包提供了全面的Struts2实战教程,涵盖了从基础配置到实际应用开发的各个环节。通过学习和实践,不仅可以了解Struts2的架构原理,还能掌握其在实际项目中的应用技巧,为成为一名合格的Java web开发者...

    struts2PPT课件

    通过深入学习和实践这个“struts2PPT”课件,你将能掌握Struts2的基本原理和实战技巧,为你的Java Web开发生涯打下坚实基础。在实际项目中,你可以根据需求选择不同的Struts2特性,构建高效稳定的web应用程序。

    Struts2教程集

    6. **最佳实践**:分享一些开发Struts2应用的最佳实践,提高代码质量和可维护性。 最后,《Struts中文手册》.pdf可能是官方文档的中文翻译,内容可能包括框架的API详解、配置选项、开发者指南等,帮助开发者深入...

    struts2系列教程

    - **实战案例**:通过具体的项目案例进一步加深对Struts2的理解,包括投票管理系统、无纸化办公管理系统、数据采集系统等。 以上内容概括了Struts2系列教程的主要知识点,旨在帮助读者从零开始学习并掌握Struts2...

    Manning - Struts 2 in Action (May 2008)

    《Struts 2 in Action》是由Manning出版社于2008年5月出版的一本专业书籍,专门针对Java Web开发中的Struts 2框架进行深入解析。这本书的出版标志着Struts 2框架在当时的广泛应用和技术成熟度,为开发者提供了宝贵的...

    Struts 2权威指南 完整版(共21章) + 源代码

    《Struts 2权威指南》这本书是深入学习该框架的重要参考资料,包含21个章节,全面覆盖了Struts 2的基础概念、核心组件、实战技巧以及最佳实践。 1. **Struts 2框架基础**:Struts 2是Apache软件基金会下的开源项目...

    starting-struts2-chinese

    随着技术的发展,Struts2在2005年由WebWork项目和Struts项目合并而成,它融合了WebWork框架中的许多优秀特性,如拦截器机制、OGNL表达式语言等,使其成为了一个功能更加强大的Web开发框架。 ##### 2.2 架构特点 - *...

    当当网 struts2 oracle 达内

    【标题】"当当网 struts2 oracle 达内"所涉及的知识点主要集中在三个核心领域:Struts2框架、Oracle数据库以及达内的项目开发经验。以下是对这些关键点的详细解析: 1. **Struts2框架**: Struts2是Java EE平台上...

    struts2.0学习资料

    本学习资料将带你深入理解和掌握Struts2的核心概念和实战技巧。 **一、Struts2概述** Struts2是一个基于MVC设计模式的开源框架,它整合了WebWork的强大功能和Struts1的优点,提供了一种灵活而强大的应用开发解决...

    webwork入门到精通

    《WebWork入门到精通》这一课程由松迪科技(北京)有限公司的田雪松主讲,旨在全面解析WebWork框架,从基础知识到高级应用,帮助学员掌握WebWork的核心技术和实战技巧。 ### WebWork概述 WebWork是一个开源的MVC...

    培训教程-WebWork ppt(内附源码)

    总的来说,这个培训资源为初学者提供了一条深入理解WebWork的路径,从基本概念到实战技巧,全面覆盖了WebWork的核心内容。通过阅读PPT和动手实践演示程序,开发者可以快速上手并提升在WebWork框架下的开发能力。

    企业专家讲述strusts2(课件)

    Struts2是Apache软件基金会下的一个开源框架,主要用于构建企业级Java ...通过这个课件的学习,开发者不仅可以掌握Struts2框架的高级用法,还能了解到企业级Web开发的实践经验和技巧,为今后的职业发展打下坚实的基础。

    ss开发帮助文档

    本教程的"struts2教程"子文件可能包含了更多关于Struts2的实例代码、配置示例和使用技巧,对于学习和掌握Struts2框架会非常有帮助。通过深入学习和实践,开发者可以更好地理解并运用Struts2框架来构建高效、可维护的...

Global site tag (gtag.js) - Google Analytics