论坛首页 Java企业应用论坛

使用Java进行web开发的随想

浏览 13376 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-03  
OO
小子自学Java已经一载有余,当然是和大大们不能相比。然而偶在用Java进行web开发的时候,不管是用什么web框架(Struts、SpringMVC...等等)都会让和我一起搭档的Javascript朋友头痛不已--她不会Java,看不明白Java的标签,而且在修改web页面的时候总是拉我陪他通宵,否则就不知道那个标签是不能修改的。我那个累啊~

我朋友经常引用我的一句话就是:你的Java对我的Javascript是侵入的.... T_T,仿佛她比我还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><br>
<script>document.writeln(user.name);</script><br>
<script>document.writeln(user.username);</script><br>
<script>document.writeln(user.password);</script><br>


输出内容
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支持.... T_T


以上是我对用java进行web设计的一些随想,谈不是感悟... 没有写过大的项目,不知道大的项目如果采用这样的方式开发会有什么影响。欢迎各位大大拍砖。
   发表时间:2006-10-03  
你的帖子看了一下
不知道你们开发情况是什么样子的
觉的你们页面设计还是有设计问题
现在师傅说,前台只是单纯的显示数据,不做逻辑控制。
觉你们也应该这样试试。
还有前台,引入java代码,本身就有问题(个人认为)。
但是有人说可以,是一些处理简单化。现在不觉的。只觉的逻辑混乱!

0 请登录后投票
   发表时间:2006-10-03  
前台的确是只作显示数据,数据全部在JS对象里面
前台没有引入JAVA代码呀,相反如果按照以前的WEB框架那才叫做前台引入了JAVA呢,我是把JAVA对象专写成为JS对象哦
0 请登录后投票
   发表时间:2006-10-03  
你们前台Ajax用的很多么?要大量使用JavaScript?

没有使用过JavaServer Pages Expression Language么?

<jsp:useBean id="person" class="com.apress.projsp.Person" scope="request">
<jsp:setProperty name="person" property="*"/>
</jsp:useBean>

...

<table border="1">
  <tr>
    <td>${person.name}</td>
    <td>${person.age}</td>
    <td>&nbsp;</td>
  </tr>
</table>


Expression Language的语法可一点不难学,比JavaScript还简单。

在网页中大量使用document.write对搜索引擎很不好,而且网页的结构也混乱,网页也没必要的大了很多,除非Ajax有特殊要求。

从你给的例子来看,用jsp standard action和Expression language(EL)可以完全满足你的要求。先商量好User应该有什么样的属性,然后个干个的。
0 请登录后投票
   发表时间:2006-10-03  
谢谢你的提示,JSF我现在还没有列入我的学习计划,目前正打算看看Tapestry4,不知道同样作为面向组件的框架会不会有和JSF类似的特性呢?

我们的前台用AJAX的地方不多,主要就是负责前台设计的人员精通JS,而他们又不想学JAVA,而EL需要另外学,好学不好学我不知道...不过想让她另外学点其它东西她可能打死也不乐意 T_T

至于搜索引擎~~恩,的确是个问题哈...
0 请登录后投票
   发表时间:2006-10-03  
学习EL/JSTL 感觉与学习JSF没有太多联系,EL只是jsp2.0的一个新东东。非常简单啊,你把数据对象封装进request中。EL可以很方便的操作的
bigpanda 的列子还可以简单。EL可以从各个Scope中读取对象。
比如你在控制器中
 request.setAttribute("_USER",user);

在表示层可以直接
 ${user.username}
,EL会自动在request中找到user对象并输出相应的值啊,非常方便的。
0 请登录后投票
   发表时间:2006-10-03  
vlinux 写道
谢谢你的提示,JSF我现在还没有列入我的学习计划,目前正打算看看Tapestry4,不知道同样作为面向组件的框架会不会有和JSF类似的特性呢?

我们的前台用AJAX的地方不多,主要就是负责前台设计的人员精通JS,而他们又不想学JAVA,而EL需要另外学,好学不好学我不知道...不过想让她另外学点其它东西她可能打死也不乐意 T_T

至于搜索引擎~~恩,的确是个问题哈...


呵呵,我可能某些地方写的不够清楚让你误解了。EL在JSP 1.2的时候就有了,那时还没有JSF呢。EL在JSP中可以直接用,不用扯上JSF。

EL的语法是从JavaScript和XPath Expression Language借鉴来的,非常简单。最新的EL Specification才120多页。相比之下JSP的Specification将近600页。一本书讲JSP的,讲EL不过才40页。所以EL好学,绝对好学。

至于怎么说服别的开发人员么,完全是另外个问题了。自己先要掌握好,向别人阐述优点时才能头头是道,增大说服力。

0 请登录后投票
   发表时间:2006-10-03  
JSF的EL有了新改变,加入了#{bean.value}而不是${bean.value},好处可能是更好的满足组装模型的需要。
目前JSF应用还是应该走Jboss Seam这种组合路线,就是Seam一定要扯上有状态bean,看着吓死人的。
0 请登录后投票
   发表时间:2006-10-03  
花花公子 写道
JSF的EL有了新改变,加入了#{bean.value}而不是${bean.value},好处可能是更好的满足组装模型的需要。目前JSF应用还是应该走Jboss Seam这种组合路线,就是Seam一定要扯上有状态bean,看着吓死人的。


JSF 1.0里面是这样的,那时JSP 2.0的EL不符合JSF的需求,结果导致JSP 2.0的EL和JSF 1.0的EL有区别。

这种情况在最新的JSF 1.2和JSP 2.1里面已经改过来了。在JSF 1.2里,javax.faces.el已经deprecated了。JSF和JSP共享一个EL。

详情请见JSR 252,Expression Language Specification Version 2.1,Preface,Historical Note。

JSF和JBoss Seam以后再聊吧,省得跑题了。 
0 请登录后投票
   发表时间:2006-10-04  
汗,不好意思,因为平常看到“EL“表达式都是小写的"el"所以你一时间用大写偶还以为是个新技术来着~郁闷~

刚才看了下Tapestry,发现Tapestry也能脱离Servlet容器直接预览整个WEB页面,而且采用的是标准的HTML标签<span>,恩恩,非常的不错。继续往下看,不知道还有什么新的花样~

对了,说一下Tapestry一个让偶不爽的地方,我每次修改HTML页面的时候他总是不会重新编译,总是从内存POOL中拿出一个已经载入内存的旧页面来应付我,我那个郁闷阿。现在只要修改一点点地方都必须要重新启动容器,真是浪费偶的时间。而且Tapestry把页面吞入内存这样的做法如果页面数量很多,而且内容庞大的时候不是非常占用内存么?
还是偶的使用方法不对头???
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics