用户操作
[即时聊天] [发私信] [加为好友]
wanghailongID:buaawhl
102512次访问,排名919,好友0人,关注者1人。
buaawhl的文章
原创 49 篇
翻译 0 篇
转载 0 篇
评论 152 篇
最近评论
bruce_lau:看看这个解决方案,对象的缓存和jive差不多,列表也是选id,但是对列表还有缓存,还可以根据字段作散列列表缓存,这样列表的缓存命中率非常高,是一个比较好的数据库缓存解决方案。参见http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html
yipeng6213:个人觉得fastm真的很不错,我之前的模板是用velocity写的,我现在想把它转换成fastm的,但其中velocity模板中的if elseif else 怎么 用fastm替换呢?请问有没有具体的实例 给我参考一下,急!
lidaoguang00109:谢谢您的努力.
这个FastM我使用过了,觉得很不错.
容易上手,特别是可以直接用HTML观察模版的布局形态,有利于界面效果的评估.
现在有一个问题一直困扰我.
就是如果实现一个Table,每一个列被点击后都能排序,用FastM如何实现呢?每一次ValueSet DOM都要重新设置吗?
vkuja2003:楼主做学问的方法很值得学习
noia_zhou:我拜读了你的持久层和cache设计的一些文章,觉得想法很不错。我觉得现在的持久层框架还是挺复杂的,如hibernate等,单看看它10几兆的开发包就知道了,我的初步想法是利用po跟table的字段一致性,通过反射po得到要执行的sql。这样做的好处是少了很多表结构的配置文件。然后做一个简单dao来完成。这里我的想法是做两个dao,一个BaseDao,BaseChaheDao。其中两者都是 继……
文章分类
收藏
    相册
    友情blog
    http://smsbim.bokee.com/
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Web开发框架中的架构模式比较(二)收藏

    新一篇: Web开发框架中的架构模式比较(四) | 旧一篇: Web开发框架中的架构模式比较(三)

    Server Page (页面内容和逻辑)

    Server Page技术也可以称为服务端脚本技术。

    ASP.Net的服务端脚本语言包括VB.NetC#.NetJ#.NetJScript.Net。微软的IIS Web Server支持多种服务端脚本语言,是微软的战略决策之一。当然,既然这些Web服务程序的脚本只能运行在IIS Web Server中,那么也就只能运行在Windows平台上。这里有一点很值得注意,ASP.Net的服务端脚本的用法和JSP(还有后面提到的XSP)大不一样。ASP.Net的服务端脚本和页面元素之间的交互,如同客户端JavaScript一般。难怪,JScript.Net也被包括到服务端脚本之列。这种方式的优越性显而易见,ASP.Net程序员在处理一般的Web界面交互事件时,不用考虑很多HTTP Request – Response Cycle,而JSP(或XSP)程序员必须时时刻刻把这一点记在脑子里。JSP(或XSP)一般只用来动态生成网页,不进行事件处理。Java Web框架通常采取MVC (Model – View - Control)结构,页面交互转换的事件机制在Control部分实现。稍后会举例说明。

     

    JSP的服务端脚本语言包括Java。根据最新推出的JSP2.0规范(可从java.sun.com站点下载),可以看出,JSP力图向XML规范靠拢,并引入Expression Language和大量的TagLib,试图尽量把Java语言代码从JSP页面中清除出去,以解决JSP页面固有的Java Code Pollution问题。JSP页面现在确实好看了许多,更加结构化,更加清晰。但在我看来,不过是拿另一种脚本语言(TagLibExpression Language)来取代Java Code中的一部分功能罢了,副作用就是要求页面设计或编程人员多掌握一门语言。而且,在实际应用的要求中,要想使这门新语言达到java语言的灵活和强大,不是一件容易的事情,而且可能会令TagLibExpression Language越来越庞大复杂,难以掌握。稍后会举例说明。

     

    基于java的另一种Server Page技术是Apache Cocoon项目中的XSP技术。(如果需要进一步了解Apache CocoonXSP,请访问xml.apache.org站点)。Apache Cocoon项目大量使用SAX/XSLT技术。XSP用来为后续的转换处理管道Pipeline提供XML内容,而且XSP页面本身的生成,也要经过不少XSLT转换。XSP技术中也包括TagLib的概念,称为LogicSheet,表现形式也和JSP中相似,但实现原理完全不同。JSPTagLib通过Java Tag Extension Class实现,XSPTagLibLogicSheet)通过XSLT转换实现。XSP技术的LogicSheet机制能够把页面的内容和逻辑从物理上分离开,分成几个不同的文件。稍后会举例说明。

    ASP.Net的例子

    例子1。说明服务端脚本调用Page_Load()函数(ASP.Net的内嵌初始化函数)生成页面元素的例子,从.Net框架文档中摘出。

     

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>
    <HTML>
    <script runat="server">
       void Page_Load(Object sender, EventArgs e) 
       {
          DataTable dt = new DataTable();
          DataRow dr;
          dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
          dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
          dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
          dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));
          dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
          for (int i = 0; i < 9; i++) 
          {
             dr = dt.NewRow();
             dr[0] = i;
             dr[1] = "Item " + i.ToString();
             dr[2] = DateTime.Now;
             dr[3] = (i % 2 != 0) ? true : false;
             dr[4] = 1.23 * (i+1);
             dt.Rows.Add(dr);
          }
          MyRepeater.DataSource=new DataView(dt);
          MyRepeater.DataBind();
       }
    </script>
     
    <body>
       <h3>Data Binding with the HtmlAnchor</h3>
       <p>
       <form runat=server>
          <asp:Repeater id="MyRepeater" runat="server">
             <ItemTemplate>
                Link for
                <a href='<%# DataBinder.Eval(Container,
                             "DataItem.StringValue",
                             "detailspage.aspx?id={0}") %>' 
                   runat="server">
                   <%# DataBinder.Eval(Container, "DataItem.StringValue") %>
                </a>
                <p>
             </ItemTemplate>
          </asp:Repeater>
       </form>
    </body>
    </HTML>

     

    例子2。说明web界面中的事件响应机制。并说明了如何在Web 窗体页中注册和声明自定义服务器控件。该控件的标记前缀是 Custom,它创建的类出现在 CustomWebFormsControls 命名空间中。它是使用 Custom:MyButton 标记在页的正文中声明的。我们可以看到TagLib的影子。

     

    <%@ Register TagPrefix="Custom" Namespace="CustomWebFormsControls" Assembly="CustomControls" %>

    <HTML>  

       <script language="C#" runat=server>

          private void Button_Click(Object sender, EventArgs e) {

             TextBox.BackColor = System.Drawing.Color.Green;

             TextBox.Text = "You clicked the button";

          }  

       </script>

       <body>     

          <form method="POST" action="MyButton.aspx" runat=server>

             Here is our custom button.<br>

             <Custom:MyButton id="Button"  OnClick="Button_Click"

                  runat=server/>

                <br>

                <br>

             <asp:TextBox id = "TextBox" Text = "Click the button"

                    Width = "200"  BackColor "Cyan" runat=server/>

             <br>     

          </form>        

        </body>        

    </HTML>

     

    JSP的例子

    例子1

    下面的文件是Apache Struts项目的struts-config.xml配置文件例子,从struts用户文档中摘录。Apache Struts采用MVC (Model – View - Control)结构。struts-config.xml是重要的Control部分的配置文件,定义页面之间的交互,相当于用户界面的事件机制。

     

    <struts-config>

        <form-beans>

            <form-bean

                name="logonForm"

                type="org.apache.struts.webapp.example.LogonForm" />

         </form-beans>

        <global-forwards

            type="org.apache.struts.action.ActionForward" />

            <forward

                name="logon"

                path="/logon.jsp"

                redirect="false" />

        </global-forwards>

        <action-mappings>

            <action

                path="/logon"

                type="org.apache.struts.webapp.example.LogonAction"

                name="logonForm"

                scope="request"

                input="/logon.jsp"

                unknown="false"

                validate="true" />

        </action-mappings>

    </struts-config>

     

    例子2。下面的JSP例子从JSP2.0规范中摘录,说明TagLibExpression LanguageJSP中看起来是什么样子。注意,<%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>,其中,JSTL表示JSP Standard Tag Library${x}${result}Expression Language的用法。

     

    <%-- page.jsp --%>

    <%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>

    <%@ taglib prefix=”my” tagdir=”/WEB-INF/tags” %>

    <c:set var=”x” value=”1”/>

    ${x} <%-- (x == 1) --%>

    <my:example var=”x”>

    ${x} <%-- (x == 2) --%>

    ${result} <%-- (result == null) --%>

    <c:set var=”x” value=”3”/>

    <c:set var=”result” value=”invisible”/>

    </my:example>

    ${x} <%-- (x == 4) --%>

    ${result} <%-- (result == ‘invisible’) --%>

    <%-- /WEB-INF/tags/example.tag --%>

    <%@ attribute name=”var” required=”true” %>

    <%@ variable alias=”result” name-from-attribute=”var” scope=”AT_BEGIN” %>

    <%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>

    ${x} <%-- (x == null) --%>

    ${result} <%-- (result == 1) --%>

    <c:set var=”x” value=”ignored”/>

    <c:set var=”result” value=”2”/>

    <jsp:doBody/>

    ${x} <%-- (x == ‘ignored’) --%>

    ${result} <%-- (result == 3) --%>

    <c:set var=”x” value=”still_ignored”/>

    <c:set var=”result” value=”4”/>

     

    XSP的例子

    下面的例子从Apache Cocoon项目的用户文档中摘录。说明LogicSheetXSP中的使用。LogicSheetXSP的作用,相当于TagLibJSP中的作用。JSPTagLib通过Java Tag Extension Class实现,XSPTagLibLogicSheet)通过XSLT转换实现。

    文件1XSP文件,greeting3.xml;文件2是LogicSheet文件,logicsheet.greeting.xsl;生成的结果是文件3greeting.xml。

     

    文件1 —— greeting3.xml

     

    <?xml version="1.0"?>

     

    <xsp:page

      xmlns:xsp="http://apache.org/xsp"

      xmlns:greeting="http://duke.edu/tutorial/greeting">

     

      <greeting>

        <greeting:hello-world/>

      </greeting>

     

    </xsp:page>

     

    文件2 —— logicsheet.greeting.xsl

     

    <?xml version="1.0"?>

    <xsl:stylesheet

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

      xmlns:xsp="http://apache.org/xsp"

      xmlns:greeting="http://duke.edu/tutorial/greeting"

      version="1.0">

     

    <xsl:template match="xsp:page">

     <xsl:copy>

      <xsl:apply-templates select="@*"/>

      <xsl:apply-templates/>

     </xsl:copy>

    </xsl:template>

     

    <xsl:template match="greeting:hello-world">

      <!-- more complex XSLT is possible here as well -->

      <xsp:logic>

        // this could be arbitrarily complex Java code, JDBC queries, etc.

        String msg = "Hello, world!";

      </xsp:logic>

      <xsp:expr>msg</xsp:expr>

    </xsl:template>

     

    <!-- This template simply copies stuff that doesn't match other -->

    <!-- templates and applies templates to any children.           -->

    <xsl:template match="@*|node()" priority="-1">

     <xsl:copy>

      <xsl:apply-templates select="@*|node()"/>

     </xsl:copy>

    </xsl:template>

     

    </xsl:stylesheet>

     

    文件3 —— 结果 greeting.xml

     

    <?xml version="1.0"?>

     

    <greeting>Hello, world!</greeting>

     

    注意,logicsheet.greeting.xsl文件,java代码嵌在<xsp:logic></xsp:logic>中间。XSP或者LogicSheet文件中的java代码中能够很自然地嵌入xml元素。而在JSP页面中,java代码和HTML元素交织在一起。

    页面控件重用

    正如前面所述,JSPXSP中的页面控件重用,主要通过TagLib机制对html元素进行封装,实现页面控件的重用。。比如,Struts重定义了几乎所有html元素标签;Sun公司提出了SP Standard Tag Lib标准;Apache Jakarta Taglibs项目提供了括JSTL在内的多类TagLib的实现。Apache Cocoon项目提供了一些内嵌的LogicSheet —— Request, Form等。用户自定义控件,需要继承实现Java Tag Extension Class ——javax.servlet.jsp.tagext.TagSupport

     

    有些java web框架走向另一个方向。SourceForge.netjava开源项目Echo是一个典型的例子。Echo不使用JSP,甚至不使用html,只使用ServletEcho提供了一组类似于Swing的接口,程序员可以象开发Applet程序一样写Web程序。Echo框架是事件驱动的框架。程序员书写的类Swing控件,会被Echo框架翻译成对应的html元素。用户自定义控件,只需要按照类Swing接口,生成自定义的控件类即可。

     

    ASP.Net的页面控件重用方式和TagLib机制类似。同时,ASP.Net又是事件驱动的框架,这一点和Echo框架类似。ASP.Net似乎找到了一个比较好的平衡点。ASP.Net定义了两组服务器控件 —— HTML服务器控件,和Web服务器控件。HTML服务器控件封装了简单的html页面元素,比如,formbuttoninput等;Web服务器控件封装了更为复杂多样的页面控件,比如,asp:Calendarasp:CheckBoxList等。HTML服务器控件在页面中的书写方法不带前缀,几乎和普通html页面元素一样,只是扩展了一些属性。Web服务器控件带有asp前缀。可以把HTML服务器控件类比为基本的TagLib,可以把Web服务器控件类比为扩展的TagLib。用户自定义控件需要继承System.Web.UI.WebControls.WebControl或者System.Web.UI. Control。并按照类似于TagLib声明的格式,写在页面文件中:<%@ Register TagPrefix= "myNameSpace" TagName="myUserControl" Src="userControl1.ascx" %>

    发表于 @ 2003年02月25日 17:40:00|评论(loading...)|编辑

    新一篇: Web开发框架中的架构模式比较(四) | 旧一篇: Web开发框架中的架构模式比较(三)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © buaawhl