180星王合击手游版:Struts2(Webwork2)一些实战开发技巧

来源:百度文库 编辑:中财网 时间:2024/05/05 09:43:43

一. 使用反射动态取出 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. }  

 

 

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.   
  4.       
  5.         

      

  6.             正常方法: value="helloWorld.name" />  />  
  7.              value="helloWorld.word" />  />  
  8.             反射方法: value="helloWorld.getProperty('name')" />  />  
  9.              value="helloWorld.getProperty('word')" />  
  10.           
  11.       
  12.   

 

 

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

 

 

 

二. 用 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 直接就可以在页面上用 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();  

 

 

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

 

现在来看页面调用代码:

 

Html代码
  1.  value="list" id="maps">  
  2.        class="row1">  
  3.        type="checkbox" name="ids" value="#maps.get('id')" />/>  
  4.        align="center"> value="#maps.get('fristName')" />  
  5.        align="center"> value="#maps.get('secondName')" />  
  6.       
  7.       
 

 

 

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

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

 

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

 

 

三. 用 if 标签判断汉字问题

 

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

Java代码
  1. if test="user.name == '程序'">   
  2. ...  

 

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

Html代码
  1.  test="user.name == \'程序\'">  
  2. ...  

 

 

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

Html代码
  1.  test="user.name == @com.leo.util.Constants@TYPE ">  
  2. ...  
 

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

 

 

四. 用 iterator 双重循环

 

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

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

 

 

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

 

 

还有一些没有及时整理好,下次统一再给大家分享一下.