服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用java进行web开发的随想


  我朋友经常引用我的一句话就是:你的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" 
 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>j2j</shortname> <uri>/j2j</uri> <tag> <name>newobject</name> <tagclass>net.vlinux.tag.j2j.newobject</tagclass> <bodycontent>jsp</bodycontent> <info></info> <attribute> <name>distname</name> <required>true</required> </attribute> <attribute> <name>dist</name> <required>true</required> </attribute> <attribute> <name>scope</name> <required>true</required> </attribute> <attribute> <name>source</name> <required>true</required> </attribute> </tag> </taglib>

  具体调用的jsp页面

  代码

<%@ taglib uri="/web-inf/j2j.tld" prefix="jj"%>
 <% 
//创建一个简单对象
net.vlinux.test.user user = new net.vlinux.test.user();
user.setid(new integer(1));
user.setname("vlinux");
user.setpassword("lovefs");
user.setusername("oldmanpushcart");
//把对象放到request中去
request.setattribute("user",user);
%>


<!--
这里要注意
dist是目标javascript对象,这个是必须和web设计人员事先约定好的
distname 是目标javascript对象实例的名,这个也是必须和web设计人月事先约定好
scope 告诉标签去那个范围寻找java对象的实例
source 源对象,也就是java对象,标签会通过scope确定的范围搜寻source
-->
<jj:newobject dist="user" distname="user" scope="request" source="user"/>

  这样我们就得到这样的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支持....

扫描关注微信公众号