<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Fly_m</title>
    <description>昨天已过去,明天就在我的心中.</description>
    <link>http://fly-m.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>今天我们毕业</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/207295" style="color:red;">http://fly-m.javaeye.com/blog/207295</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: medium; font-family: 楷体;">&nbsp;&nbsp;&nbsp; 公元2008年6月23日,终于从大学毕业了.</span></p>
<p><span style="font-size: medium; font-family: 楷体;">&nbsp;&nbsp;&nbsp; JAVAEYE是一个技术性的网站,都好久没有上来看看了.前段时间都忙着毕业的事情,现在一切都又归于平静,好像就没有经历过一样.现在写的东西和技术一点也没有粘边,也算是我在JAVAEYE上发表的一个海阔天空吧.<br />&nbsp;&nbsp;&nbsp; 大学四年,说真的,学到的东西不多,而丢掉的东西比学到的还多.回首过去,好像我就没有在大学里呆过一样.短短的四年,如过眼云烟,慢慢地散去.大一时迷茫,一天到黑的打游戏;大二时沉轮,天天都在帮别人打游戏;直到大三时,才开始接触到程序性的东西,开始学习写程序,接触java;大四,在公司实习了一年,慢慢地接触外面的时候.四年,就这么四句话,简单地接触,又简单的回忆.川农,就像一个昨天的回忆,慢慢地消逝了.<br />&nbsp;&nbsp; &nbsp;昨天上午开始发放毕业证,下午就到了成都,开始自己的工作人生.本来说星期天就回公司的,却不想又耽误了一天.回到成都,把自己的一身学生味全部洗掉,告诉自己,现在自己已经不再是学生了,自己是一个社会上为自己打拼的上班族.在现在的公司已经呆了有一年了吧,也不是说很满意现在公司的发展情况,但终要为自己的现在和将来考虑.慢慢地为自己的未来作打算,做好自己现在的工作.<br />&nbsp;&nbsp; &nbsp;我的那些同学们,不知道在以后的日子中是否将你们忘去,或许是因为我就是一个人生中的过客,在存在的时候会让人想起,当没有任何有意义的事情时又会被人忘却.我是无所谓的,大学毕业时发的留言册,我一页也没有去打开过,也没有为别的人打开过.我始终相信,那些纸上的记录,始终比不过在心里面记起的那些人.如果你没有把我忘记,无论什么时候,当你想起我,我始终都会在你想起的那个地方.昨天临走时,也没有跟很多的人打招呼,几个熟悉的人将行李装在车上,简短的告别,就匆匆地上路了.可能是许久的在成都呆久了,没有太多的离愁别绪,我甚至以为,可能过几天,我还会回到雅安,回到我们的学校.或许,我没有来到雅安,那只是昨天的记忆,我为着明天的事情忙碌,记不清太多的过去.<br />&nbsp;&nbsp;&nbsp; 关于爱情,在大学里,我是失败的.虽然始终认为在大学里寻找一份纯真的爱情对我来说是很重要的事情.然而我去没有把它实现过.也许就是我个人的不能相处,还是自己本身就是一个学生,负担不起别人对自己的期望.前天晚上,和她一起去唱歌,唱到12点过.把嗓子都唱破了,最后却不知道应该说什么.我知道,她不会跟着我走,因为她已经是她家乡学校的研究生了.真地放不下她,从理性的角度看,她真的是一个很好的新娘,是一个很好的和自己走过一生的女子.然而我去没有把她拉回自己的身边.她有她心目中的王子,她有她的憧憬,然而却不想再记得我.我想我会努力,就像对待自己的未来一样.我会努力,至少不只是对她,我想找一个很好的女子,但不是现在.如果她愿意跟我走,我不会再有寄托,然而她走了.仍然不会有寄托,因为她走了,我不确定未来与我相遇的人究竟是什么样的,也不知道那个人与自己是否能够很好的相处.但现在,我已经不再想起那些儿女情长的事了.也许是因为现在的自己不再适合去谈情说爱,还是因为我需要一段时间来好好对以后的她有一个详细的说明.我要终止那些事,让那些事在三年之后再说吧.<br />&nbsp;&nbsp;&nbsp; 匆匆地毕业了.为了一份学士证书,我在大学里混了四年.为了未来,我可能会在社会里奋斗一生.我的朋友们,如果哪天记得我,请想得一起走过的日子.</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/207295#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, 24 Jun 2008 07:08:21 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/207295</link>
        <guid>http://fly-m.javaeye.com/blog/207295</guid>
      </item>
      <item>
        <title>struts2与json插件(2)</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/183562" style="color:red;">http://fly-m.javaeye.com/blog/183562</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>在前一篇中<a href="183534" target="_blank">&lt;struts2与json插件(1)&gt;</a> ,讲到了解决在struts2中出现的一点点乱码问题,就想看看json中的数据处理方式.由struts2的处理流程来看,主要处理result的代码如下在defaultActionInvocation中:</p>
<pre name="code" class="java">private void executeResult() throws Exception {
        result = createResult();

        String timerKey = "executeResult: "+getResultCode();
        try {
            UtilTimerStack.push(timerKey);
            if (result != null) {
                result.execute(this);
            } else if (resultCode != null &amp;&amp; !Action.NONE.equals(resultCode)) {
                throw new ConfigurationException("No result defined for action " + getAction().getClass().getName() 
                        + " and result " + getResultCode(), proxy.getConfig());
            } else {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("No result returned for action "+getAction().getClass().getName()+" at "+proxy.getConfig().getLocation());
                }
            }
        } finally {
            UtilTimerStack.pop(timerKey);
        }
    }</pre>
<p>&nbsp;<br />如上所示,result就是返回的result,而resultCode就是我们通用的String返回类型了.而json插件中,采用默认值Action.Success来得到json类型,而在result中处理,即调用上面的result.invoke(this).json中的主要处理代码如下(省略中间一些代码):</p>
<pre name="code" class="java">    public void execute(ActionInvocation invocation) throws Exception {
        ActionContext actionContext = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) actionContext
            .get(StrutsStatics.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) actionContext
            .get(StrutsStatics.HTTP_RESPONSE);

        try {
            String json;
            Object rootObject;
            if (this.enableSMD) {
                //generate SMD
                rootObject = this.writeSMD(invocation);
            } else {
                // generate JSON
                if (this.root != null) {
                    ValueStack stack = invocation.getStack();
                    rootObject = stack.findValue(this.root);
                } else {
                    rootObject = invocation.getAction();
                }
            }
            json = JSONUtil
                .serialize(rootObject, this.excludeProperties, ignoreHierarchy, enumAsBean);

            boolean writeGzip = enableGZIP &amp;&amp; JSONUtil.isGzipInRequest(request);
           
            JSONUtil.writeJSONToResponse(response, this.defaultEncoding,
                isWrapWithComments(), json, false, writeGzip);

        } catch (IOException exception) {
            log.error(exception);
            throw exception;
        }
    }
</pre>
<p>&nbsp;</p>
<p>可以看出,json插件的功能(在处理json上),就是将invocation中的action对象转化成json对象,再输出到页面上.<br />&nbsp;&nbsp;&nbsp;&nbsp;在上面的应用上来看,用json插件必须注册json的resultType,而且,返回类型一定是json,也就是说,你必须给每一个json调用定义一个json的返回类型,而实际上这个类型就是转向jsonResult上,和一般的调用不一样,它不返回任何视图.即json这个返回类型感觉上完全是多余的,除了标明是json返回之外没有其他作用.而且对于解析来说,它是解析一个action对象,所就是说,如果你的action是富对象,里面有很多的属性,而实际你需要的不多时,那这个解析就完全失去了作用了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;话说这么多,改进方法,从根本上来说,就是改进这种解析机制.是不解析当前的action对象,而是像spring一样,解析只需要解析的对象一样.如返回a,就只需要解析a.查看上面的executeResult()方法,其中对result和resultCode进行了处理.其中有这么一句</p>
<pre name="code" class="java">if (result != null) {
                result.execute(this);
            } else if (resultCode != null &amp;&amp; !Action.NONE.equals(resultCode)) {
                throw new ConfigurationException("No result defined for action " + getAction().getClass().getName() 
                        + " and result " + getResultCode(), proxy.getConfig());
            } else {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("No result returned for action "+getAction().getClass().getName()+" at "+proxy.getConfig().getLocation());
                }
            }</pre>
<p>&nbsp;</p>
<p>第一句,也就是一般我们进行处理的地方,调用result进行最后的处理.而第二句,则是对resultCode进行判断,而第三句什么都不做.所以,对于其他的处理,可以从resultCode下手.方法有两种,一是返回无类型,即void类型,二是返回Action.NONE.当是这两种类型的时候,struts2就不会对result进行主动处理了.详细可参见struts2对Action.NONE的说明,如下:</p>
<p><span style="background-color: #fafafa;"><br />
<pre name="code" class="java">/**
     * The action execution was successful but do not
     * show a view. This is useful for actions that are
     * handling the view in another fashion like redirect.
     */
    public static final String NONE = "none";</pre>
<font style="background-color: #fafafa;">
<p>&nbsp;</p>
</font></span></p>
<p>&nbsp;即我们只需要在action方法中,处理ajax调用,而返回void或者"none"就行了.参考方法调用就如下:</p>
<p><span style="background-color: #fafafa;"><br />
<pre name="code" class="java">public void showCategoryListAjax2() throws Exception {
		this.category = this.service.getCategory(this.id);
		/** 如果该类别为空 **/
		if(this.category == null) {
			AjaxResponse.sendAjaxText(null, ServletActionContext.getResponse());
			return;
		}

		this.categoryList = this.service.getCategoryListBySuperCategory(this.category);

		AjaxResponse.sendAjaxText(this.categoryList, ServletActionContext.getResponse());
	}</pre>
<font style="background-color: #fafafa;">
<p>&nbsp;</p>
</font></span></p>
<p>&nbsp;上面的返回类别是一种取巧的方法,更好的方法是返回Action.NONE.这样在struts.xml配置就像这样:</p>
<pre name="code" class="java">&lt;action name="taa" class="articleAction" method="topArticleAjax"/&gt;</pre>
<p>&nbsp;是不是更好,惟一要做的就是在action方法处理json转换.不过这不是主要问题,在参考json的转换模式上,我对json转换进行了改进.在Fly_m的注解上如下:</p>
<pre name="code" class="java">public @Interface Fly_m{
      String name() default ""; 
      String format() default ""; 
      boolean exclude() default false; 
}
</pre>
<p>&nbsp;支持如json一样的名称和format以及exclude(如果为真则不进行转换).另外,支持排除指定类(如果转换对象类型和排除类一致而不进行转换)和指定名称的对象(如果对象名称和排除对象名称一致,则被忽略,只限于对象和map.这对于hibernate这种相互调用的持久层对象最好了).如对象a.b.c的形式.默认的json转换是完全转换,在json插件上,如果在b上设定json(exclude),则无论如何b都不会被转换,这种方法太过固定,不支持临时配置.而在改进中,只需要加一个"a.b"形式的excludeProperties参数就可以了.如果想转换时,把参数去掉就行了.相应的转换方法如下:</p>
<pre name="code" class="java">public static String convertToJson(Object obj, String... excludeProperties) {
		return convertToJson(obj, null, null, excludeProperties);
	}</pre>
<p>&nbsp;&nbsp;</p>
<pre name="code" class="java">public static String convertToJson(Object obj, Format format, Class[] excludeClasses, String... excludeProperties) {
		JsonHandle jsonHandle = new JsonHandle();
		jsonHandle.excludeProperties = excludeProperties;
		jsonHandle.excludeClasses = excludeClasses;
		if(format != null)
			jsonHandle.defaultFormat = format;
		return jsonHandle.convertToJson(null, 0, obj);
	}</pre>
<p>&nbsp;&nbsp;而在jsonHandle中是这样处理的.</p>
<pre name="code" class="java">public String convertToJson(String s, int depth, Object obj) {
			if(obj == null || obj.getClass().getName().indexOf("$$EnhancerByCGLIB$$") != -1 || contains(excludeClasses, obj.getClass())) {
				sb.append("null");
			} else if(isSimpleType(obj.getClass())) {
				if(obj instanceof Character) {
					sb.append("'").append(obj).append("'");
				} else {
					sb.append(obj);
				}
			} else
			if(String.class.isAssignableFrom(obj.getClass()) || StringBuffer.class.isAssignableFrom(obj.getClass())
					|| StringBuilder.class.isAssignableFrom(obj.getClass())) {
				sb.append('"');
				CharacterIterator it = new StringCharacterIterator(obj.toString());

				for(char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
					if(c == '"') {
						sb.append("\\\"");
					} else if(c == '\\') {
						sb.append("\\\\");
					} else if(c == '/') {
						sb.append("\\/");
					} else if(c == '\b') {
						sb.append("\\b");
					} else if(c == '\f') {
						sb.append("\\f");
					} else if(c == '\n') {
						sb.append("\\n");
					} else if(c == '\r') {
						sb.append("\\r");
					} else if(c == '\t') {
						sb.append("\\t");
					} else if(Character.isISOControl(c)) {
						sb.append(unicode(c));
					} else {
						sb.append(c);
					}
				}

				sb.append('"');
			} else if(obj instanceof Collection) {
				boolean hibernateFlag;
				try {
					((Collection) obj).size();
					hibernateFlag = true;
				} catch(Exception ex) {
					hibernateFlag = false;
				}

				if(hibernateFlag) {
					sb.append("[");

					for(Iterator iterator = ((Collection) obj).iterator(); iterator.hasNext();) {
						convertToJson(s, depth, iterator.next());

						if(iterator.hasNext()) {
							sb.append(",\n");
						}
					}

					sb.append("]");
				} else {
					sb.append("null");
				}

			} else if(obj.getClass().isArray()) {
				sb.append("[");

				int max = java.lang.reflect.Array.getLength(obj);

				for(int i = 0; i &lt; max; i++) {
					if(i &gt; 0) {
						sb.append(",");
					}
					convertToJson(s, depth, java.lang.reflect.Array.get(obj, i));
				}

				sb.append("]");
			} else if(java.util.Map.class.isAssignableFrom(obj.getClass())) {
				if(sb.length() &gt; 0 &amp;&amp; sb.lastIndexOf(",") != -1) {
					sb.insert(sb.lastIndexOf(",") + 1, "\n");
				}
				sb.append("{");

				for(Map.Entry e : ((Map&lt;?, ?&gt;) obj).entrySet()) {
					if(!(e.getKey() instanceof String))
						continue;
					if(contains(excludeProperties, e.getKey().toString())) {
						continue;
					}
					if(sb.length() &gt; 0 &amp;&amp; sb.charAt(sb.length() - 1) == ',' &amp;&amp; sb.charAt(sb.length() - 2) == '}') {
						sb.insert(sb.length(), "\n");
					}
					sb.append("\"").append(e.getKey()).append("\"").append(":");

					if(depth &lt;= DEFAULT_DEPTH) {
						convertToJson(add(s, e.getKey().toString()), depth + 1, e.getValue());
					} else {
						sb.append("undefined");
					}

					sb.append(",");
				}

				if(sb.length() &gt; 3) {
					sb.deleteCharAt(sb.length() - 1);
				}

				sb.append("}");
			} else {
				Map map = null;
				try {
					map = getPropertiesByReflect(this, obj);
				} catch(Exception ex) {
					ex.printStackTrace();
				}

				convertToJson(s, depth, map);
			}
			return sb.toString();
		}
	}</pre>
<p>&nbsp;</p>
<p>&nbsp;相关的转换方法都参照了其他的处理方式,具体解析方法请参照附件中的JsonUtils类.</p>
<p>&nbsp;这篇文章只是说明了一种对于json的一种新的处理方式,并不是对于json插件的不满,当然我还是喜欢自己的处理方式.加上前面对乱码的处理,算是对struts2的一种补充吧.</p>
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/183562#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, 16 Apr 2008 23:54:55 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/183562</link>
        <guid>http://fly-m.javaeye.com/blog/183562</guid>
      </item>
      <item>
        <title>struts2乱码与json插件(1)</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/183534" style="color:red;">http://fly-m.javaeye.com/blog/183534</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;最近要用struts2做一个体育类的系统,由于系统本身的原因(要求可操作性强,用户交互性高),所以不可避免地要用到ajax.在我的前一篇文章里已经提到了有关在struts2中运用ajax的一些东西了.这次重新再拾起来,仔细对比下其中的差别.<br />&nbsp;&nbsp;&nbsp;&nbsp;在前一个例子性系统中,由于所有的编码都是以UTF-8进行编码的,所以也没有碰到过有关乱码的问题.普通调用和ajax调用都很正常地运行了.而在新的系统中,要求所有的页面(包括数据库)都要求运用GBK编码.这样,一些有关于乱码的问题就出现了,乱码...与struts2有关.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;大家都知道,在struts2的配置文件中,有一个配置项直接跟编码有关."struts.i18n.encoding"这个配置项表示struts2将对数据进行何种形式的编码操作,默认的编码为utf-8,这也是为什么在前一个新闻系统中没有乱码的原因,因为它本身都和系统默认编码一致.而在新的系统中,由于要求必须将编码改成GBK,配置如下:</p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;constant name="struts.i18n.encoding" value="GBK"/&gt;</pre>
<p>&nbsp;&nbsp;&nbsp;在这种情况下,加上在tomcat serve.xml中修改URIEncoding=GBK,保证传送到服务器的数据都是GBK格式.实际测试中,这种方式是正确的,编码正确.<br />&nbsp;&nbsp;&nbsp;然而好境不长,当运用到ajax时,问题出现了.我最先采用的是struts2的json插件,看它的要求,它要求工程编码应该为UTF-8,而我的工程编码实际为GBK,这是不可能改回去的事情.先不管它,在页面中配置完成,进行ajax调用.果然,数据乱码.在action中,对数据进行了测试,发现数据在进行action时已经是乱码.对数据进行转码操作,发现将数据按</p>
<pre name="code" class="java">x = new String(x.getBytes("GBK"),"UTF-8");</pre>
<p>&nbsp;时,数据正常了.这就表示数据是按照utf-8格式进行传送的,而在sturts中可能将数据又转回了gbk,导致乱码产生.一开始从js入手,因为我用的prototype.js采用post进行传送.设置的encoding为"UTF-8",修改js的encoding为"GBK",发现并没有按照想像的方向发展,仍然乱码.而采用get方式发送时,数据仍然是乱码.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只有从java方向入手了,处理方向有两种,就像我在前面两篇有关jsp乱码中提到一样.第一种是加拦截器,拦截到ajax请求时,将编码重新转码操作.第二种就是像过滤器一样,在进行参数编码前设置正确的编码.在struts2中采用的是第二种方法.其实struts.i18n.encoding采用的也是这种方法.相应的代码如下: </p>
<pre name="code" class="java">public void prepare(HttpServletRequest request, HttpServletResponse response) { 
        String encoding = null; 
        if (defaultEncoding != null) { 
            encoding = defaultEncoding; 
        }

        Locale locale = null;

        if (defaultLocale != null) {
            locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale());
        }
        if (encoding != null) { 
            try { 
                request.setCharacterEncoding(encoding); 
            } catch (Exception e) { 
                LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e); 
            }
        } 
        if (locale != null) { 
            response.setLocale(locale); 
        } 
        if (paramsWorkaroundEnabled) { 
            request.getParameter("foo"); // simply read any parameter (existing or not) to "prime" the request 
        } 
    }</pre>
<p>&nbsp;这个方法这是org.apache.struts2.dispatcher.Dispatcher中而被FilterDispatcher调用,后都大家都知道吧,是struts2的标准过滤器.它调用的地方如下:</p>
<pre name="code" class="java">protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException { 
 
        Dispatcher du = Dispatcher.getInstance(); 
 
        // Prepare and wrap the request if the cleanup filter hasn't already, cleanup filter should be 
        // configured first before struts2 dispatcher filter, hence when its cleanup filter's turn, 
        // static instance of Dispatcher should be null. 
        if (du == null) { 
 
            Dispatcher.setInstance(dispatcher); 
 
            // prepare the request no matter what - this ensures that the proper character encoding 
            // is used before invoking the mapper (see WW-9127) 
            dispatcher.prepare(request, response); 
        } else { 
            dispatcher = du; 
        } 
         
        try { 
            // Wrap request first, just in case it is multipart/form-data 
            // parameters might not be accessible through before encoding (ww-1278) 
            request = dispatcher.wrapRequest(request, getServletContext()); 
        } catch (IOException e) { 
            String message = "Could not wrap servlet request with MultipartRequestWrapper!"; 
            LOG.error(message, e); 
            throw new ServletException(message, e); 
        } 
 
        return request; 
    }</pre>
<p>&nbsp;由上可以看出,filter在实例化dispatcher后,调用其的prepare方法,而prepare方法中,好像涉及到的其他相关操作不多,只是操作request 和 response的,在prepare方法中,判断encoding是不是空,如果不为空则将其设置编码入request中.而在defaultEncoding的设置上,可以看出这个参数是跟struts.i18n.encoding相关的,相关代码如下:</p>
<pre name="code" class="java">@Inject(StrutsConstants.STRUTS_I18N_ENCODING) 
    public static void setEncoding(String val) { 
        encoding = val; 
    }</pre>
<p>&nbsp;在上面这个方法中,将把struts.i18n.encoding注入到encoding中,也就是说,如果我们设置encoding为GBK,无论在何种条件下,它就是GBK编码了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尝试修改这种方式,因为直接影响的就是 </p>
<pre name="code" class="java">prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) </pre>
<p>这个方法,于是直接修改如为如下:</p>
<pre name="code" class="java">public class TextFilter extends FilterDispatcher{
	private static final Log log = LogFactory.getLog(TextFilter.class);
	private FilterConfig filterConfig;

	private static String defaultEncoding;
	private static String defaultLocale;
	private static String paramsWorkaroundEnabled = "false";

	@Inject(org.apache.struts2.StrutsConstants.STRUTS_DISPATCHER_PARAMETERSWORKAROUND)
	public static void setParamsWorkaroundEnabled(String enabled) {
		paramsWorkaroundEnabled = enabled;
	}

	@Inject(StrutsConstants.STRUTS_I18N_ENCODING)
	public static void setEncoding(String encoding) {
		defaultEncoding = encoding;
	}

	@Inject(value = StrutsConstants.STRUTS_LOCALE, required = false)
	public static void setLocale(String locale) {
		defaultLocale = locale;
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		super.init(filterConfig);
		this.filterConfig = filterConfig;
	}

	protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
		Dispatcher du = Dispatcher.getInstance();

		if(du == null) {
			Dispatcher.setInstance(dispatcher);
			prepare(request, response);
		} else {
			dispatcher = du;
		}

		try {
			request = dispatcher.wrapRequest(request, getServletContext());
		} catch(IOException e) {
			String message = "Could not wrap servlet request with MultipartRequestWrapper!";
			log.error(message, e);
			throw new ServletException(message, e);
		}

		return request;
	}

	private void prepare(HttpServletRequest request, HttpServletResponse response) {
		String encoding = request.getCharacterEncoding();
		if(encoding == null) {
			encoding = defaultEncoding;
		}

		Locale locale = null;
		if(defaultLocale != null) {
			locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale());
		}

		if(encoding != null) {
			try {
				request.setCharacterEncoding(encoding);
			} catch(Exception e) {
				log.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);
			}
		}

		if(locale != null) {
			response.setLocale(locale);
		}

		if(isParamsWorkaroundEnabled()) {
			request.getParameter("foo");
		}
	}

	public boolean isParamsWorkaroundEnabled() {
		ServletContext servletContext = filterConfig.getServletContext();
		return servletContext != null &amp;&amp; servletContext.getServerInfo() != null &amp;&amp; servletContext.getServerInfo().indexOf("WebLogic") &gt;= 0 ||
				paramsWorkaroundEnabled.equalsIgnoreCase("true");
	}
}
 </pre>
<p>&nbsp;可以看出,整个就是继承filterDispatcher,再修改其中的一个方法.将dispatcher.prepare()这一名改成filter.prepare的形式,实际上效果是一样的.惟一让人感觉不爽的就是,由于在filter中设置的各种变量都是私有而且是是静态的(我尝试用反射都不能得到它的值),导致直接不能得到父类的属性值,没办法,只有再加变量了.在上面的prepare中,判断request中的编码是不是为空,一般来说,从jsp页面传送的编码都是空的.当由js进行传送时,由于已经设置传送编码为UTF-8,故getCharacterEncoding()不为空,则不再进行设置编码了.其他由设置传送编码为defaultEncoding(即sturts.i18n.encoding).<br />在上面的有一句 </p>
<pre name="code" class="java">if(isParamsWorkaroundEnabled()) { 			request.getParameter("foo"); 		}</pre>
<p>专为weblogic设置,由于没有接触过,略过.值得不提的是,request.getParamter("foo").这一句,在tomcat里面是直接将编码固定化,即只要调用了这一句,都将使得request(在tomcat的实现中)不能再接受其他编码(参数已经被转化了).<br />最后,将filter设置在struts.xml中,以便窗口将参数@inject注入到filter中.</p>
<pre name="code" class="java">&lt;bean class="m_ylf.cs.sicau.struts2.TextFilter" static="true"/&gt;</pre>
<p>&nbsp;上面一句必须要,不然相应的静态参数都没有被注入,是会产生NullPointerException的哦.<br />先解决这一个问题,下一个问题将介绍struts2的json插件,及改进方法.</p>
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/183534#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, 16 Apr 2008 22:13:11 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/183534</link>
        <guid>http://fly-m.javaeye.com/blog/183534</guid>
      </item>
      <item>
        <title>使用struts2的annotation验证</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/174358" style="color:red;">http://fly-m.javaeye.com/blog/174358</a>&nbsp;
          发表时间: 2008年03月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这篇文章我是继看过帖子 http://www.javaeye.com/topic/173295 之后写下的一些经过和学习经验,尽管以前也简单看过一些关于webwork验证的东西,但都因为没有进行深入研究而作罢,直到看了论坛帖子之后,才想专心去看一下相应的解决办法.(注:写本文的目的只是让自己能有一个记性,同时也将相关的东西统一起来,让大家也都能够了解一些,如果有人也解决过这个问题,不妨一起说说经历).</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;很早以前就利用struts2(其实就是webwork核心)的验证框架,写各个方法的验证文件了.如我有一个名叫ArticleAction的类,其中需要调用一个叫做showArticle方法,那么我的action配置可能是这样写的:</p><p>&nbsp;</p><pre name="code" class="xml">&lt;action name=&quot;sa2&quot; class=&quot;articleAction&quot; method=&quot;showArticle&quot;&gt;  	&lt;result name=&quot;input&quot;&gt;/WEB-INF/news/error.jsp&lt;/result&gt;  	&lt;result name=&quot;ARTICLEACTION_SHOWARTICLE_SUCCESS&quot;&gt;/WEB-INF/news/articleShow.jsp&lt;/result&gt;  	&lt;result name=&quot;ARTICLEACTION_SHOWARTICLE_FAIL&quot;&gt;/WEB-INF/news/error.jsp&lt;/result&gt;  &lt;/action&gt;</pre><p>&nbsp;&nbsp;这样,在我的源代码中,就有一个名叫Article-sa2-validation.xml的校验文件.这里注明一下,如果配置文件里面已经注明了方法,如上文所示,那么相应的校验文件中的方法应该是action的配置别名,而不是showArticle.我以前写Article-showArticel-validation,它死活都不解析,最后去找英文论坛好不容易看到这么一条配置,终于解析了.</p><p>验证文件就不用写了,那么我们继续帖子上的内容,在看了webwork中文wiki上的java5注解配置,同时受帖子启发,把相关的验证都搬到Action源代码中,并删除了xml验证文件.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里要注明一下,帖子中作者的注明其实只有一个是需要被验证的,而我自己的action中,是有很多方法被验证,同时每个访求所验证的对象还可能不一样.由以下这个action配置文件来说:</p><p>&nbsp;</p><pre name="code" class="xml">&lt;action name=&quot;sa1&quot; class=&quot;articleAction&quot; method=&quot;saveArticle&quot;&gt;  			&lt;interceptor-ref name=&quot;defaultStack&quot;/&gt;  			&lt;interceptor-ref name=&quot;token&quot;/&gt;  			&lt;result name=&quot;invalid.token&quot;&gt;/WEB-INF/news/success.jsp&lt;/result&gt;  			&lt;result name=&quot;ARTICLEACTION_SAVEARTICLE_FAIL&quot;&gt;/WEB-INF/news/articleCreate.jsp&lt;/result&gt;  			&lt;result name=&quot;ARTICLEACTION_SAVEARTICLE_SUCCESS&quot;&gt;/WEB-INF/news/success.jsp&lt;/result&gt;  			&lt;result name=&quot;input&quot;&gt;/WEB-INF/news/articleCreate.jsp&lt;/result&gt;  		&lt;/action&gt;  		&lt;action name=&quot;sa2&quot; class=&quot;articleAction&quot; method=&quot;showArticle&quot;&gt;  			&lt;result name=&quot;input&quot;&gt;/WEB-INF/news/error.jsp&lt;/result&gt;  			&lt;result name=&quot;ARTICLEACTION_SHOWARTICLE_SUCCESS&quot;&gt;/WEB-INF/news/articleShow.jsp&lt;/result&gt;  			&lt;result name=&quot;ARTICLEACTION_SHOWARTICLE_FAIL&quot;&gt;/WEB-INF/news/error.jsp&lt;/result&gt;  		&lt;/action&gt;</pre><p>这里就有两个验证一个是sa1,一个是sa2,而对sa1所验证的主要是article这个对象的相关属性(具体属性就不用由贴出来了,主要就是些标题啊,内容啊什么的),而sa2所验证的是一个article.id这个对象是否为空就完了,因为它必须要求这个属性不能为空才能调用相关的方法逻辑.相应的annotation我贴出来,看下验证的内容:</p><p>&nbsp;</p><pre name="code" class="java">@Validations(requiredStrings = {  	@RequiredStringValidator(fieldName = &quot;article.title&quot;, key = &quot;article.title.requiredstring&quot;, message = &quot;null&quot;),  	@RequiredStringValidator(fieldName = &quot;article.content&quot;, message = &quot;null&quot;, key = &quot;article.content.requiredstring&quot;),  	@RequiredStringValidator(fieldName = &quot;article.titleColor&quot;, key = &quot;article.titleColor.requiredstring&quot;, message = &quot;null&quot;),  	@RequiredStringValidator(fieldName = &quot;article.tags&quot;, key = &quot;article.tags.requiredstring&quot;, message = &quot;null&quot;)})  	public String saveArticle() throws Exception {}</pre>&nbsp;&nbsp;<pre name="code" class="java">@Validations(requiredFields = @RequiredFieldValidator(fieldName = &quot;article.id&quot;, key = &quot;article.id.required&quot;, message = &quot;null&quot;),  			conversionErrorFields = @ConversionErrorFieldValidator(fieldName = &quot;article.id&quot;, message = &quot;null&quot;, key = &quot;article.id.int&quot;))  	public String showArticle() throws Exception {}</pre><p>&nbsp;从上面可以看出,两者进行验证的内容是完全不一样的.好了,改写完毕,进行tomcat运行了.先运行一下第一个方法,恩一切正常,验证也是正常的.然后运行第二个方法,结果出错了,页面上一堆验证失败信息,而令人奇怪的是,除了对于第二个方法的验证错误之外,所有每一个方法的验证错误都出来了.刚开始还以为是配制出错的原因,检查了几次都还是有错.我尝试将第一个的验证改成@SkipValidation,结果出来了,第二个验证开始起作用了,也就是说第一个的验证没有出现了.但是这很正常的呀,把第一个禁用了(SkipValidation)了,当然不会出现第一个的验证了.我觉得好像虽然是写在方法级别上的验证,而实际的作用范围却是每一个方法,于最初的要求还是有那么一大段区别.我认为可能是源代码中哪儿逻辑错了或者说配置错了.于是,先是去google,不过查了很久,都没有查到跟这个问题相关的地方,很多页面都说了struts2(webwork)的annotation验证,却没有说碰到这种情况,因为相应的验证都是放在field上或者说是单独的一个方法之上(如中文webwork wiki中写的),还是自己动手吧.</p><p>&nbsp;说干就做,下载 了struts2的源代码,在用于验证的拦截器AnnotationValidationInterceptor 这个方法的doIntercept(ActionInvocation actionInvocation)是这样写的:</p><p>&nbsp;</p><pre name="code" class="java">protected String doIntercept(ActionInvocation invocation) throws Exception {         Object action = invocation.getAction();         if (action != null) {             Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());             SkipValidation skip = (SkipValidation) method.getAnnotation(SkipValidation.class);             if (skip != null) {                 return invocation.invoke();             }         }         return super.doIntercept(invocation);     }</pre>&nbsp;&nbsp;看了一下,主要是先找方法上有没有SkipValidation这个Annotation,如果有,就不用验证了,直接通过.原来这个SkipValidation是struts2单独提供的,原来的webwork并没有提供这个验证,我想它主要是为了提供不被验证的方法一个好的注解吧.再往下看,进入父类的dointercept方法中,也就是由webwork提供的验证中了.进入webwork(xwork2.04)中,<br /><pre name="code" class="java">protected void doBeforeInvocation(ActionInvocation invocation) throws Exception {         Object action = invocation.getAction();         String context = invocation.getProxy().getActionName();         String method = invocation.getProxy().getMethod();         if (validateAnnotatedMethodOnly) {             ActionValidatorManagerFactory.getInstance().validate(action, context, method);         } else {             ActionValidatorManagerFactory.getInstance().validate(action, context);         }     }     protected String doIntercept(ActionInvocation invocation) throws Exception {         doBeforeInvocation(invocation);                return invocation.invoke();     }</pre><p>&nbsp;由上文可以看到,有一个判断,判断validateAnnotationMethodOnly这个标志,如果为false,进行第二个验证,而第二个验证的代码可以看到是这样写的</p><p>&nbsp;</p><pre name="code" class="java">public void validate(Object object, String context) throws ValidationException {          validate(object, context, (String) null);  }</pre><p>&nbsp;&nbsp;也就是说,第二个验证调用的是第一个方法,只不过方法参数为null.现在来看,既然,带了方法这个参数,那么应该就是对访求进行单独设置的才对呀,那为什么会那样呢,接下去看.</p><p>&nbsp;</p><pre name="code" class="java">public void validate(Object object, String context, ValidatorContext validatorContext, String method) throws ValidationException {          List&lt;Validator&gt; validators = getValidators(object.getClass(), context, method);          ......//中间省略若干                  validator.validate(object);              } finally {                  validator.setValidatorContext( null );              }          }      }</pre>&nbsp;<pre name="code" class="java">public void validate(Object object, String context, ValidatorContext validatorContext, String method) throws ValidationException {          List&lt;Validator&gt; validators = getValidators(object.getClass(), context, method);          ......//中间省略若干                  validator.validate(object);              } finally {                  validator.setValidatorContext( null );              }          }      }</pre><p>&nbsp;&nbsp;看样子就是得到该方法的验证器,再验证此对象了.而对于上面的几个方法来说,validator.validate(object)是最终的验证手段,而第一步才是最关键的,得到该对象,方法的所有验证.进入方法:</p><p>&nbsp;</p><pre name="code" class="java">public synchronized List&lt;Validator&gt; getValidators(Class clazz, String context, String method) {          final String validatorKey = buildValidatorKey(clazz, context);           if (validatorCache.containsKey(validatorKey)) {              if (FileManager.isReloadingConfigs()) {                  validatorCache.put(validatorKey, buildValidatorConfigs(clazz, context, true, null));              }          } else {              validatorCache.put(validatorKey, buildValidatorConfigs(clazz, context, false, null));          }           // get the set of validator configs          List&lt;ValidatorConfig&gt; cfgs = validatorCache.get(validatorKey);           // create clean instances of the validators for the caller's use          ArrayList&lt;Validator&gt; validators = new ArrayList&lt;Validator&gt;(cfgs.size());          for (ValidatorConfig cfg : cfgs) {              if (method == null || method.equals(cfg.getParams().get(&quot;methodName&quot;))) {                  // Remove methodName temporary                  Object methodName = cfg.getParams().remove(&quot;methodName&quot;);                  Validator validator = ValidatorFactory.getValidator(cfg, ObjectFactory.getObjectFactory());                  // Readd methodName temporary                  cfg.getParams().put(&quot;methodName&quot;, methodName);                  validator.setValidatorType(cfg.getType());                  validators.add(validator);              }          }           return validators;      }</pre><p>&nbsp;&nbsp;这个流程也很简单,好像就是得到类上的验证,字段上的验证,还有就是方法级别上的验证.而在我们的程序中,类级别上的验证没有,字段上的验证也没有,所以就只有方法级别上的验证了.最后几句最为关键,它好像是进行了方法判断,并将难过的验证放在list中,并返回.其中它的判断很特别:</p><p>&nbsp;</p><pre name="code" class="java">if (method == null || method.equals(cfg.getParams().get(&quot;methodName&quot;))) {}</pre><p>&nbsp;&nbsp;前面有一个对方法的空判断,而后面有一个方法名的判断.这时我想到了,如果一路上将方法带上的话,那么这里如果没有出错的话应该是只会加上特定方法上的验证的,而如果方法本身就是空的,那么这里就会把所有配置上的验证加在验证列表中,也就是说,本身上属于第一个方法的验证也会被加上.为了验证这种想法,我对原文件进行验证性输出,结果果不其然,method是空,而且同时输出的各个加进来的验证中,果然就本来属于第一个方法的requiredstring等验证.</p><p>那么为什么方法是空的呢,如果xwork是正确的,那么结论就肯定出现在当初最先进入验证的源头,validate(...)上.一开始以为是方法没有得到,重新打印输出一下,结果发现这里方法是被得到的.那么,问题肯定出现在接下来的</p><p>&nbsp;</p><pre name="code" class="java">if (validateAnnotatedMethodOnly) {</pre><p>&nbsp;&nbsp;上了,一查果然这个参数是空的,那么它肯定进入无方法的验证了,也就是说所有的验证都是进入验证列表了.<br />为了解决这个问题,看了下这个拦截器的写法,发现它是一个经典的webwork的写法,它提供了对validateAnnotatedMethodOnl这个参数的可配置性,那么如果将这个参数配置成true的话,那么肯定就只进行方法级别的验证了.再看了一个struts2的默认配置,终于发现原来可以在struts2的配置中,对这个值进行依赖注入,参加它本身的写法:</p><p>&nbsp;</p><pre name="code" class="java">&lt;interceptor-ref name=&quot;validation&quot;&gt;  					&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel,browse&lt;/param&gt;  				&lt;/interceptor-ref&gt;</pre><p>&nbsp;&nbsp;它配置默认对几个方法名不拦截,那么我们再加上以下一条:</p><p>&nbsp;</p><pre name="code" class="java">&lt;interceptor-ref name=&quot;validation&quot;&gt;  					&lt;param name=&quot;excludeMethods&quot;&gt;input,back,cancel,browse&lt;/param&gt;  					&lt;param name=&quot;validateAnnotatedMethodOnly&quot;&gt;true&lt;/param&gt;  				&lt;/interceptor-ref&gt;</pre><p>&nbsp;&nbsp;这样就可以调用有方法的验证了.结果实验了一下,果然程序依照自己的思路正确的运行了.</p><p>根据这次收获,发现原来自己解决问题也是很高兴的,不知道struts2里面怎么把这个默认给关了, 难道是希望用xml的方式进行验证,而且几乎没有文档提供这个参数的作用,还得靠自己来才行.</p><p>突然想到一点,如果我靠这个判断,那么如果是没有验证Annotation的方法,那么它就没有validation了,那么是不是就不会进行验证了?试验了一把,果然没有进行验证(或者说方法上没有可验证的validation).帖子中提到的加SkipValidation的方法,这是在struts2的层次上进行验证的提前结束,不过如果不验证的方法很多的话,那不是要写很多的@SkipValition了.如果不写这个,利用xwork本身的验证就会根本上通过这个方法,且xwork的验证是通过cache进行了,也就是说,它的validator都是存储在cache中的,对系统的影响了不会有很大吧.不知道struts2电门弄这个@SkipValidator是什么意思,且这个好像是专门为AnnotationValidatorInterceptor服务的,难道是没有想到本身就是不需要的吗,不解.所以看到帖子说很多地方要加@SkipValidator这个东西,本身也觉得很矛盾的,看来是多心了.根本不用加,因为它本身就没有validator所以,不需要进行验证.直接就通过了.:)</p><p>Fly_m 2008-3-21</p><p>附件中为一个验证Action和一个struts.xml配置文件.</p>我晕,看了一下,用Editplus复制的代码这么多&lt;br&gt;,而在编辑器中看到挺好的啊,哎,下次不用editplus进行提制了. 
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/174358#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, 21 Mar 2008 03:22:09 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/174358</link>
        <guid>http://fly-m.javaeye.com/blog/174358</guid>
      </item>
      <item>
        <title>jsp&amp;ajax乱码处理-2</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/173715" style="color:red;">http://fly-m.javaeye.com/blog/173715</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚才前一篇已经讲了处理乱码的一种方法,我并不想单独用拦截器的方式来处理,那样每一个action就要加一个interceptor,且对每个都要重新转码一次.于是就想从filter入手来解决,让他本身就以utf-8的方式从客户端一直到action.在先前的setCharacterFilter里面,看到这样一个东西.<br /><pre name="code" class="java">if(ignore || (request.getCharacterEncoding() == null)) {
	String encoding = selectEncoding(request);
	if(encoding != null) {
		request.setCharacterEncoding(encoding);
	}
}</pre>&nbsp;这里,得到的encoding默认是GBK,在接下来,if(encoding != null),我想如果将encoding改为null,那就不会执行request.setCharacterEncoding(encoding)了,那就不会出乱码了吧.说改就改,改selectEncoding(request)这个方法.<br /><pre name="code" class="java">protected String selectEncoding(ServletRequest request) {
               if(request.getParameter(&quot;ajax&quot;) != null)
		return null;
               return this.encoding;
}</pre>&nbsp;编译运行,处理ajax请求,好像通过了.ajax编码终于正确了,运行了一段时间,以为问题就解决了.还没有一会儿,另一个测试的同学来跟我说,jsp又出乱码了,跑过去一看,果然是乱码.好像是post乱码了.用request.getParameter来做,还是乱码.应该是拦截器这儿出问题了,跑到filter里面,对request.getCharacter进行输出,发现在没有改变编码之前,它的默认编码是ISO-8859-1,而改变之后确实是GBK啊.这是怎么回事,我已经将encoding改为GBK了,怎么会没反应.将参数进行一将ISO-8859-1到GBK转换,参数正确了.可这样不行啊,难道是我的selectEncoding有问题,将先前没有改过的方法进行替换,结果又能正确的解析参数了(可惜ajax乱码).<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 决定看tomcat源代码,找到这一段中,对request.getParameter进行查询,结果发现这么一段<br /><pre name="code" class="java">public String getParameter(String name) {
        if (!parametersParsed)
            parseParameters();

        return coyoteRequest.getParameters().getParameter(name);
}</pre>&nbsp;return 这一名后面应该是对参数进行map.get方法,那前一句肯定有问题了,转向前一句:<br /><pre name="code" class="java">protected void parseParameters() {
        parametersParsed = true;
        Parameters parameters = coyoteRequest.getParameters();
        String enc = getCharacterEncoding();
......
}</pre><p>&nbsp;这个访求将parametersParsed置真,那么,如果这个为真的话,那么这个方法就不会被执行,也就是说,再不会进行转码操作.parseParameters只会被进行一次,也就是说,如果我调用了,getParamters这个方法之后,再进行setCharacterEncoding方法,将不会对parseParameters方法有任何影响,因为这个方法已经被执行了,而依据的编码是之前的旧的编码.在上面那个selectEncoding中,我执行了一个request.getParameters()方法,相关的编码已经固定下来了,所以接下来的编码都不会对参数的编码问题有影响.所以,在执行编码设置之前,不能调用任何getParameters()方法,可能还有其他方法(暂时不管其他的).这就难办了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 忽然想看看,ajax调用之前的编码是什么,结果打印出来结果为UTF-8,而对jsp之前的编码进行打印时,却是null.仔细看了下,doFilter之个方法,还有那个if语句.很简单,如果request.getCharacterEncoding()不为空时,是可以不用再设置编码为GBK了,而当为null时,则可以设置编码.再仔细看了下这个ignore参数,它现在默认是true,也就是说,如果它为true,那都会强制进行设置编码操作,于是一个新的办法出来了.将ignore设置为false,每次设置编码由request来决定,如果编码为null则设置为GBK,否则就按已经设置好的编码(如ajax的UTF-8)进行.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此将selectEncoding改回去,原来的不变,然后在web.xml中,对setCharacterEncoding的初始化参数进行修改,将ignore改为false,这样整个问题就解决了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事后看了下这个问题,其他也很简单的,就是修改一个ignore参数的问题,然而却费了这么长的时间.原因还是自己对这个问题不太明白,以前看ignore这个参数觉得没什么用嘛,原来在这些问题还发挥了作用,最后还去看源代码,本来很简单的一件事,费这么大功夫,虽然有点不值,还算是买了个念像,以后碰到这个问题应该就不会再出问题了.<br />Fly_m 记.</p>
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/173715#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, 19 Mar 2008 13:07:27 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/173715</link>
        <guid>http://fly-m.javaeye.com/blog/173715</guid>
      </item>
      <item>
        <title>jsp&amp;ajax乱码解决-1</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/173683" style="color:red;">http://fly-m.javaeye.com/blog/173683</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统中是一个用开源框架做的系统,其中包括一部分ajax调用.即大部分是以.do的方式调用的后台action,而其中一部分又是以.do方式调用的后台ajax程序.两个都是调用.do的方式进行,所以后台基本的程序代码都差不多.惟一不同的就是非ajax调用时,返回的是modelAndView对象模型,将返回对象注入到request.attribute中,而ajax调用时,则是将需要返回的值由response.writer写回客户端.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序中采用的编码为GBK,而不是通用的utf-8编码,ajax使用是prototype.js,使用tomcat6进行开发.所以就要在一些问题上对编码进行处理.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在处理jsp的乱码问题上,分两步方式进行.get方式采用在tomcat的server.xml中加入URIEncoding=GBK设置,使其查询编码为GBK,并使之支持中文参数.而post方式呢,采用的是经典的tomcat setCharacterFilter进行处理.主要编码如下:<br /><pre name="code" class="java">import javax.servlet.*;
import java.io.IOException;

public class SetCharacterEncodingFilter
		implements Filter{

	protected String encoding = null;
	protected FilterConfig filterConfig = null;
	public void destroy() {
		this.encoding = null;
		this.filterConfig = null;
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		/** Conditionally select and set the character encoding to be used */
		if(ignore || (request.getCharacterEncoding() == null)) {
			String encoding = selectEncoding(request);
			if(encoding != null) {
				request.setCharacterEncoding(encoding);
			}
		}
		/** Pass control on to the next filter */
		chain.doFilter(request, response);
	}
	public void init(FilterConfig filterConfig) throws ServletException {

		this.filterConfig = filterConfig;
		this.encoding = filterConfig.getInitParameter(&quot;encoding&quot;);
		String value = filterConfig.getInitParameter(&quot;ignore&quot;);
		this.ignore = value == null || value.equalsIgnoreCase(&quot;true&quot;) || value.equalsIgnoreCase(&quot;yes&quot;);
	}
	protected String selectEncoding(ServletRequest request) {
		return this.encoding;
	}
}
</pre><p>&nbsp;</p><p>这样在web.xml中加入此filter,并设置ignore为true和encoding为GBK.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来以为事情就这样完了,不想在进行ajax调用时,就出现问题了.ajax里面也分两种方式,一种是get,一种是post.其中以get方式进行调用时,是没有问题的.参数被正确地传递到action中,而以post方式进行调用时,麻烦就出来了,action中的中文参数全部成了乱码.在网上查了一下,ajax的post请求是以utf-8进行编码的,当用filter进行过滤时,自然就成了乱码了.由于在系统中的ajax调用是经过封装的,采用的方式是以post进行调用,且参数也多,可能查询的参数也不是get所能传递的,个人也不太欣赏get方式进行ajax调用.所以就不想修改现有的ajax调用方式,坚决用post方式.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来就想从这个filter中下手,只要接受到ajax请求时,不再进行编码操作,而是以默认的utf-8进行编码.由于我写的ajax调用里面有个特殊的参数为ajax=true这个查询字符串.就想到了用拦截串这个东东,将ajax请求的编码再转换为utf-8编码.所以就写了如下的一个拦截器,进行编码转换.</p><pre name="code" class="java">public class Xx extends AbstractInterceptor{
	@SuppressWarnings(&quot;unchecked&quot;)
	public String intercept(ActionInvocation actionInvocation) throws Exception {
		Map paramMap = actionInvocation.getInvocationContext().getParameters();
		if(paramMap.get(&quot;ajax&quot;) != null) {
			for(Object key : paramMap.keySet()) {
				if(key instanceof String) {
					String value = (String) paramMap.get(key);
					paramMap.put(key, new String(value.getBytes(&quot;GBK&quot;), &quot;UTF-8&quot;));
				}
			}
		}
		return actionInvocation.invoke();
	}
}</pre><p>&nbsp;</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一来,凡是碰到有ajax调用的地方,都会进行一次转换,将已经乱码的参数转换成正确的参数.且不需要对其他地方进行发动,惟一需要的就是在action的配置上,在有ajax调用的action上加一个转换拦截器.不过这样感觉不是很好,每次ajax调用都要进行一次编码转换,能不能不进行编码转换呢.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这就是下一个问题了,setCharacterFilter深入.
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/173683#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, 19 Mar 2008 11:46:57 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/173683</link>
        <guid>http://fly-m.javaeye.com/blog/173683</guid>
      </item>
      <item>
        <title>对speedframework框架的修改和运用</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/149025" style="color:red;">http://fly-m.javaeye.com/blog/149025</a>&nbsp;
          发表时间: 2007年12月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">在上个公司的项目中,由于用到了导师在年前所参与写的一个开源框架.<a href="http://www.open-open.com/open155318.htm ">http://www.open-open.com/open155318.htm </a>并在运用的过程中碰到些存在的问题,故将碰到的问题列出来,与大家分享.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于是导师的框架,所以不存在什么乱改写的问题,况也只有内部在使用,其实也是为了自己开发上的需要,对原有的相关的代码进行功能上的补充和改进,以实现更多的功能.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1,对非持久性数据字段的支持,在原来的框架中,由于域模型字段与数据库字段一致,故采用自动保存,即调用save(object)时,它会自动分析对象的各个属性,并将所有的属性作为数据库的字段处理.而在实际中,并非所有的属性都需要被存储,如一些模型中的集合属性或者一些不用于数据存储的属性.参考原代码中用于代码存储的一段,即用于读取各个属性并生成sql语句这一行,加入特殊标记判断,对于transient的属性将其忽略,不将其列入存入数据库中的字段.(这个设计同样影响对于update等操作,不过由于数据库的相应表并不存在与transient属性对应的列,故此举并不会影响update操作的正常进行)相关代码如下:</font><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;getInsertSQL(Connection&nbsp;con,&nbsp;String&nbsp;dbtype,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;cls_pojo)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SpeedException&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;ins_sql&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;value_sql&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;table_name&nbsp;=&nbsp;getExcuteTableName(cls_pojo.getClass());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields&nbsp;=&nbsp;cls_pojo.getClass().getDeclaredFields();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<string></string>&nbsp;keyList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList<string></string>();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(dbtype.indexOf(</span><span class="string">&quot;db2&quot;</span><span>)&nbsp;!=&nbsp;-</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins_sql.append(</span><span class="string">&quot;insert&nbsp;into&nbsp;&quot;</span><span>).append(TableUtils.getTableSchem(con,&nbsp;dbtype,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table_name)).append(</span><span class="string">&quot;.&quot;</span><span>).append(table_name).append(</span><span class="string">&quot;(&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins_sql.append(</span><span class="string">&quot;insert&nbsp;into&nbsp;&quot;</span><span>).append(table_name).append(</span><span class="string">&quot;(&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_sql.append(</span><span class="string">&quot;(&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(Field&nbsp;field&nbsp;:&nbsp;fields)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Fly_m&nbsp;add&nbsp;here&nbsp;for&nbsp;associated&nbsp;&nbsp;properties&nbsp;such&nbsp;as&nbsp;list&nbsp;or&nbsp;array&nbsp;properties,if&nbsp;transient,ignore&nbsp;it.&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(Modifier.isTransient(field.getModifiers()))&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;column_&nbsp;=&nbsp;getField(field);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!column_.toLowerCase().equals(</span><span class="string">&quot;serialversionuid&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value&nbsp;=&nbsp;PropertyUtil.getProperty(cls_pojo,&nbsp;column_);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(value&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;!value.toString().equals(</span><span class="string">&quot;&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyList.add(column_);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;keyList.size();&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(i&nbsp;&lt;&nbsp;keyList.size()&nbsp;-&nbsp;</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins_sql.append(keyList.get(i)).append(</span><span class="string">&quot;,&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_sql.append(</span><span class="string">&quot;?,&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins_sql.append(keyList.get(i)).append(</span><span class="string">&quot;)&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_sql.append(</span><span class="string">&quot;?)&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins_sql.append(</span><span class="string">&quot;&nbsp;values&nbsp;&quot;</span><span>).append(value_sql.toString());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;SpeedException(e.getMessage());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ins_sql.toString();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;2,在上次的项目中,用这个框架对统计进行一次初始统计,居然不能正常完成.查其原因,发现在底层居然是采用每一次重新建立数据库连接并结束再建立的方式,且在建立过程中还要重新读一次配置文件.效率十分低下.解决方法,在配置过程中建立一个小小的配置缓存,在下一次读取时,直接返回相应缓存的结果.而重点在于如何解决每一次访问数据库都要重新建立连接的问题.由于此框架并没有实现连接池,查看了相应的代码,框架重新建立数据库连接无非也就是获得一个Connection对象,所以我想在其他地方引入一个connection对象(如池化的connection对象),并将其配入框架中,在框架的初始配置代码中引入connection属性,在获取连接时,首先尝试获得初始被外界传入的connection对象,如果外界没有传入,再由框架自身解析获得.仔细分析了一下代码,代码的入口点在EngineImpl类中,此类需要一个connection对象作为构造参数.所以,需要一个dataSource对象,再将dataSource对象产生的connection对象传入EngineImpl类的构造参数就OK了.这个connection对象是由外部的数据访问模板SpeedTemplate调入的,由SpeedTemplate只要接受一个可选的dataSource属性就可以实现将池化的connection对象传入整个框架中了,并且这个connection对象还由连接池来管理,而在框架中只是完成相应的数据访问操作.相应方式对比如下:<br />
原先的方式:<br />
<br />
java 代码</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>EngineFactory.getEngine(connectionFactpublic&nbsp;</span><span class="keyword">static</span><span>&nbsp;Engine&nbsp;getEngine(String&nbsp;connectionFactoryId)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;DataAccessResourceFailureException&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;doGetEngine(connectionFactoryId);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>(SpeedException&nbsp;ex)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;DataAccessResourceFailureException(</span><span class="string">&quot;Could&nbsp;not&nbsp;get&nbsp;Speed&nbsp;Engine&quot;</span><span>,&nbsp;ex);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>之后就是调用配置文件进行DriverManager.getConnection()并将connection传入EngineImpl如下</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Engine&nbsp;getEngine(String&nbsp;connection_factory_id)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SpeedException&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(connection_factory_id&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;connection_factory_id.equals(</span><span class="string">&quot;&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;SpeedException(</span><span class="string">&quot;The&nbsp;id&nbsp;does't&nbsp;not&nbsp;specify&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionFactory.getConnection(</span><span class="keyword">false</span><span>,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection_factory_id);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;EngineImpl(con);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>而修改之后的调用方式则如下:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Engine&nbsp;doGetEngine(DataSource&nbsp;dataSource)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SpeedException&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(dataSource,&nbsp;</span><span class="string">&quot;the&nbsp;dataSource&nbsp;must&nbsp;be&nbsp;not&nbsp;null&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;dataSource.getConnection();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;EngineImpl(conn);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;SpeedException(</span><span class="string">&quot;Try&nbsp;get&nbsp;engine&nbsp;failure.&quot;</span><span>&nbsp;+&nbsp;e);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>这两者都是得到一个connection再将其传入EngineImpl,只是得到的方式不一样而已.在speedTemplate里面,得到一个Engine对象,首先判断dataSource属性是否为空,如果不为空,则采用dataSource的方式,否则采用getEngine(connectionFactoryId)即自已的解析方式.我还是喜欢连接池的方式.</p>
<p>3,模型字段与数据库字段大小写不一致的情况.我在用这个框架时,经常是手动书写插入和更新语句,因为我的对象的属性名都是大小写混合的,如testProperty,由数据库中的列为test_property,为了能让在查询中能够返回testProperty的列名,我经常采用select test_property as testProperty的写法.但还是报出property not found by :testproperty的异常,仔细看了下代码,发现代码中各处都是调用sql.toLowerCase()方法将sql语句转为小写.修改代码,将toLowerCase()去掉之后,问题解决.但是后来,将数据库转为oracle时,发现所有的列名又不可用了.仔细看了下oracle传回的数据,发现所有返回的列都是大写的!!!在mysql下,返回的列是跟程序中指定的列的大小写一致的,而到了oracle所有列都变成了大写了.在不改动项目程序的基础之上,尝试改写框架中对于返回数据处理这一段.在这一层建一个列属性(并将列属性改为小写)与对象属性名称之间的一个映射.列属性由传回的列名得到,而对象属性由对象本身通过反射得到.并将这一映射存入一个映射缓存中.在处理返回数据时,首先由得到列名及指定列的数据(由rs.getColumnName(int)得到),得到列名及数据之后,将列名.toLowerCase()之后与属性映射中得到正确的对象属性名称,再通过propertyUtils将指定的对象属性值写入正确的属性中去.相应代码如下:<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;List&nbsp;copyRows(ResultSet&nbsp;rs,&nbsp;Class&nbsp;voclass)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;vo&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetMetaData&nbsp;rsm;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;relist;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsm&nbsp;=&nbsp;rs.getMetaData();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relist&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;entity&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;propertyMap&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(voclass&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propertyMap&nbsp;=&nbsp;BeanFieldCache.getPropertyMap(voclass);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(propertyMap&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propertyMap&nbsp;=&nbsp;BeanFieldCache.register(voclass);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(rs.next())&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(voclass&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vo&nbsp;=&nbsp;voclass.newInstance();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">1</span><span>;&nbsp;i&nbsp;&lt;=&nbsp;rsm.getColumnCount();&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//2007-10-17&nbsp;Fly_m&nbsp;update&nbsp;here&nbsp;must&nbsp;not&nbsp;toLowerCase&nbsp;for&nbsp;some&nbsp;Property&nbsp;should&nbsp;be&nbsp;uppderCase&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;columnRealName&nbsp;=&nbsp;rsm.getColumnName(i);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;columnName&nbsp;=&nbsp;columnRealName.toLowerCase();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(voclass&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!columnName.equalsIgnoreCase(</span><span class="string">&quot;rownum&quot;</span><span>)&nbsp;&amp;&amp;&nbsp;!columnName.equalsIgnoreCase(</span><span class="string">&quot;rownum_&quot;</span><span>)&nbsp;&amp;&amp;&nbsp;!columnName.equalsIgnoreCase(</span><span class="string">&quot;count_&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;ConvertUtil.outPortData(rs,&nbsp;columnRealName,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;voclass);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyUtil.setProperty(vo,&nbsp;propertyMap.get(columnName),&nbsp;value);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;rs.getObject(i);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity.put(columnName,&nbsp;value);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(voclass&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relist.add(vo);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relist.add(entity);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;relist;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">这样就实现了不同格式列名与属性之间的映射关系了.</font></p>
<p><font face="Arial">这个框架是自从跟导师在一起学习的时候就在运用这个框架,当然它的若能远远不及hibernate等orm框架.不过在进行简单的开发上面,还是不错了.现在仍然在用,是因为实习的公司要求用这个,(因为导师跟公司的关系很好,框架都是导师介绍过去的).在运用的过程中,发现新的问题,也想要去解决它.可能是这个框架不太成熟吧,导致它有太多的bug了,不过对于现在的学习还是不错的.尤其是对于它的属性映射,及sql语句的动态生成,了解一下,对hibernate之类的框架的工作原理还是有一定帮助的. 在跨平台上,也可能有一些值得借鉴的地方. 我最欣赏的还是框架对于分页的处理.在hibernate中,需要配置不同的dialect属性,才能运用数据库自身的分页功能,而speed则尝试自己获得数据库的属性,然后根据不同的数据库属性采用特定于数据库的分页方式.其底层原理和hibernate都是差不多的.任何框架,只会用,而不知其所以然,到头来也是什么也不知道,了解多一些,自己掌握多一些总是好的.</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://fly-m.javaeye.com/blog/149025#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, 18 Dec 2007 00:56:43 +0800</pubDate>
        <link>http://fly-m.javaeye.com/blog/149025</link>
        <guid>http://fly-m.javaeye.com/blog/149025</guid>
      </item>
      <item>
        <title>一种简单的json解析方法</title>
        <author>Fly_m</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fly-m.javaeye.com">Fly_m</a>&nbsp;
          链接：<a href="http://fly-m.javaeye.com/blog/141590" style="color:red;">http://fly-m.javaeye.com/blog/141590</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在前面的新闻系统设计中,常常会用到有关ajax的请求,如对文章类别的动态调用.本来struts2提供了一个json的插件,不过在开发的时候还不知道.自己写了一个,还将就吧.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本原理,就是改变struts2的返回类型,原来的返回类型为string,如果返回类型为void即不返回任何类型,而改由struts2的的ServletContext对象获得用到输出的out对象,将json对象输出到页面上,同样可以达到ajax格式效果.最后在页面上作了小小的操作,将json格式的字符串变成js对象进行调用,以完成相应操作.流程如下:</p>
<ol>
    <li>获得response对象,进行获得printWriter对象 </li>
    <li>将想要返回给页面上的对象转化成json格式的字符串 </li>
    <li>由printWriter将json字符串写到页面输出流(通常是被js来获得结果) </li>
    <li>页面处理json字符串,转化成js对象,传入回调函数进行调用 </li>
</ol>
<p>这里主要用到几个对象ServletContext(这个是struts2的工具对象,可获得request,response等对象),JsonUtil(自己写的一个类,用到转化对象),protype.js(用到提交ajax请求,接收返回结果),此外,还有一个jsonUtil的辅助类BeanUtil(用到将javaBean转化成map对象).这里主要贴出jsonUtil的转换方法和BeanUtil的辅助方法,看这种方式是否合适.<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JsonUtil&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;JsonUtil()&nbsp;{} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;isSimpleType(Class&nbsp;clazz)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;clazz.isPrimitive()&nbsp;||&nbsp;String.</span><span class="keyword">class</span><span>.isAssignableFrom(clazz)&nbsp;||&nbsp;Number.</span><span class="keyword">class</span><span>.isAssignableFrom(clazz) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;java.util.Date.</span><span class="keyword">class</span><span>.isAssignableFrom(clazz)&nbsp;||&nbsp;Boolean.</span><span class="keyword">class</span><span>.isAssignableFrom(clazz) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;Character.</span><span class="keyword">class</span><span>.isAssignableFrom(clazz); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;convertToJson(Object&nbsp;obj)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonHandle&nbsp;jsonHandle&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JsonHandle(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;jsonHandle.convertToJson(</span><span class="number">0</span><span>,&nbsp;obj).toString(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JsonHandle&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;DEFAULT_DEPTH&nbsp;=&nbsp;</span><span class="number">10</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;StringBuffer&nbsp;convertToJson(</span><span class="keyword">int</span><span>&nbsp;depth,&nbsp;Object&nbsp;obj)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(obj&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;null&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(isSimpleType(obj.getClass()))&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>((obj&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;String)&nbsp;||&nbsp;(obj&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;java.util.Date))&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;\&quot;&quot;</span><span>).append(obj).append(</span><span class="string">&quot;\&quot;&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(obj&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;Character)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;'&quot;</span><span>).append(obj).append(</span><span class="string">&quot;'&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(obj); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(obj&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;Collection)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;hibernateFlag; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((Collection)&nbsp;obj).size(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibernateFlag&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>(Exception&nbsp;ex)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibernateFlag&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(hibernateFlag)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;[&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(Iterator&nbsp;iterator&nbsp;=&nbsp;((Collection)&nbsp;obj).iterator();&nbsp;iterator.hasNext();)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(convertToJson(depth,&nbsp;iterator.next())); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(iterator.hasNext())&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;,&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;]&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;null&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(obj.getClass().isArray())&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;[&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;max&nbsp;=&nbsp;java.lang.reflect.Array.getLength(obj); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;max;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(i&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;,&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(convertToJson(depth,&nbsp;java.lang.reflect.Array.get(obj,&nbsp;i))); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;]&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(java.util.Map.</span><span class="keyword">class</span><span>.isAssignableFrom(obj.getClass()))&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;{\n&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(Map.Entry&nbsp;e&nbsp;:&nbsp;((Map)&nbsp;obj).entrySet())&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!(e.getKey()&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;String))</span><span class="comment">//如果键值不是字符串,则跳过. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(e.getKey()).append(</span><span class="string">&quot;:&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(depth&nbsp;&lt;=&nbsp;DEFAULT_DEPTH)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(convertToJson(depth&nbsp;+&nbsp;</span><span class="number">1</span><span>,&nbsp;e.getValue())); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;undefined&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;,&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(sb.length()&nbsp;&gt;&nbsp;</span><span class="number">3</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.deleteCharAt(sb.length()&nbsp;-&nbsp;</span><span class="number">1</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">&quot;\n}&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;=&nbsp;BeanUtil.getPropertiesByReflect(obj); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>(Exception&nbsp;ex)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(convertToJson(depth,&nbsp;map)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;sb; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
以及辅助类:<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BeanUtil&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;Creates&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;BeanUtil&nbsp;*/</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;BeanUtil()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Map&nbsp;getPropertiesByReflect(Object&nbsp;obj)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(obj&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields&nbsp;=&nbsp;obj.getClass().getDeclaredFields(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(fields&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;fields.length&nbsp;==&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccessibleObject.setAccessible(fields,&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(Field&nbsp;field&nbsp;:&nbsp;fields)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!field.getName().equals(</span><span class="string">&quot;serialVersionUID&quot;</span><span>)&nbsp;&amp;&amp;&nbsp;field.getAnnotation(Fly_m.</span><span class="keyword">class</span><span>)&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(field.getName(),&nbsp;field.get(obj)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(map.size()&nbsp;&lt;&nbsp;</span><span class="number">1</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;map; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在JsonUtil里,主要对一个对象进行分析,采取不同的策略对不同类型的对象进行递归性地转化.对应集合类型,采用迭代地方式.而进行通用的javaBean对象,则先将其转化成一个map对象,然后再进行转化.在本程序中,用到了一个转化深度地概念,主要是防止某些类地无限属性或者递归属性.考虑到并不需要将对象中的每一个属性进行转化,这里引入了一个相当于Traisient的注释@Fly_m,作用到字段上(因为对javaBean的解析是以反射来解析的).如果解析的属性存在这个注解,则被忽略.(一开始想要transient的modifier属性,发现与hibernate相冲突(hiberante对于transient的属性也不会解析?).</p>
<p>#-----------------------------<br />
在客户端,我采用protype.js提供的基本的ajax调用方法Ajax.Request(action,{method,parameters,onComplete,onException)这种访求进行服务器请求,同时写了一个小小的辅助js进行调用,以方便页面调用.Fly_m.js,使用这个js后,通常的调用被简单化为m_ylf.invoke(actionName,method,parameters,callBack).这样,只需要四个参数,同时内置调试参数设置,以及传递给callBack对象的不再是一个xmlHttpRequest对象,而是一个已经eval好的js对象,让使用更加方便.源码如下:<br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;m_ylf&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{}; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>m_ylf.defaultPath&nbsp;=&nbsp;</span><span class="string">&quot;js&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.preDebug&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>m_ylf.postDebug&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.prefix=</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.setPrefix&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(pre)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;m_ylf.prefix&nbsp;=&nbsp;pre; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.setPreDebug&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(pre){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;m_ylf.preDebug&nbsp;=&nbsp;pre; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.setPostDebug&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(post)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;m_ylf.postDebug&nbsp;=&nbsp;post; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.handleException&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(exception)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</span><span class="string">&quot;Error&nbsp;-&gt;&nbsp;&quot;</span><span>&nbsp;+&nbsp;exception.message); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>m_ylf.invoke&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(actionName,&nbsp;param,&nbsp;callBack)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(arguments.length&nbsp;!=&nbsp;3) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>&nbsp;callBack&nbsp;!=&nbsp;</span><span class="string">&quot;function&quot;</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callBack&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{}; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(actionName&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;actionName&nbsp;==&nbsp;</span><span class="string">&quot;&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;params&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(param&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;param&nbsp;==&nbsp;</span><span class="string">&quot;&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;param; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(m_ylf.preDebug) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(params); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;action&nbsp;=&nbsp;actionName&nbsp;+&nbsp;</span><span class="string">&quot;.p&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(m_ylf.prefix&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;m_ylf.prefix&nbsp;!=&nbsp;</span><span class="string">&quot;&quot;</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action&nbsp;=&nbsp;m_ylf.prefix&nbsp;+&nbsp;action; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;Ajax.Request(action, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{method:</span><span class="string">&quot;get&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters:params,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onComplete:</span><span class="keyword">function</span><span>(data)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&