<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JaNer</title>
    <description>天地生人,有一人应有一人之业;人生在世,生一日应尽一日之勤.</description>
    <link>http://janer.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>弱弱的发一贴：Ext.Tab without Ext.Tab</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/225665" style="color:red;">http://janer.javaeye.com/blog/225665</a>&nbsp;
          发表时间: 2008年08月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.写在前面</strong><br />最近由于公司框架中的Tab组件Bug多多，迟迟不能解决。遂自己动手把Ext.Tab写成JSPTag来使用。发出来给和偶一样经常在海边拾贝壳的小鸟们借鉴参考之用。JS大师你们肯定要说，我是没事找事，直接用EXT不就行了何必那么麻烦，但问题是直接使用EXT的话，页面将大量引入一堆难读的JS和html而且也给一些作坊型的项目组带来了学习培训的成本。<br /><strong>2.实现的功能</strong><br />由Java后端根据JSPTag生成Ext.Tab界面所需的html元素和JS。实现全部功能不需要程序员编写一行html代码或者JS。主要功能列表:<br />无限嵌套生成标签卡。<br />标签卡容器的自动扩展、自动滚动条、高度、宽度、当前活动标签卡的JSP属性设置。<br />标签卡的禁用、onclick事件响应的JSP属性设置。<br />支持request重置当前活动标签卡。<br /><strong>3.JSP代码</strong><br /><pre name="code" class="java">
&lt;body>
&lt;%
 TabsUtil.setActiveTab(request, 2);
%>
&lt;eRed:tabs tabsId="tabs" activeTab="0" width="400" height="100" autoScroll="true">
  &lt;eRed:tab tabId="table1" title="标签卡1">
      &lt;font size="800">标签卡1&lt;/font>
  &lt;/eRed:tab>
  &lt;eRed:tab tabId="table2" title="标签卡2" disabled="true">
      标签卡2
  &lt;/eRed:tab>
  &lt;eRed:tab tabId="table3" title="标签卡3" onclick="test">
      标签卡3
  &lt;/eRed:tab>
&lt;/eRed:tabs>
&lt;/body>
&lt;script type="text/javascript">
function test(){
  Ext.MessageBox.alert('系统提示:', "响应onclick事件!");
}
&lt;/script>
</pre><br /><strong>4.效果图</strong><br /><img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/eredtab.jpg" /><br /><strong>5.关键代码</strong><br /><strong>TLD描述:</strong><br /><pre name="code" class="java">
	&lt;tag>
		&lt;name>tabs&lt;/name>
		&lt;tagclass>com.eredlab.uilib.common.layout.ExtTabsTag&lt;/tagclass>
		&lt;bodycontent>JSP&lt;/bodycontent>
		&lt;info>标签卡容器标签-eRedUI公共标签&lt;/info>
		&lt;attribute>
			&lt;name>tabsId&lt;/name>
			&lt;required>true&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>activeTab&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>width&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>height&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>autoScroll&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
	&lt;/tag>
	
   &lt;tag>
		&lt;name>tab&lt;/name>
		&lt;tagclass>com.eredlab.uilib.common.layout.ExtTabTag&lt;/tagclass>
		&lt;bodycontent>JSP&lt;/bodycontent>
		&lt;info>标签卡标签-eRedUI公共标签&lt;/info>
		&lt;attribute>
			&lt;name>tabId&lt;/name>
			&lt;required>true&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>title&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>disabled&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
		&lt;attribute>
			&lt;name>onclick&lt;/name>
			&lt;required>false&lt;/required>
			&lt;rtexprvalue>true&lt;/rtexprvalue>
		&lt;/attribute>
	&lt;/tag>
</pre><br /><strong>标签实现类</strong><br /><pre name="code" class="java">
/**
 * EXT风格标签选项卡容器标签-公共标签
 * @author 
 * @version eRedUI V0.1
 */
public class ExtTabsTag extends BodyTagSupport{
	private String tabsId;
	private String activeTab;
	private String width;
	private String height;
	private String autoScroll;
	private List tabs;
	public ExtTabsTag(){
		super();
		tabs = new ArrayList();
	}
	
	/**
	 * 标签开始:Do Nothing!
	 */
	public int doStartTag() throws JspException{
		tabs.clear();
		HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
		String tabNo = (String)request.getAttribute(UiConstants.EXTTAB_ACTIVETAB);
		this.activeTab = (tabNo == null || tabNo == "") ? "0" : tabNo;
		return super.EVAL_BODY_BUFFERED;
	}
	
	/**
	 * 标签结束：输出代码描述字符流
	 */
	public int doEndTag() throws JspException{
		JspWriter writer = pageContext.getOut();
        try {
        	String tabsDivStart = "&lt;div id=\"tabs\">";
			writer.println(tabsDivStart);
			for(int i = 0; i &lt; tabs.size(); i++){
				ExtTab tab = (ExtTab)tabs.get(i);
				String tabDivStart = "&lt;div id=\"" + tab.getTabId() + "\" class=\"x-hide-display\">";
				writer.println(tabDivStart);
				String tabDivContent = tab.getContent();
				writer.println(tabDivContent);
				String tabDivEnd = "&lt;/div>";
				writer.println(tabDivEnd);
			}
        	String tabsDivEnd = "&lt;/div>";
			writer.println(tabsDivEnd);
			String scriptStart = "&lt;script type=\"text/javascript\">";
			writer.println(scriptStart);
			String tabsScriptStart = "Ext.onReady(function(){var " + this.getTabsId() + " = new Ext.TabPanel({";
			tabsScriptStart = tabsScriptStart + "renderTo: '" + this.getTabsId() + "',";
			tabsScriptStart = tabsScriptStart + "width:" + (this.width == null ? "780" : this.width) + ",";
			tabsScriptStart = tabsScriptStart + "activeTab:" + (this.activeTab == null ? "0" : this.activeTab) + ",";
			tabsScriptStart = tabsScriptStart + "frame:true,";
			if(this.height != null)
				tabsScriptStart = tabsScriptStart + "height:" + this.height + ",";
			if(this.autoScroll != null)
				tabsScriptStart = tabsScriptStart + "autoScroll:" + this.autoScroll + ",";
			tabsScriptStart = tabsScriptStart + "defaults:{autoHeight: true},";
			tabsScriptStart = tabsScriptStart + "items:[";
			writer.println(tabsScriptStart);
			String tabScriptStart = "";
			for(int i = 0; i &lt; tabs.size(); i++){
				ExtTab tab = (ExtTab)tabs.get(i);
			    tabScriptStart = tabScriptStart + "{contentEl:'" + tab.getTabId() + "',";
			    if(tab.getDisabled() != null)
			    	tabScriptStart = tabScriptStart + "disabled:" + tab.getDisabled() + ",";
			    if(tab.getOnclick() != null)
			    	tabScriptStart = tabScriptStart + "listeners: {activate:" + tab.getOnclick() + "},";
			    tabScriptStart = tabScriptStart + "title: '" + tab.getTitle();
			    tabScriptStart = tabScriptStart + "'},";
			}
			String tabScriptStart2 = tabScriptStart.substring(0, tabScriptStart.length() - 1);
			writer.println(tabScriptStart2);
			String tabScriptEnd = "]";
			writer.println(tabScriptEnd);
			String tabsScriptEnd = "});});";
			writer.println(tabsScriptEnd);
			String scriptEnd = "&lt;/script>";
			writer.println(scriptEnd);
		} catch (IOException e) {
			e.printStackTrace();
		}
        return super.doEndTag();
	}
	
	/**
	 * 添加Tab卡片
	 */
	public void addTab(ExtTabTag pTab){
		tabs.add(pTab);
	}
	
	/**
	 * 添加Tab卡片
	 */
	public void addTab(ExtTab pTab){
		tabs.add(pTab);
	}
	
	/**
	 * 释放资源
	 */
	public void release(){
		super.release();
		this.activeTab = null;
		this.tabsId = null;
		this.width = null;
		this.height = null;
	}
	
	public String getTabsId() {
		return tabsId;
	}
	public void setTabsId(String tabsId) {
		this.tabsId = tabsId;
	}
	public String getActiveTab() {
		return activeTab;
	}
	public void setActiveTab(String activeTab) {
		this.activeTab = activeTab;
	}
	public String getWidth() {
		return width;
	}
	public void setWidth(String width) {
		this.width = width;
	}

	public void setHeight(String height) {
		this.height = height;
	}

	public void setAutoScroll(String autoScroll) {
		this.autoScroll = autoScroll;
	}
}

</pre><br /><br /><pre name="code" class="java">
/**
 * EXT风格标签选项卡标签-公共标签
 * @author 
 * @version eRedUI V0.1
 */
public class ExtTabTag extends BodyTagSupport{
	private String tabId;
	private String title;
	private String disabled;
	private String onclick;
	public ExtTabTag(){}
	
	/**
	 * 标签开始:Do Nothing!
	 */
	public int doStartTag() throws JspException{
		return super.EVAL_BODY_BUFFERED;
	}
	
	/**
	 * 标签结束：输出代码描述字符流
	 */
	public int doEndTag() throws JspException{
		String content = this.bodyContent.getString();
		ExtTabsTag tabs = (ExtTabsTag)findAncestorWithClass(this, ExtTabsTag.class);
		ExtTab tab = new ExtTab();
		tab.setTabId(this.getTabId());
		tab.setTitle(this.getTitle());
		tab.setContent(content);
		tab.setDisabled(this.getDisabled());
		tab.setOnclick(this.getOnclick());
		tabs.addTab(tab);
		//tabs.addTab(this);
        return super.doEndTag();
	}
	
	/**
	 * 释放资源
	 */
	public void release(){
		super.release();
        this.tabId = null;
        this.title = null;
	}
	
	public String getTabId() {
		return tabId;
	}
	public void setTabId(String tabId) {
		this.tabId = tabId;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}

	public void setDisabled(String disabled) {
		this.disabled = disabled;
	}

	public void setOnclick(String onclick) {
		this.onclick = onclick;
	}

	public String getDisabled() {
		return disabled;
	}

	public String getOnclick() {
		return onclick;
	}
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/225665#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 08 Aug 2008 05:51:21 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/225665</link>
        <guid>http://janer.javaeye.com/blog/225665</guid>
      </item>
      <item>
        <title>傻眼了吧！Ext.Grid without Ext.Grid</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/216770" style="color:red;">http://janer.javaeye.com/blog/216770</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          E3平台QQ Group：63787587<br />E3系列组件在线演示地址：<a href="http://www.javae3.com/Index.jsp" target="_blank">http://www.javae3.com/Index.jsp</a><br />更多E3系列技术文章请访问偶滴Blog,欢迎浇花水。哈哈！<br /><span style="color: red"><a href="http://user.qzone.qq.com/307916217/blog/1216576687" target="_blank">http://user.qzone.qq.com/307916217/blog/1216576687</a></span><br /><strong>1.写在最前面</strong><br />介绍:E3.Table对Ext.Grid做了完美的封装，让程序员不必去关心EXT那一堆封锁的JS也不必去关心表格的数据源，你所需要做的仅仅是使用E3Table的JSPTag画出界面，并把List数据压入request或者session就可以.最大限度的保持了传统编码的模式。<br />下面是刚用E3.Ext.Table完成的几个功能，发出来给大家看看，希望能有更多的朋友能够了解E3，让E3系列组件丰富和简化您的JavaEE应用的开发。此文仅仅是展示，详细的使用方法系列教程将后续推出!<br /><br /><strong>2.展示一</strong><br /><br />2.1. 先看一眼界面<br /><img src="http://www.shangrilaagroecology.org/e3/table/01.jpg" /><br /><br />2.2.在看看它的jsp代码<br /><pre name="code" class="java">
			&lt;e3t:table id="aa10Table" pageSize="10" toolbarPosition="bottom" caption="代码表"  height="318" items="aa10List" varStatus="aa10Status" var="aa10" uri="demoAction.do?reqCode=queryAa10" >
				&lt;e3t:param name="dto(aaa100)" value="&lt;%=request.getParameter("dto(aaa100)") %>" />
				&lt;e3t:column property="select" width="40" title="&lt;input type='checkbox' class='EXTSELECT' name='checkAllFlag' onclick='checkedAll()' value='all'>" sortable="false">
			      &lt;input type="checkbox" name="checkedId" class="EXTSELECT" align="middle" value="&lt;c:out value="${aa10.aaa102}"/>" />
		        &lt;/e3t:column>
				&lt;e3t:column property="aaa100" title="代码类别" sortable="true" />
				&lt;e3t:column property="aaa101" title="类别名称" sortable="true" />
				&lt;e3t:column property="aaa102" title="代码值" sortable="true" />
				&lt;e3t:column property="aaa103" title="代码名称" sortable="true" width="120"/>
				&lt;e3t:column property="yab003" title="经办机构" sortable="true" />
				&lt;e3t:column property="aae120" title="经办人" sortable="true" >
					&lt;eRed:codeDesc4YH field="YAE092">&lt;c:out value="${aa10.aae120}"/>&lt;/eRed:codeDesc4YH>
				&lt;/e3t:column>
				&lt;e3t:column property="edit" title="修改" sortable="false" width="20">
		             &lt;img border="0" style="cursor:hand;" onclick="click1('&lt;c:out value="${aa10.aaa102}"/>');" alt="修改" src="&lt;layout:resource name="edit.gif" type="img"/>"/>
		        &lt;/e3t:column>
			&lt;/e3t:table>
</pre><br /><br /><pre name="code" class="java">
request.setAttribute("aa10List", aa10List);
</pre><br /><br /><strong>3.展示二</strong><br /><br />3.1.先看一眼界面<br /><img src="http://www.shangrilaagroecology.org/e3/table/02.jpg" /><br /><br />3.2.再看代码<br /><pre name="code" class="java">
	&lt;layout:cell>
	&lt;eRed:groupBox title="记账时间列表" visibleVar="bg09ListByTime">
			&lt;e3t:table id="prepayTable" pageSize="5" height="160" items="bg09ListByTime" toolbarPosition="bottom" varStatus="by09GroupStatus" var="by09Group" uri="prepayAction.do?reqCode=nextPage" >
				&lt;e3t:column property="no" title="序号" sortable="false" width="40">
		           &lt;c:out value="${by09GroupStatus.count}" />
		        &lt;/e3t:column> 
				&lt;e3t:column property="jzsj" title="记账时间" width="180" />
				&lt;e3t:column property="xms" title="收费项目数" width="150" />
				&lt;e3t:column property="fyze" title="费用总额" width="150" >
				  &lt;eRed:colorRender color="red">&lt;c:out value="${by09Group.fyze}"/>&lt;/eRed:colorRender>
				&lt;/e3t:column>
				&lt;e3t:column property="jbr" title="经办人">
				  &lt;eRed:codeDesc4YH field="YAE092">&lt;c:out value="${by09Group.jbr}"/>&lt;/eRed:codeDesc4YH>
				&lt;/e3t:column>
			&lt;/e3t:table>
	  &lt;/eRed:groupBox>
	  
	 &lt;eRed:groupBox title="记账明细列表" visibleVar="bg09ListByDetail">
			&lt;e3t:table id="detailTable" pageSize="5" height="160" items="bg09ListByDetail" toolbarPosition="bottom" varStatus="by09Status" var="by09" uri="prepayAction.do?reqCode=nextPage" >
				&lt;e3t:column property="select" width="40" title="&lt;input type='checkbox' class='EXTSELECT' name='checkAllFlag' onclick='checkedAll()' value='all'>" sortable="false">
			      &lt;input type="checkbox" name="checkedId" class="EXTSELECT" align="middle" value="&lt;c:out value="${aa10.aaa102}"/>" />
		        &lt;/e3t:column>
				&lt;e3t:column property="no" title="序号" width="40" sortable="false">
					&lt;c:out value="${by09Status.count}" />
		        &lt;/e3t:column> 
				&lt;e3t:column property="sfxmmc" title="收费项目" width="150" />
				&lt;e3t:column property="sl" title="数量" width="60" />
				&lt;e3t:column property="sjjg" title="单价" width="60" >
				  &lt;eRed:colorRender color="red">&lt;c:out value="${by09.sjjg}"/>&lt;/eRed:colorRender>
				&lt;/e3t:column>
				&lt;e3t:column property="zfbl" title="自付比例" width="70">
				  &lt;eRed:colorRender color="blue">&lt;c:out value="${by09.zfbl}"/>&lt;/eRed:colorRender>
				&lt;/e3t:column>
				&lt;e3t:column property="tjdm" title="项目类别" width="120" >
				  &lt;eRed:codeDesc4YH field="TJDM">&lt;c:out value="${by09.tjdm}"/>&lt;/eRed:codeDesc4YH>
				&lt;/e3t:column>
				&lt;e3t:column property="jbsj" title="记账时间" width="150" />
				&lt;e3t:column property="jbr" title="经办人" >
				  &lt;eRed:codeDesc4YH field="YAE092">&lt;c:out value="${by09.jbr}"/>&lt;/eRed:codeDesc4YH>
				&lt;/e3t:column>
			&lt;/e3t:table>
		&lt;/eRed:groupBox>
	 &lt;/layout:cell>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/216770#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jul 2008 01:23:14 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/216770</link>
        <guid>http://janer.javaeye.com/blog/216770</guid>
      </item>
      <item>
        <title>新鲜出炉的操作java属性文件工具类</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/204649" style="color:red;">http://janer.javaeye.com/blog/204649</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          写在前面： <br />在Java开发中，我们经常会用到属性配置文件。比如，我们需要一个全局变量，这个变量又有可能经常变化，如果我们把它定义在程序中的话，那修改这个变量我们就得重新编译发布，尤其是当程序已经部署运行的话，这将带来很大麻烦。其实属性配置文件的应用场景还有很多，在java开发中可以说是无处不在。下面偶就给出一个操作属性资源文件的工具类。通过这个工具类，我们可以实现对属性配置文件的增删查的操作。<br /><pre name="code" class="java">
package com.yinhai.paysystem.hospital.base.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @name PropertiesUtil
 * @title 操作属性文件工具类
 * @desc  
 * @author 熊春
 * @version 两定支付系统-V5.0 2008-06-16
*/
public class PropertiesUtil {
	private static Log log = LogFactory.getLog(PropertiesUtil.class);//日志输出对象
	private static String filePath;
	private Properties objProperties; //属性对象
	
	/**
	 * @name PropertiesUtil
	 * @title 构造函数
	 * @desc 加载属性资源文件
	 * @param String,boolean
	 * @return 
	 * @throws Exception 
	 */
	public PropertiesUtil(String filePath) throws Exception {
		this.filePath = filePath;
		File file = new File(filePath);
		FileInputStream inStream = new FileInputStream(file);
		try{
			objProperties = new Properties();
			objProperties.load(inStream);
		}
		catch(FileNotFoundException e){
			log.error("未找到属性资源文件!");
			e.printStackTrace();
			throw e;
		}
		catch(Exception e){
			log.error("读取属性资源文件发生未知错误!");
			e.printStackTrace();
			throw e;
		}finally{
			inStream.close();
		}
	}
	
	/**
	 * @name savefile
	 * @title 持久化属性文件
	 * @desc 使用setValue()方法后，必须调用此方法才能将属性持久化到存储文件中
	 * @param String, String
	 * @return 
	 * @throws Exception
	 */
	public void savefile(String desc) throws Exception{
		FileOutputStream outStream = null;
		try{
			File file = new File(filePath);
			outStream = new FileOutputStream(file);
			objProperties.store(outStream, desc);//保存属性文件
		}catch(Exception e){
			log.error("保存属性文件出错.");
			e.printStackTrace();
			throw e;
		}finally{
			outStream.close();
		}
		
	}
	
	/**
	 * @name getVlue
	 * @title 获取属性值
	 * @desc 指定Key值，获取value
	 * @param String
	 * @return String
	 */
	public String getValue(String key){
		return objProperties.getProperty(key);
	}
	
	/**
	 * @name getVlue
	 * @title 获取属性值,支持缺省设置
	 * @desc 重载getValue()方法；指定Key值，获取value并支持缺省值
	 * @param String
	 * @return String
	 */
	public String getValue(String key, String defaultValue){
		return objProperties.getProperty(key, defaultValue);
	}
	
	/**
	 * @name removeVlue
	 * @title 删除属性
	 * @desc 根据Key,删除属性
	 * @param String
	 * @return 
	 */
	public void removeValue(String key){
		objProperties.remove(key);
	}
	
	/**
	 * @name setValue
	 * @title 设置属性
	 * @desc 
	 * @param String,String
	 * @return 
	 */
	public void setValue(String key, String value){
		objProperties.setProperty(key, value);
	}
	
	/**
	 * @name printAllVlue
	 * @title 打印所有属性值
	 * @desc 
	 * @param 
	 * @return 
	 */
	public void printAllVlue(){
		 objProperties.list(System.out);
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/204649#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 12:51:16 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/204649</link>
        <guid>http://janer.javaeye.com/blog/204649</guid>
      </item>
      <item>
        <title>E3.Tree与EXT.Layout完美整合篇</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/198321" style="color:red;">http://janer.javaeye.com/blog/198321</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #ff0000;"><strong><span style="font-size: small;"> 
      E3在线演示地址：</span></strong></span><a href="http://www.javae3.com/Index.jsp"><span style="color: #ff0000;"><strong><span style="font-size: small;">http://www.javae3.com/Index.jsp</span></strong></span></a></p>
<p>同学们，熊师讲坛又开讲了。。。 音乐。。。 掌声。。。鲜花。。。美女。。。<br />
<br />
课程题目:<br />
『E3.Tree与EXT.Layout完美整合篇』<br />
讲师:<br />
E3首席讲师.XiongChun<br />
必备知识:<br />
(1)、已经学习并掌握了我的上一篇教程-【E3.Tree入门与进阶篇】<br />
(2)、对EXT有一定了解和认识<br />
<br />
<strong>1.广告时间</strong>
<br />
1.1.E3简介<br />
由国人黄老大以&ldquo;分享经验-传递价值-成就你我&rdquo;为理念，发起并创办的一个致力于JavaEE公共应用组件的开源组织。目前已经成功推出E3.Tree、E3.Resource、E3.Table、E3.IDGenerator四个开源组件。<br />
官方网站:http://www.javae3.com<span style="background-color: #00ff00;"> QQGroup:</span>
<span style="color: red; font-size: small;">63787587</span><span style="font-size: small;">
</span><br />
1.2.EXT简介<br />
我们的英雄Jack站在无数巨人的肩膀上成就出的一个伟大的Web UI富客户端表现层框架。我想就不必再多说了，你要是连她都不认识，那我也无语了。<br />
官方网站:http://extjs.com<br />
1.3.作者简介<br />
目前头衔:E3首席讲师，致力于E3各开源组件的的宣传与推广工作，负责E3用户的培训与支持.<br />
我的心愿：如果你觉得教程对你有帮助的话，可否去帮我浇浇花水，偶养滴花快开始长果果了，谢谢了<br />
<a href="http://user.qzone.qq.com/307916217" target="_blank">http://user.qzone.qq.com/307916217</a><br />
<strong>2.进入主题</strong>
<br />
2.1.为什么要将E3.Tree和EXT.Layout布局整合?<br />
目前绝大多数的JavaEE企业应用的布局都是采用FrameSet的结构来实现，在缺乏专业美工的和精湛的CSS和JS功底的情况下很难做出酷炫的布局界面。大多呆板，丑陋不堪入目。而EXT.Layout提供了非常漂亮和酷炫的布局方案，通过Div将页面分为north,west,east, south,center五个区域,我们可以根据自己的需要来灵活的组装，而且每一个区域都提供了很多贴心的小工具比如平滑的收缩，展开等等。而我们的 E3.Tree的话则是屏蔽了各种JS树模型的差异(目前支持XTree和EXT.Tree)提供统一的Java编程接口的一个方便易用的开源组件。可用于展示具有树结构的数据模型，比如我们常用的导航菜单以及权限管理的组织机构模型等等。所以将Ext.Layut和E3.Tree整合便可以方便快捷的实现我们JavaEE Web应用系统的一个酷炫的布局结构。<br />
2.2.效果截图<br />
我们先来看一下整合后的效果图，如果您感兴趣的话就继续往下看，如果你已经掌握了相关的布局方案的话那就赶紧离开，不必再浪费时间了。<br />
图一:正常加载后的效果图 <br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree_ext.layout_1.jpg" alt="" />
<br />
图二:边栏被收缩后的效果图<br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree_ext.layout_2.jpg" alt="" />
<br />
图三：边栏根据鼠标事件临时展开的效果图 <br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree_ext.layout_3.jpg" alt="" />
<br />
<strong>3.实现步骤</strong>
<br />
3.1.分别下载Ext2.0和E3.Tree的相关资源，并引入到工程中来.关于EXT资源的引入请参阅其他文章，Google一下就有，限于篇幅就不再赘述了；关于E3.Tree资源的引入请参阅我的上一篇教程E3.Tree入门与进阶篇.<br />
3.2.新建一个JSP文件.<br />
3.2.1.导入Ext资源</p>
<pre name="code" class="java">&lt;%@ page contentType="text/html; charset=GBK"%&gt;
&lt;%-- 加载所需CSS文件 --%&gt;
&lt;link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/uilib/ext2.0/resources/css/ext-all.css"/&gt;
&lt;%-- 加载所需的JS文件 --%&gt;
&lt;script type="text/javascript" src="${pageContext.request.contextPath}/uilib/ext2.0/adapter/ext/ext-base.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="${pageContext.request.contextPath}/uilib/ext2.0/ext-all.js"&gt;&lt;/script&gt;
</pre>
<p><br />
3.2.2.使用Ext语法构建Ext.Layout布局</p>
<pre name="code" class="java">&lt;script type="text/javascript"&gt;
Ext.onReady(function(){
Ext.BLANK_IMAGE_URL = '${pageContext.request.contextPath}/uilib/ext2.0/resources/images/default/s.gif';
      new Ext.Viewport({
             layout:'border',
             items:[
                    new Ext.BoxComponent({
                         region:'north',
                         el: 'north',//填充指定id的区域内容到north区域，若不设该属性，请通过html:'内容'，设置区域内容
                         height:0
                   }),new Ext.BoxComponent({
                         region:'south',
                         el: 'south',
                         height:20
                   }),{
                        region:'center',
                        title:'**县人民政府网站管理后台',
                        autoScroll:true,
                        contentEl:'center'
                   },{
                       region:'west',
                       width: 200,
                       collapsible: true,
                       minSize: 100,
                       maxSize: 300,
                       split: true,
                       title: 'eRed门户网站通用平台 V 0.1',
                       layout:'accordion',
                       layoutConfig:{
                        animate:true
                       },
                    items: [{
                    title:'系统管理菜单',
                    autoScroll:true,
                    border:false,
                    contentEl: 'tree',
                    iconCls:'settings'
                },{
                    title:'业务功能菜单',
                    html: '&lt;font size=2px&gt;显示和业务相关的菜单&lt;/font&gt;',
                    border:false,
                    autoScroll:true,
                    iconCls:'nav'
                   },{
                    title:'安全选项',
                    html: '&lt;font size=2px&gt;显示和安全选项相关的菜单&lt;/font&gt;',
                    border:false,
                    autoScroll:true,
                    iconCls:'security'
                   },{
                    title:'关于eRedLab',
                    html: '&lt;font size=2px&gt;显示eRedLab的相关信息&lt;/font&gt;',
                    border:false,
                    autoScroll:true,
                    iconCls:'about'
                   }]
                   }]
            });
       });
</pre>
<p><br />
3.2.3.大家可能注意到了上面Ext语法中的el和contentEl属性，他们都对应Div的ID属性值，表示把这个DIV与相应的EXT布局关联起来.比如 contentEl: 'tree',即表示ID为"tree"这个DIV与Ext.Layout布局的west区域关联.下面我们看上面EXT语法程序中所关联的几个DIV</p>
<pre name="code" class="java">&lt;div id="north"&gt; 
&lt;/div&gt;
&lt;div id="south" class="copyRight"&gt; 
Copyright© 2008 eRedLab® 东方红软件实验室 中国.昆明 理念:分享经验-传递价值-成就你我
&lt;/div&gt;
</pre>
<p><br />
(1)、可能大家注意到了，并没有创建ID为"tree"的Div，这是因为下面E3.Tree在构建树的时候已经创建了以个ID为"tree"的Div,我们只需要直接使用以下语句即可:<br />
${treeScript}<br />
(2)、还有一个DIV需要着重介绍一下，就是用来显示业务办理区域的DIV，如下所示:<br />
&lt;div id="center"&gt; <br />
&lt;iframe name="mainFrame" class="mainFrame" frameborder="0"&gt;&lt;/iframe&gt;<br />
&lt;/div&gt;<br />
大家看到了，我内嵌了一个iframe,这个就可以用来显示点击E3.Tree菜单后的业务办理区域.当然，得配合E3.Tree的树节点单击事件来指定，如下所示:<br />
function doAction(url){<br />
  parent.mainFrame.location.href = url;<br />
 }<br />
如果你看到这有点糊涂的话，还是那句老话，先去看我的第一篇教程.E3.Tree入门与进阶.<br />
<br />
3.2.4.附上我的完整的JSP文件供参考.<br />
<br />
<br />
下课。。。。。<br />
<br />
课程表:<br />
课程名:『E3.Table初级应用』<br />
发表时间:2008-06-01<br />
发表地点: JavaEye, E3官方论坛, 作者技术Blog 同步发表</p>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/198321#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 15:38:11 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/198321</link>
        <guid>http://janer.javaeye.com/blog/198321</guid>
      </item>
      <item>
        <title>Struts环境下EXT.Window的数据采集问题</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/196699" style="color:red;">http://janer.javaeye.com/blog/196699</a>&nbsp;
          发表时间: 2008年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近几天，在使用EXT的过程中碰到个问题，特来像大家请求，先在此谢谢了。<br />我的大慨情况是,<br />我在在项目中引入了EXT2.0并结合Struts1.X来使用。我主要是使用EXT的Layout、Panel、Window以及各种MessageBox.但在使用Window保存数据到时候遇到了如下问题:<br />1.我在一个主页面上点击一按钮后弹出EXT.Window模态窗口，我在这个Window上放置了几个struts的html:text文本框和下拉标签，然后放了一个保存按钮(EXT的Button)，我想当我点击按钮的时候页面数据能够通过ActionForm传送到Struts的Action里去，但发现传过去的都是null.<br />我的发出请求的代码是这样的:<br /><pre name="code" class="java">myForm.action = "${pageContext.request.contextPath}/c2wp/menuResource.go?reqCode=" + reqCode</pre><br />2.后来不得不将页面数据作为url的后缀参数传过去:<br />请求代码如下:<br /><pre name="code" class="java">
   myForm.action = "${pageContext.request.contextPath}/c2wp/menuResource.go?reqCode=" + reqCode 
        + "&ab0101=" + document.getElementById('ab0101').value 
        + "&ab0102=" + document.getElementById('ab0102').value 
        + "&ab0103=" + document.getElementById('ab0103').value
        + "&ab0104=" + document.getElementById('ab0104').value
        + "&ab0105=" + document.getElementById('ab0105').value
        + "&menuClass=" + document.getElementById('menuClass').value
        + "&ab0108=" + document.getElementById('ab0108').value
        + "&ab0199=" + document.getElementById('ab0199').value;
    myForm.submit();
</pre><br />通过这样的方式，我在Action便能取道数据。但是也带来了极大的不方便，诸如url的参数长度有限，而且编码也很麻烦等等。<br />所以我还是想通过什么方式能够不用把参数拼在url后面，让我在Action中就能很方便的取道EXT.Window上的数据.<br />谢谢！<br /><br />附图一张<br /><br /><img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/ext_window.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/196699#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 25 May 2008 13:45:34 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/196699</link>
        <guid>http://janer.javaeye.com/blog/196699</guid>
      </item>
      <item>
        <title>E3.Tree入门与进阶篇</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/195115" style="color:red;">http://janer.javaeye.com/blog/195115</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #ff0000;"><strong><span style="font-size: small;">E3在线演示：<a href="http://www.javae3.com/Index.jsp">http://www.javae3.com/Index.jsp</a>
</span>
</strong>
</span>
</p>
<p>&nbsp;</p>
<p><span onclick="copyBlogURL()" style="cursor: pointer;">本文同步发表到如下网站:</span>
<a href="http://user.qzone.qq.com/307916217/blog/1211390631" title="http://user.qzone.qq.com/307916217/blog/1211390631"><span onclick="copyBlogURL()" style="cursor: pointer;"><br />
<a href="http://user.qzone.qq.com/307916217/blog/1211390631" target="_blank">http://user.qzone.qq.com/307916217/blog/1211390631</a><br />
<br />
<a href="http://www.javae3.com/posts/list/51.page#107" target="_blank">http://www.javae3.com/posts/list/51.page#107</a><br />
</span>
<br />
</a>
<strong>1.写在最前面</strong>
<br />
用E3组件很久了，对于黄老大滴无私奉献精神盛为感动。一直以来想帮着做点什么，今天，写此一文，希望能对初次接触E3的朋友有一定参考借鉴意义。谨以此为E3的成长壮大献上自己一点绵薄之力，了表心意。鉴于作者水平和精力有限，恳请各路大侠们批评指正!<br />
E3官方网站:http://www.javae3.com&nbsp;&nbsp; <span style="color: #888888;"><span style="background-color: #ff0000;">QQGroup:63787587</span>
</span>
<br />
<br />
<strong>2.E3.Tree简单介绍</strong>
<br />
E3.Tree包装了著名的Xtree JS和时下流行的Ext.Tree.(想了解更多就自己Google吧)E3.Tree屏蔽了各种JS的差异提供统一的Java编程接口<br />
来生成相应的树JS脚本并输出到Web页面显示.<br />
<br />
<strong>3.E3.Tree入门篇</strong>
<br />
用原始点的方法构造一颗简单的树<br />
Java代码如下所示:</p>
<pre name="code" class="java">//new一个树模型构造器
DefaultTreeModel treeModel = new DefaultTreeModel();

//new一个节点
WebTreeNode rootNode = new WebTreeNode(&quot;团长&quot;, &quot;root&quot;);
//添加节点事件
rootNode.setAction(&quot;javascript:doAction('./main.jsp')&quot;);
//设置节点图片
rootNode.setIcon(RequestUtil.getUrl(&quot;/resource/images/xgll_06.png&quot;, request));
//将rootNode绑定为树根节点
treeModel.addRootNode(rootNode);

//再new一个节点
WebTreeNode node1 = new WebTreeNode(&quot;一营长&quot;, &quot;node1&quot;);
//添加节点事件
node1.setAction(&quot;&quot;);
//设置节点图片
node1.setIcon(RequestUtil.getUrl(&quot;/resource/images/xgll_03.png&quot;, request));
//将node1绑定为树根节点的一个儿子节点
rootNode.addNode(node1);

//再new一个节点
WebTreeNode node2 = new WebTreeNode(&quot;二营长&quot;, &quot;node2&quot;);
//添加节点事件
node2.setAction(&quot;&quot;);
//设置节点图片
node2.setIcon(RequestUtil.getUrl(&quot;/resource/images/xgll_03.png&quot;, request));
//将node2绑定为树根节点的一个儿子节点
rootNode.addNode(node2);

//再new一个节点
WebTreeNode node3 = new WebTreeNode(&quot;二营一连长&quot;, &quot;node3&quot;);
//添加节点事件
node3.setAction(&quot;&quot;);
//设置节点图片
node3.setIcon(RequestUtil.getUrl(&quot;/resource/images/xgll_03.png&quot;, request));
//将node2绑定为node2的一个儿子节点
node2.addNode(node3);

//构造树导向器
TreeDirector director = new DefaultTreeDirector();
//构造树Builder(XTree)(图1)
XTreeBuilder treeBuilder = new XTreeBuilder();
//设置树客户端持久状态(记住当前节点展开状态),只针对XTree有效
treeBuilder.setUsePersistence(true);
/*
如果你想生成一颗EXT.Tree的话，就使用下面的Builder来构造这棵树,可见使用E3.Tree对不同的JS树模型提供了统一的编程接口，在不同的数模型之间切换时非常方便的，甚至只需要一行代码就搞定。可见黄老大一片良苦用心。。。
*/
//构造EXT.Tree的Builder()（图2)
//ExtTreeBuilder treeBuilder = new ExtTreeBuilder();
//设置EXT.Panel风格的树标题
//treeBuilder.setTitle(&quot;这是一颗EXT版的E3.Tree&quot;);
treeBuilder.init(request);
//完成构造任务
director.build(treeModel, treeBuilder);
//获取构造树脚本,说明此脚本即为在你WEB 页面上显示的树脚本，因此如果WEB页面树显示不正常，请先调试确认是否生成了此脚本.
String treeScript = treeBuilder.getTreeScript();
//调试用
//log.info(treeScript);
//System.out.println(&quot;The TreeScript as follows:\n&quot; + treeScript);
//这就没必要再写了吧！就是把树脚本放到request域完成和WebUI的交互显示了.
request.setAttribute(&quot;treeScript&quot;, treeScript);
//</pre>
<p>现在我们还剩下的事就是如何在Web页面上把这颗树显示出来了,这个很简单.只要在你的JSP页面合适区域使用如下语句将树脚本输出就可以.<br />
&lt;%= request.getAttribute(&quot;treeScript&quot;)%&gt;或者${treeScript}或者...<br />
如果你幸运的话，你应该在页面上看到如下所示的树了。</p>
<p>XTreeBuilder构造的树:<br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree1.jpg" height="88" alt="" width="131" />
<br />
EXTTreeBuilder构造的树:<br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree2.jpg" height="118" alt="" width="185" />
<br />
至此一棵树就算构建完了，但我想你肯定不仅仅满足于此吧。你肯定还想把这棵树放在你首页布局框架的左边，然后单你点击树节点的时候，在你的框架业务区域打开相应界面吧，如果是这样的话那接的往下看 ---&gt;<br />
我们以一营长为例:<br />
应用场景：当点击一营长的时候，在框架(Frame)指定区域打开一个页面或者发出一个reques请求执行一个Action方法或者执行一个脚本函数等等.<br />
首先在一营长节点添加单击事件,代码如下</p>
<pre name="code" class="js">//打开指定页面
//node1.setAction(&quot;./main.jsp&quot;);
//请求执行Action方法
node1.setAction(&quot;./xgllstzyxhcms/confraternityIntroduceAction.go?reqCode=init&quot;);
然后，在JSP页面写入如下JS函数:
function doAction(url){
//mainFrame为你指定框架区域的名字
parent.mainFrame.location.href = url;
}</pre>
<p>小技巧:如果你的树是使用XTreeBuilder构造出的E3.Tree的话，你还可以调用如下脚本将树全部展开:<br />
root.expandAll();<br />
全部收缩没忘记了 : ) 需要的话自己去查WebFX 的XTree相关资料即可.<br />
下课。。。<br />
<br />
<strong>4.E3.Tree进阶篇</strong>
<br />
起立。。。<br />
上一节中我们一起学习了E3.tree的基本&quot;原理&quot;(很基础的了)和一些简单的用法.但在实际应用中，我想更多的应用场景是这样的，你可能要根据数据库里存储的数据来动态的生成一棵树吧，比如说我们的权限管理系统的组织机构模型或者根据其他一些业务需求而生成的业务树。总而言之,都有一个特点就是树的数据源是动态的，数据均来自于数据库或者XML文档等。并非像上一节中所讲的每一个节点以及节点的父子关系都是手动添加。下面，我们就以权限管理根据登录用户的角色而动态生成一颗业务菜单树为例来一起学习一下,本实例的数据源来自数据库(H2)<br />
插上一句,关于H2:<br />
H2是一款非常优秀很非常轻量(体积角度，整个数据库才1.3M)Java开源数据库,也许大家熟知的是HsqlDB,但如果你真的花时间认真用过这两个开源DB后，我保证你会深深爱上H2 顺便宣传一下，因为国内用这个的的确很少，资料也非常有限，半年前我第一次用的时候基本上搜索不出什么中文字资料来。这几天见有个小胖在JavaEye上极力宣传搞普及推广，偶也借此机会再此广告一把.还有H2的作者也是一个非常热心的人，回复我的技术问题邮件甚至还给我纠正拼写错误语法错误和一些建议。不甚感激，希望H2越来越火!<br />
H2官方网站:http://www.h2database.com/<br />
<br />
4.1.根据数据库构造树，我们首先要有一个存储树节点的数据表，而且这个表结构要能反映出树的一些属性以及树的级联父子关系来.如下为我的H2见表脚本,</p>
<p>仅供参考:</p>
<pre name="code" class="sql">//功能菜单信息表 AB01
DROP TABLE IF EXISTS AB01;
CREATE TABLE AB01(
AB0101 VARCHAR(6) NOT NULL PRIMARY KEY, --功能编号
AB0102 VARCHAR(50) NOT NULL, --功能名称
AB0103 VARCHAR(6), --上级功能编号
AB0104 VARCHAR(100), --菜单图片URI
AB0105 VARCHAR(100), --功能目标地址
AB0107 VARCHAR(2), --菜单项类型
AB0108 INT, --菜单排序号
AB0199 VARCHAR(50) --
);</pre>
<p>大家可以看到我的表结构中包含了树节点属性字段(AB0102,AB0104,Ab0105)和树父子关系字段(AB0103)以及其他的一些业务属性字段.<br />
4.2. 我们在数据库中加入如下图所示的一些菜单数据信息.<br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree.data.jpg" height="225" alt="" width="535" />
<br />
<span style="color: #ff0000;">注意:跟节点的上级节点应为Null</span>
<br />
<br />
4.3.我们用E3.Tree引擎老动态的上图中的数据关系来生成这棵树.</p>
<pre name="code" class="java">log.info(&quot;开始启动E3模板引擎绘制导航菜单...&quot;);
Ab03Domain ab03 = (Ab03Domain)request.getSession().getAttribute(&quot;userInfo&quot;);
//获取登录用户所属岗位
Ab04Domain ab04 = ab04Dao.readAb04DomainByAb0301(ab03.getAb0301());
//获取岗位菜单列表
List menuList = ab05Dao.readMenuListByAb0201(ab04.getAb0201());
//业务数据解码器，从业务数据中分解出id和parentid
UserDataUncoder menuUncoder = new UserDataUncoder(){
//获取当前节点编号
public Object getID(Object userData) throws UncodeException {
Ab01Domain ab01 = (Ab01Domain)userData;
return ab01.getAb0101();
}
//获取父亲节点编号
public Object getParentID(Object userData) throws UncodeException {
Ab01Domain ab01 = (Ab01Domain)userData;
return ab01.getAb0103();
}
};
//Tree模型构造器，用于生成树模型
AbstractWebTreeModelCreator treeModelCreator = new AbstractWebTreeModelCreator(){
//该方法负责将业务数据映射到树型节点
protected Node createNode(Object userData, UserDataUncoder uncoder) {
Ab01Domain ab01 = (Ab01Domain)userData;
WebTreeNode result = new WebTreeNode(ab01.getAb0102(), &quot;node&quot; + ab01.getAb0101());
result.setAction(&quot;javascript:doAction('&quot; + ab01.getAb0105() +&quot;')&quot;);
return result;
}
};
treeModelCreator.init(request);
TreeModel treeModel = treeModelCreator.create(menuList, menuUncoder);
TreeDirector director = new DefaultTreeDirector();//构造树导向器
ExtTreeBuilder treeBuilder = new ExtTreeBuilder();//构造树Builder
//XTreeBuilder treeBuilder = new XTreeBuilder();
treeBuilder.init(request);
//treeBuilder.setTitle(&quot;eRedC2WP V 0.1&quot;);
director.build(treeModel, treeBuilder);//执行构造
String treeScript = treeBuilder.getTreeScript();//获取构造树的脚本
request.setAttribute(&quot;treeScript&quot;, treeScript);
log.info(&quot;导航菜单绘制完成!&quot;);</pre>
<p>批注:有了第一节的基础，我想看上面这段代码应该不难了吧!我的DAO实现你不用管，只是个接口而已，后面的实现可以是数据库取数据可以是XML取数据等等。你只需要看明白整个构造树的流程把数据源换成你的就可以了.已经凌晨3:00了。偶就不详细解释了,有问题的可以到E3论坛里寻求技术支持. http://www.javae3.com<br />
4.4.动态生成的E3.Tree效果图如下<br />
<img src="http://www.shangrilaagroecology.org/eredlab/resource/e3/e3.tree3.jpg" height="219" alt="" width="203" />
<br />
<br />
课程表:<br />
下一节课将讲解如下内容:<br />
『EXT.Layout布局与E3.Tree的完美整合』<br />
预计发布时间:2008-05-25,敬请期待。。。<br />
读者对象:<br />
a.对业界流行的时髦JS框架EXT有所了解<br />
b.已经学习了E3.Tree入门与进阶篇掌握了E3.Tree基本应用的读者<br />
授课目标:<br />
抛弃FrameSet,使用酷炫的EXT.Layout完成企业应用系统结构的布局,并与E3.tree完美整合.<br />
<br />
最后，偶代表黄老大感谢各位对E3的支持与厚爱。<br />
<br />
2008年5月21日 AM 03:17:18 XiongChun@昆明<br />
作者技术Blog:<br />
<a href="http://user.qzone.qq.com/307916217" target="_blank">http://user.qzone.qq.com/307916217</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/195115#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 10:25:55 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/195115</link>
        <guid>http://janer.javaeye.com/blog/195115</guid>
      </item>
      <item>
        <title>关于左侧树状菜单打开界面的目标区域定位问题</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/192624" style="color:red;">http://janer.javaeye.com/blog/192624</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天刚开始搞EXT,问题重重，举步维艰，求教个问题，先谢谢了。<br />问题是这样的:<br />我把首页分成了上，下，左，右四个div区域,并在我的左Div里放了一颗树,不是EXT原装树。我想当我点击这棵树的菜单的时候，相应的界面能在我的右div里显示出来.我点击树菜单触发的js如下:<br />function doAction(url){<br />  parent.mainFrame.location.href = url;<br /> }<br />这是以前frameset的写法～ 不知道现在应怎么改一下？<br /><br />我的页面代码如下:<br /><pre name="code" class="java">
&lt;%@ page contentType="text/html; charset=GBK"%>
&lt;%@ include file="/common/include/taglib.jsp"%>
&lt;%@ include file="/common/include/cssjs.jsp"%>
&lt;%@ include file="/common/include/extcssjs.jsp"%>
&lt;html>
&lt;head>
&lt;title>Red门户网站通用平台 V 0.1&lt;/title>
&lt;script type="text/javascript">
function doAction(url){
  parent.mainFrame.location.href = url;
 }
 
Ext.onReady(function(){
      new Ext.Viewport({
             layout:'border',
             items:[
                    new Ext.BoxComponent({
                         region:'north',
                         el: 'north',//填充指定id的区域内容到north区域，若不设该属性，请通过html:'内容'，设置区域内容
                         height:35
                   }),new Ext.BoxComponent({
                         region:'south',
                         el: 'south',
                         height:0
                   }),{
                        region:'center',
                        title:'业务办理',
                        contentEl:'center'
                   },{
                       region:'west',
                       width: 200,
                       collapsible: true,
                       minSize: 100,
                       maxSize: 300,
                       split: true,
                       title: 'eRed门户网站通用平台 V 0.1',
                       contentEl: 'tree'
                   }]
            });
       });
&lt;/script>
&lt;body>
&lt;html:form action="/security.go" method="post">
&lt;div id="north">
顶部
&lt;/div>
&lt;div id="south"> 

&lt;/div>
&lt;div id="center"> 
业务区域
&lt;/div>
${treeScript}
&lt;/html:form>
&lt;/body>
&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/192624#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 May 2008 15:57:06 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/192624</link>
        <guid>http://janer.javaeye.com/blog/192624</guid>
      </item>
      <item>
        <title>公开源码EclipseRcp玩具作品-eRedRCP </title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/189266" style="color:red;">http://janer.javaeye.com/blog/189266</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1.写在最前面</strong>
<br />
这是一个我最近学习EclipseRCP的一个玩具作品。由于最近杂事缠身,加之想把精力和重心放回到JavaEE上去.<br />
所以将暂停这个程序的后续开发.特将此拙作发出来供EclipseRCP(SWT/JFace)入门者参考.<br />
<strong>2.相关环境.</strong>
<br />
Eclipse版本:3.2<br />
SWT/JFACE 可视化插件 WindowsBuilder 访问官方网站<br />
数据库:H2 访问官方网站<br />
持久层框架: iBatis 访问官方网站<br />
<strong>3.参考本案例您可以活得如下知识点.</strong>
<br />
3.1.如何搭建一个EclipseRCP项目开发环境.<br />
3.2.如何导出一个独立的RCP可执行程序.<br />
3.3.如何给RCP项目创建菜单栏和工具栏和基本布局，并添加响应事件.<br />
3.4.如何给RCP项目创建一个系统托盘图标(屏幕右下角).<br />
3.5.如何在RCP开发环境下引入第三方Jar包.<br />
3.6.如何在RCP中使用iBatis项目的SqlMap组件和Dao组件.<br />
3.7.如何使用TableViewer.<br />
3.8.各控件的综合运用(数据绑定和数据展现)<br />
3.9.如何使用快捷高效的H2嵌入式数据库进行开发.<br />
<strong>4.说明</strong>
<br />
本案例实现了厂家信息维护功能.</p>
<p><strong>5.更多支持信息，下载本案例可执行程序和源码请通过下面的链接进入下载页面.<br />
<br />
&nbsp;&nbsp; <a href="http://user.qzone.qq.com/307916217/blog/1209878382" title="http://user.qzone.qq.com/307916217/blog/1209878382">http://user.qzone.qq.com/307916217/blog/1209878382</a>
<br />
</strong>
<br />
一些截图:</p>
<p><img src="http://www.shangrilaagroecology.org/eredlab/resource/eredrcp/img/01.gif" alt="" />
</p>
<p><img src="http://www.shangrilaagroecology.org/eredlab/resource/eredrcp/img/04.gif" alt="" />
</p>
<p><img src="http://www.shangrilaagroecology.org/eredlab/resource/eredrcp/img/03.gif" alt="" />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/189266#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 13:15:57 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/189266</link>
        <guid>http://janer.javaeye.com/blog/189266</guid>
      </item>
      <item>
        <title>iBatis 连接 Access数据库的怪异问题</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/144470" style="color:red;">http://janer.javaeye.com/blog/144470</a>&nbsp;
          发表时间: 2007年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hi,<br />我用一样的办法用iBatis连接Oracle和Mysql操作数据都很正常。但是改为Access数据库后就怪事无常!<br />如下:<br />我的连接配置:<br /><pre name="code" class="java">
jdbc.driverClassName=sun.jdbc.odbc.JdbcOdbcDriver
jdbc.url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\xgll.mdb
jdbc.username=
jdbc.password=
</pre><br /><br /><pre name="code" class="java">
    &lt;!-- 本地 Apache Commons DBCP 数据源  -->
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	&lt;property name="driverClassName">&lt;value>${jdbc.driverClassName}&lt;/value>&lt;/property>
    &lt;property name="url">&lt;value>${jdbc.url}&lt;/value>&lt;/property>
	&lt;property name="username">&lt;value>${jdbc.username}&lt;/value>&lt;/property>
	&lt;property name="password">&lt;value>${jdbc.password}&lt;/value>&lt;/property>
	&lt;/bean>
</pre><br /><br />SqlMap配置文件如下：<br /><pre name="code" class="java">
    &lt;!-- 删除所有数据 -->
    &lt;delete id="deleteRootnewsDomains" parameterClass="map">
        delete from rootnews
    &lt;/delete>
</pre><br /><br />控制台报出的错误信息:<br /><pre name="code" class="java">
--- The error occurred while executing update.  
--- Check the          delete from rootnews     .  
--- Check the SQL Statement (preparation failed).  
--- Cause: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented
Caused by: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented
</pre><br /><br />我的疑惑：<br />1.拼出来的SQL语句后面怎么多了一个点号<br />2.jdbc.url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\xgll.mdb这里配置的绝对路径如何才能改为相对路劲!
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/144470#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 Nov 2007 12:28:50 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/144470</link>
        <guid>http://janer.javaeye.com/blog/144470</guid>
      </item>
      <item>
        <title>关于基于XFire的webservice实现和调用的疑惑</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/143107" style="color:red;">http://janer.javaeye.com/blog/143107</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          是这样的:关于基于XFire的webservice实现和调用的问题:<br />客户端调用服务的代码如下：（伪码示意一下）<br /><pre name="code" class="java">
public serviceClient(){
  String inXml = "一个XML格式的字符串";
  //返回一个XML格式的字符串
  String outXml service.invokeServiceA(inXml);
  DTO dto = util.parseXmltDtoByDomej(outXml);
  ....................
  ....................
}
</pre><br />我的困惑如下：<br />我们现在虽然是以XML格式传递参数，但它是一个java.lang.String,并不是真正意义上的XML。我现在客户端也是Java自然可以接收识别。但如果服务消费端是Delphi等写的，那如何接受这个String~~~~   我怀疑我们是不是不应该传递String,而是应该传递一真正意义上的XML作为参数呢？ 如果传Stirng的话，那和HttpInvoker，RMI等的实现岂不一点优势都没有了～？
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/143107#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 17:16:25 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/143107</link>
        <guid>http://janer.javaeye.com/blog/143107</guid>
      </item>
      <item>
        <title>关于Struts环境下POI与Excel交互的问题</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/140753" style="color:red;">http://janer.javaeye.com/blog/140753</a>&nbsp;
          发表时间: 2007年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          求教:<br />Struts1.X环境下，POI与Excel交互的问题.<br />说明:我已经能够根据数据生成Excel文件后保存到相应的目录.<br />希望改进:<br />1.点击导出按钮后，是否能跳出一个像下载一样的对话框，然后根据我选择的保存路劲来保存Excel文件，而不是在程序中写死.<br />2.是否可以先生成一个模板，然后我根据模板来填充数据。这样的话对负责表头格式的Excel处理将会很方便。<br />如果有相应的代码的话，能贴出来分享一下是最好不过的了。<br />先谢过了!<br />鞠躬!
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/140753#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Nov 2007 00:48:34 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/140753</link>
        <guid>http://janer.javaeye.com/blog/140753</guid>
      </item>
      <item>
        <title>COS文件上传组件在Struts1.X环境下的问题[SOS]</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/137478" style="color:red;">http://janer.javaeye.com/blog/137478</a>&nbsp;
          发表时间: 2007年11月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="color: red">[SOS]紧急救援</span></strong><br />问题是这样的：<br />我使用文件上传组件COS进行文件的上传操作，按照COS的例子，我也成功的做了一个Demo,但这个Demo是这样的.有两个JSP文件:<br />a.jsp(用于生成上传界面)<br />upload.jsp(内嵌了javaCode实现文件上传操作)<br />我想对他进行点改进，就是说：我实现文件上传的代码我想写在StrutsAction中，而不是嵌在一个JSP里面.具体我是怎么写的，请看下面的代码:<br />a.jsp的代码如下:<br /><pre name="code" class="java">
&lt;!-- 测试集成COS文件上传效果 -->
&lt;%@ page contentType="text/html; charset=GBK"%>
&lt;html>
	&lt;body>
		&lt;form name="form1" method="post" enctype="multipart/form-data"
			action="upload.jsp">
			&lt;input name="file1" type="file">&lt;br>
			&lt;input name="file2" type="file">&lt;br>
			&lt;input name="file3" type="file">&lt;br>
			&lt;input type="submit" name="Submit"  value="上传">
		&lt;/form>
	&lt;/body>
&lt;/html>
</pre><br /><br />upload.jsp的代码如下:<br /><pre name="code" class="java">
&lt;%@ page contentType="text/html; charset=gb2312" %>
&lt;%@ page import="java.util.Enumeration"%>
&lt;%@ page import="com.oreilly.servlet.MultipartRequest" %>
&lt;%@ page import="java.io.File" %>
&lt;html>
  &lt;head>
  &lt;/head>
  &lt;body>
    &lt;%
    String saveDirectory = "c:\\upload";
    //每个文件最大5m,最多3个文件    
    int maxPostSize = 3 * 5 * 1024 * 1024;
    //response的编码为"gb2312",同时采用缺省的文件名冲突解决策略,实现上传   
    MultipartRequest multi = new MultipartRequest(request,saveDirectory, 
        maxPostSize, "gb2312");
    //输出反馈信息   
    Enumeration file = multi.getFileNames();
    while (file.hasMoreElements()) {
    	String name = (String) file.nextElement();
    	File f = multi.getFile(name);
    	if (f != null) {
    		String fileName = multi.getFilesystemName(name);
    		String lastFileName = saveDirectory + "\\" + fileName;
    		out.println("文件已经上传到:" + lastFileName);
    		out.println("&lt;br>");
    		}
    	}
    %>
  &lt;/body>
&lt;/html>
</pre><br />通过上面的两个JSP文件，我成功的完成了我的上传操作!<br />但是，我把它移植到Struts的Action中就报错了。请继续往下看:<br />a-1.jsp的代码如下:<br /><pre name="code" class="java">
&lt;!-- 测试集成COS文件上传效果 -->
&lt;%@ page contentType="text/html; charset=GBK"%>
&lt;html>
	&lt;body>
		&lt;form name="form1" method="post" enctype="multipart/form-data"
			action="/uploadAction.do">
			&lt;input name="file1" type="file">&lt;br>
			&lt;input name="file2" type="file">&lt;br>
			&lt;input name="file3" type="file">&lt;br>
			&lt;input type="submit" name="Submit"  value="上传">
		&lt;/form>
	&lt;/body>
&lt;/html>
</pre><br /><br />UploadActionForm.java的代码如下:<br /><pre name="code" class="java">
public class UploadActionForm extends ActionForm {
	private FormFile file1 = null;
	private FormFile file2 = null;
	private FormFile file3 = null;
         ........
         ........//省略
</pre><br /><br />UploadAction的代码如下:<br /><pre name="code" class="java">
public class UploadAction extends Action {
	/**
	 * @name execute
	 * @title 测试文件上传组件COS集成效果
	 * @param ActionMapping,ActionForm,HttpServletRequest,HttpServletResponse
	 * @return ActionForward
	 * @description
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
		HttpServletRequest request, HttpServletResponse response)
			throws Exception {
	    String saveDirectory = "c:\\upload";
	    //每个文件最大5m,最多3个文件    
	    int maxPostSize = 3 * 5 * 1024 * 1024;
	    //response的编码为"gb2312",同时采用缺省的文件名冲突解决策略,实现上传   
	    MultipartRequest multi = new MultipartRequest(request,saveDirectory, 
	        maxPostSize, "gb2312");
	    //输出反馈信息   
	    Enumeration file = multi.getFileNames();
	    while (file.hasMoreElements()) {
	    	String name = (String) file.nextElement();
	    	File f = multi.getFile(name);
	    	if (f != null) {
	    		String fileName = multi.getFilesystemName(name);
	    		String lastFileName = saveDirectory + "\\" + fileName;
			response.getWriter().println("文件被上传到:" + lastFileName);
			response.getWriter().println("&lt;br>");
	    		}
	    	}
		return mapping.findForward("jspView");
	}
}
</pre><br /><br />我请求这个页面的时候，控制台报出如下错误信息:<br /><pre name="code" class="java">
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - Executing org.apache.struts.chain.commands.servlet.ExceptionHandler
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - See if actionConfig ActionConfig[cancellable=falsepath=/test_4Actionvalidate=false,input=jspView,name=test_4ActionForm,scope=request,type=com.eredlab.eredcip.test.web.action.Test_4Action has an exceptionConfig for java.io.IOException
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look locally for java.io.IOException
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look globally for java.io.IOException
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look locally for java.lang.Exception
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look globally for java.lang.Exception
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look locally for java.lang.Throwable
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look globally for java.lang.Throwable
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look locally for java.lang.Object
2007-11-02 01:45:54,750 DEBUG [http-8082-Processor23] - findException: look globally for java.lang.Object
2007-11-02 01:45:54,750  WARN [http-8082-Processor23] - Unhandled exception
java.io.IOException: Posted content type isn't multipart/form-data
	at com.oreilly.servlet.multipart.MultipartParser.&lt;init>(MultipartParser.java:166)
	at com.oreilly.servlet.MultipartRequest.&lt;init>(MultipartRequest.java:222)
	at com.oreilly.servlet.MultipartRequest.&lt;init>(MultipartRequest.java:173)
	at com.eredlab.eredcip.test.web.action.Test_4Action.execute(Test_4Action.java:39)
	at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
	at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
</pre><br /><br />不知如何解决，请指教,<br />鞠躬!
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/137478#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Nov 2007 01:49:00 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/137478</link>
        <guid>http://janer.javaeye.com/blog/137478</guid>
      </item>
      <item>
        <title>深入探讨Spring与Struts集成方案</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/134620" style="color:red;">http://janer.javaeye.com/blog/134620</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          eRedLab-JaNer eRedLab@gmail.com<br /><strong>关键词:</strong> Spring、 Jakarta-Struts 、WebIDE、 MVC、 J2EE<br /><br /><strong>引言</strong><br />Spring是一个轻量级(大小和系统开支的角度)的IoC和AOP容器.它力图简化J2EE开发即J2EE without EJB.而且作为帮助企业级开发的核心支柱,Spring为模型层(OR持久层:Hibernate、JDO、iBatis等)服务层(EJB、JNDI、WebService)以及表现层(Struts、JSF、Velocity)都提供了良好的支持和集成方案.　访问Spring官方站<br />Jakarta-Struts是Apache软件组织提供的一个开源项目.它为Java Web应用提供了基于Model-View-Controller的MVC框架,尤其适用于开发大型可扩展的Web应用.尽管基于Java的MVC框架层出不穷,事实上Spring的MVC模型也提供了驱动应用系统Web层的能力,但Jakarta-Struts仍然是所有这些框架中的佼佼者. 访问Struts官方站<br />下面,我就将如何整合这两个J2EE领域的经典项目给出两套详尽的集成方案.<br /><br /><strong>进入主题</strong><br />1.首先我们来看一个Spring-Struts整合应用下的控制器Action类源代码.<br />public class CourceAction extends Action {<br />private CourceService courceService;<br />public ActionForward execute(<br />ActionMapping mapping,<br />ActionForm form,<br />HttpServletRequest request,<br />HttpServletResponse response) throws Exception {<br />Set allCources = courceService.getAllCources();<br />//..........the other statements<br />request.setAttribute("cources", allCources);<br />return mapping.findForward("jspView");<br />} }<br />分析:CourceService为一个业务实现的接口,此接口声明了一系列的业务处理方法.该方法的实现配置为Spring上下问的一个Bean.由此看来,我们大家都可能会产生一个疑问:Struts action如何取得一个包含在Spring上下文中的Bean呢?为了回答这个问题,Spring提供了两种与Struts集成的方式:(1).从一个知晓Spring上下文的基类派生我们自己的Struts Action类.然后,在派生类中就可以使用super.XX()方法来获得一个对Spring受控Bean的引用.<br />(2).将请求委托给作为Spring Bean管理的Struts Action来处理.<br />2.注册Spring插件:为了使Struts Action能够访问由Spring管理的Bean,我们就必须要注册一个知道Spring应用上下文的Struts插件.可以在struts-config.xml中通过如下的方式来完成注册.<br />&lt;plug-in classname="org.springframework.web.struts.ContextLoadPlugin"><br />&lt;set-property value="WEB-INF/Yhcip.xml,......" property="contextConfigLocation"><br />&lt;/PLUG-IN><br />ContextLoadPlugin()负责装载一个Spring应用上下文.(具体的说:是一个WebApplicationContext).value属性值为要加载的配置Spring受控Bean的xml文件的URI.<br />3.完成第一种集成方案:实现一个知晓Spring的Action基类.<br />这种集成方案是从一个公共的能够访问Spring应用上下文的基类中派生所有的Struts Action,但值得庆幸的是:我们不用自己去编写这个知晓Spring应用上下文的基类,因为Spring已经提供了org.springframework.web.struts.ActionSupport:一个org.apache.struts.action.Action的抽象实现.它重载了setServlet()方法以从ContextLoaderPlugin中获取WebapplicationContext.因此,任何时候我们只需要调用super.getBean()方法即可获得一Spring上下文中的一个Bean的引用.<br />我们再来看一段Action源代码:<br />public class CourceAction extends ActionSupport {<br />public ActionForward execute(<br />ActionMapping mapping,<br />ActionForm form,<br />HttpServletRequest request,<br />HttpServletResponse response) throws Exception {<br />//取得Spring上下文<br />ApplicationContext context = super.getWebApplicationContext();<br />//取得CourceService Bean CourseService courseService = (CourseService) context.getBean("courseService");<br />Set allCources = courceService.getAllCources(); request.setAttribute("cources", allCources);<br />//..........the other statements.<br />return mapping.findForward("jspView");<br />}}<br />分析:这个Action类由ActionSupport派生,当CourceAction需要一个Spring受控Bean时:它首先调用基类的getWebApplicationContext()方法以取得一个Spring应用上下文的引用;接着它调用getBean()方法来获取由Spring管理的courceService Bean的一个引用.<br />小结<br />至此,我们已经用第一种方案圆满的完成了Spring与Struts的集成工作.这种集成方式的好处在于直观简洁容易上手.除了需要从ActionSupport中派生,以及需要从应用上下文中获取Bean之外,其他都与在非Spring的Struts中编写和配置Action的方法相似.但这种集成方案也有不利的一面.最为显著的是:我们的Action类将直接使用Spring提供的特定类,这样会使我们的Struts Action(即控制层)的代码与Spring紧密耦合在一起.这是我们不情愿看到的.另外,Action类也负责查找由Spring管理的Bean,这违背了反向控制(IoC)的原则.<br />4.实现第二种集成方案:代理和委托Action.<br />这种集成方案要求我们编写一个Struts Action,但它只不过是一个包含在Spring应用上下文中的真正Struts Action的一个代理.该代理Action从Struts插件ContextLoaderPlugIn中获取应用上下文,从中查找真正的Struts Action,然后将处理委托给真正的Struts Action.这个方法的幽雅之处在于:只有代理action才会包含Spring特定的处理.真正的Action可以作为org.apache.struts.Action的子类来编写.<br />下面我们来看一段在之中集成方式下的Struts Action源代码:<br />public class CourceAction extends Action {<br />private CourceService courceService;<br />public ActionForward execute(<br />ActionMapping mapping,<br />ActionForm form,<br />HttpServletRequest request,<br />HttpServletResponse response) throws Exception {<br />Set allCources = courceService.getAllCources();<br />request.setAttribute("cources", allCources);<br />//..........the other statements.<br />return mapping.findForward("jspView");<br />}<br />/* 注入CourceService */<br />public void setCourceService(CourceService courceService) {<br />this.courceService = courceService;<br />}}<br />分析:大家可以看到,在这种方式之下,我们的Struts Action类和Spring是低耦合的,它仅仅依赖了Spring提供的反向控制(IoC)机制把CourceService注入到了我们的Action中.到此,大家肯定会有一个疑问:那就是Spring到底是如何提供IoC反向控制的呢?回答这个问题,我们需要完成两个步骤的配置:<br />(1).在struts-config.xml中注册Struts Action.但要注意的是我们在这里注册的是代理Action.幸运的是,我们不必亲自编写这个类.因为Spring已经通过org.springframework.web.struts.DelegatingActionProxy提供了这个代理的Action.具体的配置方法如下:<br />&lt;action type="org.springframework.web.struts.DelegatingActionProxy" path="/listCourses"><br />(2)将真正的Struts Action作为一个Spring Bean并在Spring上下文配置文件中作为一个Bean注册之.并将Action所要引用的courceService注入给它.<br />&lt;bean class="com.eRedCIP.web.CourceAction" name="/listCourses"><br />&lt;property name=""><br />&lt;ref bean="courseService"><br />&lt;/property><br />&lt;/bean><br />注意:name属性的值是非常重要的,它必须和struts-config.xml中的path属性完全一致.这是因为DelegatingActionProxy会使用path属性值在Spring上下文中查找真正的Action.使用DelegatingActionProxy的好处在于我们可以不使用任何Spring特定的类来编写Struts Action.同时,Struts动作能够利用IoC取得和他合作的对象.唯一不足之处就是不太直观,配置相对复杂.为了使action委托显得更为直观一些,我们可对这种集成方案做进一步的改进:使用请求委托.<br />5.使用请求委托.<br />为了使action委托看上去更为直观一些,Spring提供了DelegatingRequestProcessor,另一种专门用于Spring的请求处理器.需要在struts-config.xml中做如下配置:<br />&lt;controller processorclass="org.springframework.web.struts.DelegatingRequestProcessor"><br />这样,DelegatingRequestProcessor将告诉Struts自动将动作请求委托给Spring上下文中的Action来处理.这使得我们可以在struts-config.xml中用struts action的真正类型来声明它们.例如:<br />&lt;action type="com.eRedCIP.web.CourceAction" path="/listCourses"&lt;<br />当接受到一个针对/listCourses的请求时,DelegatingRequestProcessor会自动从Spring上下文配置文件中查找一个名为/listCourses的Bean(实为一个Struts Action)类.<br />&lt;action type="com.eRedCIP.web.CourceAction" path="/listCourses"><br /><br /><strong>结束语</strong><br />在当今J2EE开发领域,涌现出了一大批优秀的开源项目可供我们选择.让J2EE软件架构师们困惑的问题也由是否要引入开源转变为引入哪些开源以及如何高效整合以做为我们的一个基础开发平台上来.在这篇文章里,我根据自己在J2EE方面的开发经验并结合学习心得向大家提供了两个整合Spring与Struts开源项目的有效集成方案.由于作者水平有限,纰漏之处恳请各路剑客侠女批评指正.
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/134620#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 23:38:56 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/134620</link>
        <guid>http://janer.javaeye.com/blog/134620</guid>
      </item>
      <item>
        <title>开源项目发布-eRedPMIS</title>
        <author>JaNer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://janer.javaeye.com">JaNer</a>&nbsp;
          链接：<a href="http://janer.javaeye.com/blog/133416" style="color:red;">http://janer.javaeye.com/blog/133416</a>&nbsp;
          发表时间: 2007年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="color: #FF0000">由于这里附件传不上来，下载源程序和更多详情请访问:</span></strong><br /><a href="http://hi.baidu.com/eredlab/blog/item/f880002a1622443b5243c136.html" target="_blank">http://hi.baidu.com/eredlab/blog/item/f880002a1622443b5243c136.html</a><br /><br /><strong>1.引言</strong><br />Java桌面应用一直都以门槛高、开发成本昂贵、对客户机性能要求高等因素而在国内桌面应用领域仅仅占有很小的市场分额。而且由于资源的匮乏，也加大了程序员学习Swing的难度和成本。为使后来者能够尽快入门，本人特将最近一段时间学习swing桌面编程的一些收获与大家分享。并希望对Swing桌面有兴趣的朋友能够加入到这个项目中来，最终封装出一个支持Swing桌面编程的基础平台或者说是提供一个能满足商业应用的样板程序。<br /><br /><strong>2.eRedPMIS简介</strong><br />eRedPMIS是一套基于JavaSwing技术的桌面应用软件。以个人助手如通信录、收藏夹等简单流程为我们的业务模型。重点为技术实现过程。 <br /><br /><strong>3.eRedPMIS开发环境</strong><br />操作系统:WinXP                             <br />JDK：1.6+                            <br />开发工具：NetBeans 6.0(M9)                             <br />数据库：Access[不限]<br /><br /><strong>4.eRedPMIS终极目标</strong><br />封装出一个支持Swing桌面编程的基础平台或者说是提供一个能满足商业应用的样板程序。<br /><br /><strong>效果预览图:</strong><br /><img src="http://eredlab.googlegroups.com/web/pmis4.jpg?gda=b9d1ZDoAAADfHOVD_JImYCuVkJ_T9JXg_sxubZJEcLACiV9mjAJe3WG1qiJ7UbTIup-M2XPURDQs9gvgFcEvT3SSE-CAhuDT" /><br /><img src="http://eredlab.googlegroups.com/web/pmis5.jpg?gda=dzKWAjoAAADfHOVD_JImYCuVkJ_T9JXg_sxubZJEcLACiV9mjAJe3WG1qiJ7UbTIup-M2XPURDTuzPiebVmpSfA5APnjr8a7" /><br /><img src="http://eredlab.googlegroups.com/web/pmis3.jpg?gda=It2twjoAAADfHOVD_JImYCuVkJ_T9JXgWsNnkDakuZvOZWJd-udshWG1qiJ7UbTIup-M2XPURDRE_eKcJMBn-nMMcjl4DqCw" />
          <br/>
          <span style="color:red;">
            <a href="http://janer.javaeye.com/blog/133416#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 19 Oct 2007 14:07:41 +0800</pubDate>
        <link>http://janer.javaeye.com/blog/133416</link>
        <guid>http://janer.javaeye.com/blog/133416</guid>
      </item>
  </channel>
</rss>