我朋友经常引用我的一句话就是:你的java对我的javascript是侵入的....,仿佛她比我还oo来着。
我自己就提出了一个解决的方法:就是把java对象写成js对象,这样web设计人员只要关注js对象,用js对象来渲染整个web页面,这样我就不会和他的领域冲突了。
简单来说,我们平常的web框架都是号称mvc的,这样它们就把v这个事情压在了java程序员的身上,可怜我的审美观啊~所以我们应该把v继续往下推,推给对java什么都不懂,但是却有非常丰富的web设计人员的身上。总不能让别人去学java呀,那就只好把java对象写成js对象,这样web设计人员就可以轻松调用js了。
大体实现过程是这样的:
1、双方先讨论项目的需求,然后确定下个个页面需要显示什么内容,怎么显示不管。讨论完后便确定了js对象和数据库的大体结构。
2、各自写各自的东西...
3、双方写好后把web页面通过js对象和java连接起来,调试,完工。
具体关键代码:
j2j.java的代码,功能是获取scope范围内,名称为source的java对象,然后把这个java对象写成名称为distname类别为dist的js对象。
代码:
| /* * j2j.java * * created on 2006年10月2日, 下午7:16 * * to change this template, choose tools | template manager * and open the template in the editor. */ package net.vlinux.tag.j2j; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.lang.reflect.*; import java.util.*; /** * * @author vlinux */ public class newobject extends tagsupport { private string dist; private string distname; private string scope; private string source; private list<method> getgetmethods( object aobject ) { method[] array = aobject.getclass().getmethods(); list<method> list = new arraylist<method>(); for( int i=0;i<array.length;i++ ){ string methodname = array[i].getname(); if( methodname.matches("get.*") ) list.add(array[i]); } return list; } private string getfieldname( method amethod){ string methodname = amethod.getname(); string subname = methodname.substring(3,methodname.length()); return subname.tolowercase(); } private object getsourceobject(string scope, string source){ if( scope.equals("request") ){ return pagecontext.getrequest().getattribute(source); }else if( scope.equals("session") ){ return pagecontext.getsession().getattribute(source); }else if( scope.equals("page") ){ return pagecontext.getattribute(source); }else{ system.out.println("xxx"); return null; } } public int dostarttag(){ jspwriter out = pagecontext.getout(); object sourceobject = getsourceobject(getscope(),getsource()); list list = getgetmethods( sourceobject ); try{ out.println( "<script>" ); out.println( "/tvar " + getdistname() + " = new " + getdist() + "();"); for( int i=0;i<list.size();i++ ){ try{ string fieldname = getfieldname((method)list.get(i)); string value = ((method)list.get(i)).invoke( getsourceobject(getscope(),getsource())).tostring(); out.println( "/t"+getdistname() + "." + fieldname + " = /"" + value +"/""); }catch(exception e){ // } } out.println( "</script>" ); }catch( java.io.ioexception ioe){ // } return (eval_body_include); } public int doendtag(){ return (eval_page); } public string getdist() { return dist; } public void setdist(string dist) { this.dist = dist; } public string getdistname() { return distname; } public void setdistname(string distname) { this.distname = distname; } public string getscope() { return scope; } public void setscope(string scope) { this.scope = scope; } public string getsource() { return source; } public void setsource(string source) { this.source = source; } } |
标签的tld也一起给出吧,虽然不是关键
代码:
<?xml version="1.0" encoding="utf-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" |
具体调用的jsp页面
代码
<%@ taglib uri="/web-inf/j2j.tld" prefix="jj"%> <% |
这样我们就得到这样的html代码。
代码:
| <script> var user = new user(); user.username = "oldmanpushcart" user.name = "vlinux" user.id = "1" user.password = "lovefs" user.class = "class net.vlinux.test.user" </script> |
控制页面输出代码为,js程序员就是这样来渲染web页面的:
代码:
| <script>document.writeln(user.id);</script> <script>document.writeln(user.name);</script> <script>document.writeln(user.username);</script> <script>document.writeln(user.password);</script> |
输出内容:
1 vlinux
oldmanpushcart
lovefs
javatojs我喜欢叫她j2j.
j2j的优点在于:
1、java程序员和js程序员相互之间不会干扰,各自干各自的。
2、js程序员不用依赖java代码才能进行测试,相反,它们很早就可以通过构造一些js银弹来对页面情况进行测试了,开发速度一般比java部分还快。很多项目都是先弄个大体框架,然后再慢慢细调。这样效率低,而且也不方便和客户交流--客户喜欢看到实际的东西。如果是j2j就是一步到位。
3、方便日后的维护和替换--万一有一天我死了(t_t),我的朋友还可以找其他的web程序员进行维护,如果找不到java程序员,她甚至还可以找个asp程序员把我的代码全部重写而不用修改页面的任何地方--也许表单的action需要改一下。
4、天生支持ajax
当然,任何东西都是有缺点的,j2j的缺点在于:
1、不适合用来改写以前的代码,因为j2j的js对于其他页面来说是侵入的
2、http页面上会有大量的<script></script>段的存在,显得非常的不美观
3、没有ide支持....
闽公网安备 35060202000074号