<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>helyho</title>
    <description>Hocate 开源项目
让开发变得简单,让使用变得自然....</description>
    <link>http://helyho.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>如何让JSON穿梭在服务器于浏览器之间</title>
        <author>helyho</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://helyho.javaeye.com">helyho</a>&nbsp;
          链接：<a href="http://helyho.javaeye.com/blog/166660" style="color:red;">http://helyho.javaeye.com/blog/166660</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>如何让JSON穿梭在服务器于浏览器之间</strong><br />一个新的轮子,现在网络上充斥这一大堆的轮子.我也做了一个.一半是研究,一半是想做给自己用<br />目前实现的功能<br />1 <strong>JSON转换成java对象</strong>(按一定的规则提交)<br />  什么意思呢,就是你能够将你在浏览其中提交的JSON直接转换成一个java对象供应用程序调用<br />  <br />2 <strong>java对象转换成JSON</strong><br />  可以将servlet中的java对象转换成一个JSON对象给浏览器中的js调用,而如果在浏览器中调用这个JSON的一些方法.那么调用的其实就是java对象的方法,那么就相当于你在servlet中调用了这个java对象的方法.<br />  举个简单的例子:<br />     java对象的定义代码<br />     <pre name="code" class="java">
     public class  testObject 
     {         
		   String prot1;
		   String showProt1()
		   {
		       //在控制台输出prot1的值
			   System.out.println(prot1);
			   //返回prot1的值
			   return prot1;
		   }
		   void setProt1(String prot1)
		   {
			   this.prot1 = prot1;
		   }
		   void String getProt1()
		   {
			   return prot1;
		   }
	  }
	  </pre><br />	  实例化java对象并将其提供给浏览器获取的java代码<br />	  <pre name="code" class="java">
	     //实例化对象
	     testObject to = new testObject();
	     //提供对象给浏览器调用
	     //第一个参数为浏览器中获取java对象对应的JSON对象的别名
	     //意思就是在浏览器里可以通过$ha.getObject("testObject")来获得to对象的JSON代码
	     this.putReturnObject("testObject",to);
	  </pre><br />      通过上面的简单代码你就可以通过以下的语句来采用hocate框架获得testObject对象的实例to的JSON映射<br />      js代码:<br />      <pre name="code" class="java">var JSTO = $ha.getObject("testObject");</pre><br />      接着你可以通过调用JSTO.prot1来获取java对象中prot1中的值<br />      也可以通过var prot1 = JSTO.showProt1();来获得,接着你会看到你的servlet的控制台会有prot1的值的输出,实际上<br />      他是在你的servlet中调用了to对象的showProt1方法(to.showProt1()).<br />      那么就实现了在脚本中编写对java对象的操作的代码和在java程序里编写对java对象操作的代码相同的目的<br />      <br />3  <strong>浏览器中的简单引用</strong><br />   实际应用中不需要想DWR或者其他框架那样引用一个java对象的js脚本,而是你在servlet中配置好相应的要为浏览器提供的java对象,<br />   就可以通过$ha.getObject来完成对象的获取.并可以直接使用和java对象相同的方法,总的来说编码的过程中是不需要引用特定脚本的.<br /><br />4 <strong>对属性的绑定.</strong><br />  在使用的过程中你可以通过为任意Form标签或者Form内的可输入标签增加bind属性将这些标签中的值绑定到相应的JSON对象上.<br />  例如你有一个登陆form,需要提供username,password两个参数<br />  那么你可以使用为form标签增加bind属性将其绑定到一个特定的JSON对象上<br />  或者为form中的&lt;input>标签增加bind属性将其绑定到一个特定的JSON对象的一个特定的属性上<br />  例子:<br />     登陆java对象的定义<br />     <pre name="code" class="java">
     public class  loginData 
     {         
		   String username;
		   String password两个参数;
		   //省略若干set/get方法......
	  }
	 </pre><br />	 实例化java对象并将其提供给浏览器获取的java代码<br />	 <pre name="code" class="java">
		 //实例化对象
		 loginData ld = new loginData();
		 //提供对象给浏览器调用
		 //第一个参数为浏览器中获取java对象对应的JSON对象的别名
		 //意思就是在浏览器里可以通过$ha.getObject("loginData")来获得ld对象的JSON代码
		 this.putReturnObject("loginData",ld);
	 </pre><br />    如果你的这个JSON对象是通过$ha.getObject获得的那么你就可以在页面中通过bind属性的自动绑定够能修改这个 <br />    JSON中的数据,而将这个JSON提交到servlet中的时候就会相应的修改servlet中的java对象的值.你所要做的就是<br />     $ha.getObject获取对象,然后bind值,然后将这个JSON提交出去.<br />	 js代码获得一个java对象loginData的JSON实例<br />	 <pre name="code" class="java">
	    var loginData = $ha.getObject("loginData");
	 </pre><br />	 页面代码<br />	 <pre name="code" class="java">
		&lt;form bind="loginData">
			&lt;input id="username" type="text">
			&lt;input id="password" type="password">
		&lt;/form>
	 </pre><br />     那么实际使用中当用户在id为username的input元素上输入数据的时候会相应的修改JSON对象loginData中username中的数据<br />     那么在登陆的时候就可以直接发送loginData这个JSON对象给服务器,那么在服务器中你就可以获得一个实例化好的loginData的java对象<br />  <br />5 <strong>自动验证体系</strong><br />   对EMail.数字.等等的自动验证<br />   &lt;input name="text2" type="text" id="validate" datatype="Email" autovalidate="true" /><br />   通过增加datatype属性和autovalidate属性<br />   那么在提供$hv.error和$hv.correct的callback函数可以自动的验证客户的输入是否合法<br />   这两个回调函数都回传入一个参数,那个就是被验证对象的ID属性<br />   <pre name="code" class="java">
		//验证函数
		$hv.error = function(v1)
		{
			alert(v1+"中的参数不正确!");
		}
		$hv.correct = function(v1)
		{
			alert(v1+"中的参数正确!");
		}
   </pre><br />   当用户输入的数据为合法的Email字符串的时候,就会调用$hv.correct中的回调函数,接着弹出一个提示框显示提示.<br />   当用户输入的数据为非法的Email字符串的时候,就会调用$hv.error中的回调函数,接着弹出一个提示框显示提示.<br />   而你也可以通过$hv.validated('validate')的方法来手工验证数据.<br />   <br />6 <strong>JSON对象的调用验证</strong><br />  这里所说的JSON对象是指你用servlet中获得的java对象的一个JSON映射<br />  例子请参照(2)中的那个例子.<br />  由于java对参数的要求是很严格的.所以参数类型必须符合定义中的规范<br />  而通过JSON提交上去的参数如何验证呢?<br />  hocate ajax框架提供了客户端的验证能力<br />  1 验证参数类型是否正确<br />  2 验证参数个数是否正确<br />  例如(2)中的例子<br />  调用JSTO.setProt1(...)方法<br />  如果你提供里一个JSTO.setProt1()无参数调用,那么在验证参数个数的时候就会在浏览器中报错,因为这个方法是需要一个String作为参数的<br />  如果你提供JSTO.setProt1(Object)调用就会验证你的这个Object是否是String类型如果不是会报错.<br />  <br />7 <strong>为参数提供对象支持</strong><br />  例如有个从服务器获取的JSON对象test有一个方法setObject(testObject kkk),其中testObject是一个我们自己定义的java类.<br />  那么如何提交调用这个方法呢,在java中他传入的是一个java对象啊.<br />  我们可以通过var to = $hv.getObject('testObject');来获得一个testObject对象在浏览器中的JSON映射,接着我们用js为其填<br />  入相应的值.<br />  最后在调用方法的时候test.setObject (to);就可以将这个to对象提交到servlet中,servlet会自动把它转换成一个java的testObject对象供编程使用<br />  <br />不知道这个轮子大家满意不.我只是针对自己的使用习惯做了相应的功能开发.<br />大家提提意见<br />演示地址:http://www.hocate.org/ajaxdemo<br />代码和引用的包请到svn://www.hocate.org/hocate/中checkout<br />/src/ajax-js中是需要引用的js库<br />/hocate.jar是需要在java项目中引用的java包
          <br/>
          <span style="color:red;">
            <a href="http://helyho.javaeye.com/blog/166660#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Mar 2008 16:40:23 +0800</pubDate>
        <link>http://helyho.javaeye.com/blog/166660</link>
        <guid>http://helyho.javaeye.com/blog/166660</guid>
      </item>
  </channel>
</rss>