使用AJAX而不是TagLib?

时间:2008-10-29 14:06:57

标签: java annotations taglib

我在考虑使用Ajax而不是TagLib的想法。最优雅的方式是:使用Java Annotation。 这个想法是,设计师或任何人都可以制作没有任何taglib的HTML,只需使用带有id或name的“标准”HTML标签,并调用Javascript。这样可以使用任何WYSIWYG,开发人员不必关心HTML格式或其设计方式。 在许多(至少是开源)中,WYSIWYG不会在最终结果中显示taglib(或者有一个模板),因此很难“预览”。其他原因是,开发人员应该知道Java和HTML / TagLibs不应该是必须的,因为我们有CSS和AJAX。

应该就是这样:

MyClass.java

import ...

// Use the ResourceBundle resource[.{Locale}].properties
@Jay2JI18n(resourceBundle="org.format.resource",name="MyClassForm")
public class MyClass {
    private Integer age;
    private String name
    private Date dob;
    private salary;

    @Jay2JLabel(resource="label.name")
    @Jay2JMaxLength(value=50,required=true,)
    @Jay2JException(resource="exception.message")
    public String getName() {
         ...
    }
    public void setName(String name) {
        if ( name.trim().equal("") ) {
            throw new Exception("Name is required");
        }
    }
    /* Getter and setter for age */
    ...
    @Jay2JLabel(message="Salary")
    @Jay2JFormat(format="##,###.00",language="en")
    @Jay2JFormat(format="##.###,00",language="pt_BR")
    // or you could use that to access a property of the ResourceBundle
    //@Jay2I18nResource(resource="money.format")
    public Date getSalary() {
        ...
    }
    /* Setter for salary and getter/setter for the rest */
    ...
}

import ... // Use the ResourceBundle resource[.{Locale}].properties @Jay2JI18n(resourceBundle="org.format.resource",name="MyClassForm") public class MyClass { private Integer age; private String name private Date dob; private salary; @Jay2JLabel(resource="label.name") @Jay2JMaxLength(value=50,required=true,) @Jay2JException(resource="exception.message") public String getName() { ... } public void setName(String name) { if ( name.trim().equal("") ) { throw new Exception("Name is required"); } } /* Getter and setter for age */ ... @Jay2JLabel(message="Salary") @Jay2JFormat(format="##,###.00",language="en") @Jay2JFormat(format="##.###,00",language="pt_BR") // or you could use that to access a property of the ResourceBundle //@Jay2I18nResource(resource="money.format") public Date getSalary() { ... } /* Setter for salary and getter/setter for the rest */ ... }

page.html中

<html>
  <head>
    <SCRIPT>
    </SCRIPT>
  </head>
  <body>
     <form onload="Jay2J.formalize(this)">
     </form>
  </body>
</html>

它可以是填充字段的HTML; 的 PageWithFields.html <html> <head> <SCRIPT> </SCRIPT> </head> <body> <form onload="Jay2J.formalize(this)"> </form> </body> </html>

这样Annotation(没有XML,就像HTML只是另一个文件修改而XML不是Java的方式)将定义如何处理HTML。这样开发人员可以停止使用HTML开发并只使用JAVA(或JavaScript),你认为这是一个有效的想法吗?

4 个答案:

答案 0 :(得分:2)

当我看到你的主题标题时,我想:

您无法使用Ajax代替taglib。 AJAX是客户端上的javascript,而taglib是服务器上的java代码。

读完你的帖子之后我想,啊他怎么做[链接文字] [1]呢

但后来却没有相同的说法。

[1]:http://code.google.com/webtoolkit/ GWT

答案 1 :(得分:1)

第一印象是......哎呀,如果不学习你的(新的,不同的,非标准的)做事方式,选择这个的人就不会知道他们在看什么。您可以通过实现带有bean(值对象)的标记来执行类似的操作,并且可能会执行一些小的反射/注释检查以发出正确的html,并且您将为自己节省很多心痛。

让你的价值对象实现一个简单的界面,你的标签将用它来提取和格式化html,你可能会得到80-90%的你想要的工作量减去1/2或更少。< / p>

答案 2 :(得分:1)

第一印象是,WTF。在进一步阅读之后,我得到的印象是你试图以不同的方式解决“关注点分离”问题。关于你的方法的一些观察。

  1. 需要启用客户端脚本,因此无法访问辅助功能指南。
  2. 重新发明轮子:像Tapestry,Wicket这样的许多网络框架试图解决这些问题,并做了值得称道的工作。
  3. 关于将Java绑定到HTML的注释,代码示例并没有非常清楚地传达这个想法。 formalize()似乎创建了UI,这意味着您将UI(HTML)编码为java(糟糕的想法?可能不是NakedObjects会尝试使用UI的域模型,如果有人编写特定于页面的代码,则可能是的)
  4. 在onSubmit()上调用validate(),为什么我要异步处理它!除此之外,使用阻碍的java脚本是不合时宜的(再次分离关注点)
  5. 关于阻止WYSIWIG的taglib的论点虽然合理,但并不完全有效。标签不能用于撰写其他标签,每个标签都是一个独特的实体,可以处理行为或发出一些HTML代码。你的论证对第二种情况有效。但是,如果我理解你的formalize(),你也是这样做的!
  6. 很高兴听到一些新想法,欢迎来到SO。此外,请使用编辑问题选项,直到您获得足够的声誉来添加评论。添加答案不是正确的方法!

答案 3 :(得分:1)

如果我理解正确,这个想法有一些优点。

您可以使用AOP修改实际为页面调用的servlet。然后,servlet将使用注释返回html。

这样程序员看不到html生成,如果你有一个标准的javascript库,那么它可能会有效。

但是,仅仅因为它起作用并不意味着你应该这样做。

如上所述,有许多框架可以隐藏程序员的javascript,例如JSF,它基本上是taglibs和不同的导航方案。

我记得使用蜂箱项目做类似的事情,它是注释驱动的所以我基本上可以用java做一切,并且它在几年前生成了javascript。 :)