??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文?lt;/title>
<style>
@media print{
INPUT {display:none}
}
</style>
</head>
<body>
<TABLE border="0" style="font-size:9pt;" width="300px" align="center">
<THEAD style="display:table-header-group;font-weight:bold">
<TR><TD colspan="2" align="center" style="font-weight:bold;border:3px double red">每页都有的表?lt;/TD></TR>
</THEAD>
<TBODY style="text-align:center"">
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR style="page-break-after:always;"><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR><TD>表格内容</TD><TD>表格内容</TD></TR>
<TR style="page-break-after:always;"><TD>表格内容</TD><TD>表格内容</TD></TR>
</TBODY>
<TFOOT style="display:table-footer-group;font-weight:bold">
<TR>
<TD colspan="2" align="center" style="font-weight:bold;border:3px double blue">每页都有的表?lt;/TD>
</TR>
</TFOOT>
</TABLE>
<input type=button value=" ??" onclick=javascript:window.print()>
</body>
</html>
以下是试验代码:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*" %>
<%@ taglib prefix="c" uri="<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文?lt;/title>
</head>
<%!
public static class TTT{
private String name;
public TTT(String name){
this.name = name;
}
public String getName(){
return name;
}
}
%>
<%
Map map = new LinkedHashMap();
map.put(new TTT("111"),"aaaaaa");
map.put(new TTT("222"),"bbbbbb");
request.setAttribute("map",map);
%>
<body>
<c:forEach items="${map}" var="item">
${item.key.name}-${item.value}<br/>
</c:forEach>
</body>
</html>
item内保存的是java.util.Map.Entry对象q个对象有getKey,setKey,getValue,setValueҎQ这样就可以在forEach内部使用map的key和value了?/p>
JSON概念很简单,是服务器直接生成Javascript语句Q客L获取后直接用evalҎ来获得这个对象,q样可以省去解析XML的性损失?/p>
例如Q?/p>
使用XML表示Q?/p>
使用JSONQ?/p>
JSON不仅减少了解析XML解析带来的性能问题和兼Ҏ问题,而且对于Javascript来说非常Ҏ使用Q可以方便的通过遍历数组以及讉K对象属性来获取数据Q其可读性也不错Q基本具备了l构化数据的性质。不得不说是一个很好的办法Q而且事实上google maps没有采用XML传递数据,而是采用了JSONҎ?/p>
JSON的另外一个优势是"跨域?Q例如你?a target="_blank">www.richweb.cn的网里使用
<script type="text/javascript" src="" target="_blank">http://www.yyy.com/some.js">
是完全可行的Q这意味着你可以跨域传递信息。而用XMLHttpRequest却获取不了跨域的信息Q这是Javascript内部的安全性质所限制的?/p>
JSON能完全取代XML吗?当然不能Q原因就在于XML的优势:通用性。要使服务器端生语法合格的Javascript代码q不是很Ҏ做到的,q主要发生在比较庞大的系l,服务器端和客L有不同的开发h员。它们必d商对象的格式Q这很容易造成错误?/p>
引自Q?a >http://www.richweb.cn/showthread.php?t=5
“Blog”是 Web Log 的简Uͼ译者注Q也?是网?中国大陆也叫博客)?/p>
它是一U作者与读者以日志风格q行交互的中介。在软gCQh们以|志形式来共享观念与思想变得来流行。如Qhttp://blogs.ccw.com.cn是CCW上的一?blogging。
建立|志最L的方法是什么?
要想建立自己的网志,最Ҏ的方法是到类?blogger.com q样的站Ҏ册一个新用户Q它提供一个创定义|志?Web 界面Qƈ且可以立即用所创徏的网志。类?blogger.com 的站Ҏ很多Q它们都提供对网志特性的支持?如果你想更多地控制网志的基础l构或者想要在自己的服务器上徏立网志服务系l。你可在以下最行的几U网志应用商业品中选择其一QRadio Userland、Manila ?Movable Type。还有些易用的免?.NET |志应用可以使用Q最行的有Q?TEXT ?dasBlog。只要把它们下蝲下来Q然后按照安装说明进行安装与讄Q分分钟便可建立起一个可q行的网志服务系l?
从功能上Ԍq两个基?.NET 的网志应用系l不怸下。其主要区别在于 .TEXT 需要数据库QSQL Server 或?MSDEQ而dasBlog 所有信息都存储?XML 文g中(它基于原来一些微软公司开发h员创建的 BlogX 框架Q,另一个差别是 .TEXT 在单个安装配|中可支持多个网志(比如现在?http://blogs.msdn.com 是如此Q,?dasBlog 要支持多个网志,必须q行多次安装。但 dasBlog 有一个很H出的特性,那就是“Mail to Weblog”,它允怽通过邮g来发布新信息?
新的 MSDN |志服务站点?PDC Bloggers 都是开始查扑օ于Y件开发主题的很好d。只要浏览这些站点之一便可阅读其经q聚合的预定内容。其预定的摘要会向你公开许多个h|志Q渐渐的你会自然而然地发C些你比较喜欢阅读的内宏V这P你便可以直接预定你最喜欢的个人网志摘要?
对于专门讨论 XML ?Web 服务的网志,h?MSDN Web Services Developer Center 上的清单Q我个h要花很多旉上这些网志站炏V
什么是 FeedQ以下称为提要)Q如何预定它Q
|志?RSS 文
形式为其内容提供一个提要,?RSS 文档可以通过众所周知 URL 获得。RSS 文档是一?XML 文gQ它包含大量L的新闻项Q如某个|志中的入口(RSS 提要的例子参?Figure 1Q。由?RSS ?XML 格式文gQ所以它很容易被其它E序所使用?
RSS 聚合器是一个读?RSS 文q显C新闻项的程序。大多数聚合器只要输?RSS ?URLQ得预定提要成为可能?
RSS 佉Kȝ志便得容易。大多数l常阅读|志的开发h员都使用某种cd的聚合器来帮助他们有效地{选提要内宏V聚合器使得阅读|志的感觉就象是在阅ȝ子邮Ӟ因ؓ它们H出新闻ƈ新闻项q行~冲处理以便ȝ阅读Q参?Figure 2Q?
q有一些在U?RSS 聚合器将 RSS 提要捆绑到某个单独的|站。其优点是易于设|ƈ且可以从M计算机存取你的提要内宏V当Ӟ其缺点也是显而易见的Q那是在阅L必须始终保持q接?
RSS 是网志成ZU强大的新型信息交流形式之根本所在。在|志出现之前Q大多数开发h员ؓ了要查找到需要的内容Q通常要花大量旉来筛选掉那些令h讨厌的无关的信息?
|志通过让读者选择所要阅ȝ提要Q将控制权交l读者,从而有效地构徏自己的个性化内容?
其它cd的站点也能利?RSS 的优Ҏ聚合内容。例如,多数L的新ȝ点包?Wired、CNet、Yahoo ?NPR News 都提?RSS 提要。访?Blogdigger ?Syndic8Q你可以扑ֈ一些支?RSS 的站炏V?
微Y?MSDN 提供 RSS 提要QRSS feedsQ来聚合新添加到站点的技术内宏VMSDN ?Just Published提要是一U保?MSDN 新文章和下蝲的主要方式。甚?MSDN MagazineQMSDN 杂志Q都有其自己?RSS 提要Q可以预定:http://msdn.microsoft.com/msdnmag/rss/recent.xml 获得每月的更C便查看本期有何内容?目前有许多种 RSS 聚合器可供选择Q在 http://blogs.law.harvard.edu/tech/directory/5/aggregators 上可以找C个相当完整的列表。其中一些是在线聚合器,而另外一些是桌面应用E序。有些是免费的,另外一些需要付Ҏ能用?/p>
哪个 RSS 版本是最通用的?
q个问题的答案要看你问的是谁QRSS
的版本有好多个,0.90?.91?.92?.93?.94?.0 ?2.0。要弄清楚这些版本之间的差别是巨大的挑战之一。理解它们需要了解一些有兛_们的历史背景。Netscape 创徏?RSS 的最初版?0.90Qv初的名字是“RDF Site Summary”或者“Rich Site Summary”(规范中说前者是正式名称Q。Netscape 创徏 RSS 0.90 用于?Web 门户Q这个时候,其他人看C RSS 的用潜力。Userland Software 是第一个开始将 RSS 用于其网志商业品者之一?
版本 0.90 在很大程度上Z W3C ?Resource Description Framework (RDF)。许多h都认?RDF q于复杂Q因此都Z个免费的化版?0.91。这个Q务恰好就l了 Userland Software。Userland Software 便l发?RSS 的简化版本,随后出台的版本包括:0.92?.93 ?0.94。ؓ了强调其所做的化工作,他们?RSS 的全U定为“Really Simple Syndication”?
正当 Userland Software l箋专注于其化工作时Q另外一l开发h员在复兴最初的 RDF 版本Q?.90Q,因ؓ RSS L自己更灵zR他们最l发布了一?RSS 1.0 的版本,其正式名U还是“RDF Site Summary”。由于?RDFQ这个版本完全不同于 Userland Software 所控制的版本。Userland Software 当然不太愿意看到 RSS 1.0 g要取代其 0.94 版本的事实,于是Z一个新版本Qƈ版本号一下子跛_?2.0?
q就是今天的q种局面,形成了两个主要的竞争版本Q一个基?RDF 1.0Q而另一个则不是Q?.0Q,但它们两个都q相同的名字。这是一U可怕的混ؕQ因为版本号DZ误认?2.0 ?1.0 的改q版本,而实际上它们是两个目标完全不同的规范。另一l开发h员已l下狠心着手解册U乱问题,通过定义新的摘要QsyndicationQ规范来?RSS 名字的随意性决裂。这个解x案称?AtomQ原子)目。本文稍后将会详l讨论?
使用哪个版本其实是无关痛痒的Q大多数 RSS 聚合机制支持所有的 RSS 版本Q有些甚x?AtomQ。最l的军_取决于你是否想?RDFQ可谓萝卜白菜,各有所爱,它完全要看某人所信奉?Semantic Web 概念而定?
RSS 1.0 ?RSS 2.0 各是什么样子?
RSS 1.0
?2.0 格式所包含的核心信息相同,但其l构不一栗我提供了一?RSS 1.0 文Q参?Figure 1Q以及一个同{的 RSS 2.0Q参?Figure 2Q用于对照?
你会注意到顶行右边开始的根元素的差异QRSS 1.0 的根元素?rdf:RDFQ?RSS 2.0 的根元素?rss。rss q包含一个强制版本属性用以表C所用的RSS的准格式(可能的值包括:0.91, 0.94 {)。另一个主要差别是 RSS 1.0 文有名字空间限定,RSS 2.0 的文档就没有。不怎样Q包含在两个文中的信息本质上是一L?
两个版本都包?channel 元素Q?channel 元素又包含三个必ȝ元素Qtitle、description ?linkQ其代码如下Q?
QchannelQ?
QtitleQ<!?channel 的标?–>Q?titleQ?
QdescriptionQ<!?要描q?–>Q?descriptionQ?
QlinkQ<!?channel ?URL –>Q?linkQ?
Q??可?可扩展元?–>
Q?channelQ?
除了q些必须的元素外QRSS 1.0 q定义了三个附加元素Qimage、items ?textinputQ其中,image ?textinput 是可选的。另一斚wQRSS 2.0 提供?16 个附加元素,其中也包?image、items ?textinputQ此外还?language、copyright、managingEditor、pubDate ?category。RSS 1.0 允许通过定义在单独的 XML 名字I间中的可扩展元素来创徏q种cd的元数据?
q两U格式在l构上的主要区别必须要看?item、image ?textinput 节点的表CŞ式。RSS 1.0 中,channel 元素包含?item、image ?textinput 节点的引用,q些节点存在?channel 节点本n之外。这样在 channel ?所引用的节点之间徏立了一U?RDF 兌。如 Figure 1 所C,channel 元素与一?image 元素以及两个 item 元素兌。RSS 2.0 中,item 元素只是?channel 元素中连l排放(?Figure 2 所C)。item 元素包含实际的新闻项信息。item 的结构在两个版本中是相同的。item 元素通常包含 title、link ?description 元素Q如下代码所C:
QitemQ?
QtitleQ<!?Ҏ?–>Q?titleQ?
QlinkQ<!??URL –>Q?linkQ?
QdescriptionQ<!?要描q?–>Q?descriptionQ?
Q??可选的/可扩展的元素 –>
Q?itemQ?
?RSS 1.0 中,title ?link 是必ȝQdescription 是可选的。而在 RSS 2.0 中,title ?description 必须提供其中的一个;其它均可选。这些只是定义在 RSS 1.0 中的 item 元素。RSS 2.0 提供几个其它可选元素,其中?author、category、comments、enclosure、guid、pubDate ?source。RSS 1.0 获取q样的元数据是通过定义在单独的 XML 名字I间中称?RSS 模块的可扩展元素来实现的。例如,?Figure 1 中,item 的日期是?Dublic Core 模块?Qdc:dateQ?元素表示的?br />
有关不同格式的完整信息请参?RSS 1.0 ?2.0 规范?/p>
那么Q何?AtomQ
前面我提到过QAtom 乃一目的名字,主要是开发一个新的网志摘要格式以解决目前 RSS 存在的问题(混ؕ的版本号Q不是一个真正的开放标准,表示Ҏ的不一_定义贫乏{等Q。Atom 希望提供一个清晰的版本以解x个h的需要,其设计完全不依赖于供货商QQ何h都可以对之进行自由扩展,完整详细说明?
当今许多 Blog 引擎已经支持当前的摘要格式。Figure 3 是一个Atom 0.3 提要例子Q它与前q?Figure 1 ?Figure 2 RSS 提要{同。注?Atom 提要用名字空间限定的Q但它不使用 RDF。这使得 Atom ?RSS 1.0 ?RSS 2.0 在某些地Ҏ怼之处。Atom 在未来是否能被接受,Z拭目以待?
除了定义新的摘要格式之外QAtom q希望定义一个标准的案文g格式和一个标准的|志~辑 APIQAtom APIQ。有?Atom 详细规范以及其它 Atom 资源误?The Atom Project?
什么是 blogrollQ?
blogroll 是网志提要的集合Q?
大多?bloggerQ博客)在其个h|志上都提供 blogroll。这允许读者连接到其他味和写作风格相投的人的|志上。Blogroll 方便了网l上的沟通。通过使用Outline Processor Markup Language QOPMLQ,Z可以?XML 格式文g交换 blogroll。Figure 4 ?blogroll 的一个例子?
大多数网志引擎都自己理 blogrollQ每当读者请?blogroll 旉自己产生相应?XML 格式。同P大多数聚合器都能导入 blogroll q自动预定所包含的摘要。有?OPML 更多的信息参?http://opml.scripting.com?
能解?referrers、trackbacks ?pingbacks 是什么吗Q?
大多数网志Y仉能让读者添加网志评论。但更常见的做法是让读者在其自q|志d一个入口回铑ֈ原来的帖子。博客们QBloggersQ都乐于跟踪q接发生的时间以便新读者能理解整个会话内容?
所?referrer 是一个外部站点,用户单击该站点上一个超链接便可以到达你的网站。许多网志引擎当读者导航到你的|志的某个入口时都能自动保持跟踪。大多数引擎都会在网志入口底部显CZ?referrers 清单Q以便读者能往回导航到 referrer 的站点,q清楚他们关于该入口要说些什么,q基于一个假设,那就是如果他们链接到它,可能此会写些什么。referrer 存在的问题是必须要有q个假设才成??没有_的信息说明是否引用的面事实上包含有关信息。实际上Q垃圾信息的发布者ؓ了营销企图已经利用了这个漏z来重定向读者?br /> Trackback ?pingback 同一个规范,被用来I补上q问题的Ҏ。?trackback ?pingbackQ其他博客们能自动发送一?ping C的网志以明确表示他们已经写了一个引用特定帖子的入口?/p>
q种cd的反铑օ怽的网志以更明昄方式昄所有评论的清单。当今大多数|志软g支持所有这些技术。参?TrackBack Technical Specification ?Pingback 1.0?/p>
如何为我的站点?RSS 提要Q
Figure 5 举例说明?
如何?asp:Repeater 控g?.aspx 面中生?RSS 2.0 提要。该面假设你已l在后端代码文g中将控g?DataSource 属性设|成对应的数据库l果集。
我想聚合几个 RSS 提要q将信息昄在个人网站上Q能解释一下如何实现吗Q
因ؓ RSS 提要?XML 文gQ作为练习,你可以用自己最擅长?XML APIQ比如,Microsoft .NET Framework 中的 System.XmlQFigure 6 中包?ASP.NET Web 用户控g代码Q它是我~写用来聚合 blogroll 文g中(.opmlQ所列出?RSS 提要的一D代码。这D代码假?opml 元素包含 numberToDisplay 属性,以表CZ打算昄的每个提要有多少V?
Figure 7 ASP.NET Web 用户控g
你可以将控g拖到M .aspx 面中,它将昄 blogroll 文g中列出的不同提要的项QFigure 7 昄?Utah .NET User Group |站使用q个控g的效果画面?
有没有与|志交互?Web Services APIsQ?br />
许多|志引擎都提供属于自q Web service 接口Q通过~程与网志交互,但目前还没有出现一U标准化的东ѝ?
.Text ?dasBlog 两者都提供某些 .asmx 端点Q可以通过 SOAP 来实现编辑功能,但其接口是不同的。Blogger.com 提供Z XML-RPC 的交互式 API QBlogger APIQ。Userland Software 对Blogger API 的功能进行了增强Qƈ把它叫做 MetaWeblog API。这些可能是当今公认的网?APIsQ但仍然不是所有网志引擎都支持的。还有一个用于添加评论的独力?API 叫做 Comment APIQ同P它也不是被普遍支持?
Atom l正在努力解册些问题,Atom API 定义了一个标准的|志 API 用于发布和编辑网志内宏V有关信息请参?The Atom Project |站
首先要确定在那个 form 里验?/span> , 我们要做的事情是 :
<form method="post" action="" name="f"LANGUAGE="javascript"onsubmit="return f_submit()" >
q里分析一?/span> ,
1. name="f" 一般我们验证的时候不需要给 form 命名 , 可是q里?/span> , Z?/span> , 需要验证的是那个表单的那个 textfield?
2.
LANGUAGE="javascript"
q里要指出验证的脚本语言是什?/span>
,
不区分大写
3. onsubmit= "return f_submit()" q里 ,return 的值非帔R?/span> , 它会用在 javascript 脚本语言里面 , 不可以和脚本里的不符?/span> ! 前面?/span> onsubmit 必须写全 , 写成 submit 不可?/span> , 写成别的更不可以 !
接着我们?/span> javascript
<script language="javascript">
function f_submit() {
if(document.f.title.value=="")
{
alert("Sorry, 信息沒有輸入 ")
document.f.title.focus()
return false
}
else if(document.frmAddLink.content.value=="")
{
alert("Sorry, 說明沒有輸入 ")
document.frmAddLink.content.focus()
return false
}
}
</script>
1. 注意 function f_submit() 严格区分大小?/span> ! function 写成 Function 是不可以?/span> , 至于 f_submit(), 是 form 里要 onsubmit ?/span> return 的?/span> , 当然 , 照抄可?/span> , 大小写当然区?/span> !
2. 下面 f.title 代表表单的?/span> , 要和 textfield 相匹?/span> !
3. java/c 语言都在每句后面加分?/span> , 可是 javascript 不可以加 ! q里很不习惯 , 我L喜欢加分?/span> . 其它语句看大意就能理?/span> .
文g下蝲:
-----------------------------------------
文g的超q接写法范例:
<% String fname ="中文试.xsl"; //假设你的文g名是:中文试.xsl
%>
<A target="_blank" href="Download.jsp?filename=<%=fname%>">??lt;/A>
文g的超q接写法范例-2 重新用utf-8Ҏ件名~码:
<%@ page contentType="text/html;charset=gb2312" session="true"%>
<% String name=java.net.URLEncoder.encode("世界文化.doc","UTF-8"));%> <a href="c:\<%=name%>">世界文化.doc</a>
Download.jsp文g
---------------------------------------------------------
<%
java.io.BufferedInputStream bis=null;
java.io.BufferedOutputStream bos=null;
try{
String filename=request.getParameter("filename");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("files/" + filename)));
bos=new java.io.BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
}
catch(Exception e){
e.printStackTrace();
}
finally {
if (bis != null)bis.close();
if (bos != null)bos.close();
}
%>
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.lang.String.*"%>
<%
if(request.getParameter("submit")!=null)
{
String checkbox[]=request.getParameterValues("checkbox");
if (checkbox!=null)
{
//int size=java.lang.reflect.Array.getLength(checkbox);
int size=checkbox.length;
out.println("您选中? + size + ",分别为:<br>");
for (int i=0;i<size;i++)
{
out.println(checkbox[i]+"<br>");
}
}
}
%>
<form name=form1 action="" method=post>
<script langauge=javascript>
for(i=0;i<20;i++)
{
document.writeln("<input type=checkbox name=checkbox value=\""+ i +"\"><label for=checkbox" + i + ">选择"+ i +"</label><br>");
}
</script>
<br>
<input type=submit value="提交" name="submit">
</form>
此翻译稿很大一部分内容国内出现的那个先前版?/a>Q我只是Ҏ加入的几进行了译Qƈ且对我熟悉的产品着重介l了一下,以后我会抽时间收集文中提到AJAX工具相关的文章,量内容介l和功能点评做到全面详细炏V所以请x和准备用AJAX做开发的朋友xq篇文章Q我会时常更新的。原文因为是׃个wikipȝl护Q所以在所隑օ出现参差不齐Q风g也有不统一的情况,译时我也是参照原文原封不动的挪了过来,以后我会抽时间改良下?/p>
Z览器的应用框架一般分ZU: Z服务器端的应用框枉常以下面两U方式工?管它们Ҏ不同的语aq行了分c?
Bindows是一个通过DHTML、JavaScript、CSS和HTML{技术强劲联合v来的一套完整的Windows桌面式的WEB应用E序解决Ҏ。Bindows无需下蝲安装客户端支撑组Ӟ如Java、ActiveX或FlashQ,仅需一个浏览器。纯OO的理念体现在BindowsM地方QBindows或许是笔者见q的最完整最强大的AJAX应用E序q_? Bindows框架提供的功能和Ҏ有Q? Bindows开发环境:
BackBase是一个完整的览器端框架Q提供了丰富的浏览器操作功能Q以及对.NET和JAVAq_的集成? DOJO提供完整的轻量H口lg和浏览器-服务器消息映支?/p>
译正文
目录
1. Pure Javascript: Application Frameworks
1.1 Bindows (成立?003q?
Bindows是商业程序的Q用了来自于MB的技?总部位于GA USAQ主要开发中心在瑞典Q成立于2002q??/p>
1.2 BackBase (成立?003q?
商业化品,来自于Backbase B.V(总部在AmsterdamQ成立于2003q??1.3 DOJO (开发中,成立?004q??
Open Rico是一个支持Ajax架构和用户交互的多用途框架?
qooxdooQ是另一个发展迅猛的应用框架Q提供广泛的UI支持Q正在开发基架构{特性?
Tibet提供了大量的易移植和完整的JavaScript APIQ通过q些可以快速生成大量的客户端代码,Tibet自称是企业AJAX?/p>
AJFORM是一个极易上手的AJAX框架Q被用来~写入门U的AJAX代码Q提供有以下功能Q?/p>
AjaxCaller是一个具有多U程安全讉K的XMLHttpRequestlgQ主要针对Ajax开发新手,目前仍处于alpha开发阶D,仅在AjaxPatterns的在U搜索范例中使用了这个程序?
The Flash JavaScript Integration Kit可以使Flash和Javascript脚本实现怺集成?/p>
Google AJAXSLTQ是一个Javascript框架Q用来执行XSLT转换以及XPath查询?/p>
HtmlHttpRequest最大的特点是q用XMLHttpRequest对象和标准HTML标签IFrame来实现最大限度的跨浏览跨q_的AJAX支持Q其原理是在支持XMLHttpRequest的浏览器上调用XMLHttpQ如果不支持Q就用IFrame来模拟实现异步交互?/p>
Interactive Website Framework定位在浏览器中支持各U各LAJAX基础应用的开源项目。自U是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架Q包括一个可定制易读的XML解析器。实际上QIWF是一个AJAX的基框架Qƈ且还包括一些通用脚本代码?/p>
var node = doc.groceries.frozen[0].pizza[0].size;装后的数据d
var node = doc.documentElement.firstChild.firstChild.getAttribute("size");原始的DOM操作d
libXmlRequest是一个小型XMLHttpRequest装?/p>
MAJAX是另一个非常小巧的HttpRequest装包,为收发字W型信息提供单接口,qؓ每步动作讄回调界面?/p>
RSLite是一个XMLHttpRequest装lgQ作为Brent Ashley的JSRS(JavaScript Remote Scripting)其中的一部分功能单独发布。详情可以看JSRS的介l?/p>
Sack也是一个很有名字的微型XMLHttpRequest装包。调用者可以自定义回调函数或者是DOM对象。借助于回调DOM对象Q可以把Response回来的数据直接以文本的方式嵌入DOM中?/p>
Sarissa是一个JavaScript APIQ封装了在浏览器端独立调用XML的功能?/p>
XHConn也是一个小型的XMLHttpRequest装库。笔者也使用改良q的XHConnQ其特点是调用单,代码也清晰易诅R?/p>
new XHConn().connect("mypage.php"Q?POST"Q?foo=bar&baz=qux"QfnWhenDone);
CPAINT是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台提供你需求的AJAX和JSRS代码Qƈ自动q回到浏览器端相应的Javascript脚本代码Q这U方式易于实时反馈需求的WEB应用E序?/p>
SAJAX的实现方式很独特Q例如:调用一个javascriptҎx_calculateBudget()Q将先把响应传到服务器ƈ调用一个Java calculateBudget()ҎQ然后以javascript方式把D回到x_calculateBudget_cb()中。SAJAX的名气不错,估计很多人都听过甚至用过Q不q缺点就是它的这套映理论感觉较J锁Q远不如一些轻量的封装库好用Q不qSAJAX最大的特点是支持的^C富,几乎囊括了WEB下常用的~程语言和^?/p>
JSON是一?face-free" XMLQ?a target="_blank">JSON-RPC是一U远E交互协议,cM于XML-RPCQ对JavaScript支持较强
JSRSQ较l典的远E脚本访问组Ӟ支持客L数据通过服务器做代理q行q程的数?操作交互?/p>
Bitkraft是个Z(.NET)Web框架的CLR(公共语言q行?Q允许用独特的方式创建和操作分布式Web内容。用C#~写Q运行在微Y?NET 1.1和Mono框架下,无缝式的客户?服务器响应方式是它的最大特炏VBitkraft没有使用XMLl织数据Q而是用JSON代替?/p>
WebORB for Java是一个开发AJAX和基于Flash的富客户端应用程序的开发^台?a target="_blank">在线例子
Echo 2允许你用UJava语言~写AJAXE序?Demo.
Direct Web Remoting可以在Javascript代码中直接调用JavaҎ的应用框?/p>
SWATO是一套可重用的和良好集成的Java/JavaScript库,它实C一U更Ҏ的方式来改变你的web应用E序的交互,通过AJAX方式实现?/p>
The AJAX JSP Tag Library是一lJSP标签库,用来AJAXE序开发。可以在J2EE下无需JavascriptpL开发AJAX模式的Web Form。标{ֺ为比较通用的AJAX功能提供?个标{:
The AJAX-JSF用来把Q意的JSF应用E序转变为AJAX应用E序
CL-Ajax实现Javascript直接调用服务端Lisp
WebORB for .NET是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应用程?在线例子)
Ajax.NET是首家支持各U方式通过Javascript讉K服务?net的免费库
ComfortASP.NET可以让开发者在U?NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)Ҏ的应用E序?/p>
AjaxAspects是个可以用Javascript调用服务端WebService事g的引?/p>
AjaxAC用一个单独类装了完整的应用E序功能
JPSPAN通过Javascript直接调用PHP中的函数?/p>
XAjax通过Javascript直接调用PHP中的函数
Ruby On Rails是一个支持AJAX的完整Web框架Q用Ruby语言~写Q严格按照MVCl构开发?/p>
引自Qhttp://www.huihoo.com/web/ajax/ajax-frameworks.html
|
|
|
|
|
|
一QsmartuploadlgQ?/p>
我想只要做个文g上传的朋友都知道q个lgQ我认识的h中用最多的也是它!我刚到公司的时候,公司也用的smartupload,q个lg上传相对较小的文件时是个不错的选择Q下面给Z使用的例子:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.jspsmart.upload.*" %>
<%
//实例化上载bean
SmartUpload mySmartUpload=new SmartUpload();
//初始?br /> mySmartUpload.initialize(pageContext);
//讄上蝲的最大?注意:如果q里讄q大会出现问?
mySmartUpload.setMaxFileSize(500 * 1024*1024);
//上蝲文g
mySmartUpload.upload();
//循环取得所有上载的文g
for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
//取得上蝲的文?br /> com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
if (!myFile.isMissing())
{
//取得上蝲的文件的文g?br /> String myFileName=myFile.getFileName();
//取得不带后缀的文件名
String suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
//取得后缀?br /> String ext= mySmartUpload.getFiles().getFile(0).getFileExt();
//取得文g的大?
int fileSize=myFile.getSize();
//保存路径
String aa=getServletContext().getRealPath("/")+"jsp\\";
String trace=aa+myFileName;
//取得别的参数
String explain=(String)mySmartUpload.getRequest().getParameter("text");
String send=(String)mySmartUpload.getRequest().getParameter("send");
//文件保存在服务器端
myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
%>
但是使用smartupload上传q大文gQ或者多文g的时候可能出现CPU或内存占用过高的问题Qƈ且:只有重新启动容器才能恢复正常!q正是我最后我攑ּ了用smartupload的原因.
二,commons-fileuploadlg
q个lg是我现在使用的组Ӟ下蝲地址Q?a >http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgiQ包内包含了API文档Q?/p>
使用该组件的例子Q?/p>
<%@ page language=“java”contentType=“text/html;charset=GBK?>
<%@ page import=“java.util.*?>
<%@ page import=“org.apache.commons.fileupload.*?>
<html>
<head>
<title>文g上传</title>
</head>
<%
DiskFileUpload fu = new DiskFileUpload();
// 讄允许用户上传文g大小,单位:字节
fu.setSizeMax(10000000);
// 讄最多只允许在内存中存储的数?单位:字节
fu.setSizeThreshold(4096);
// 讄一旦文件大超qgetSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(“D:\\Tomcat5\\TEMP?;
//开始读取上传信?br /> List fileItems = fu.parseRequest(request);
// 依次处理每个上传的文?br /> Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
//忽略其他不是文g域的所有表单信?br /> if (!item.isFormField()) {
String name = item.getName();
item.write(“D:\\UploadTest\\? name);
}
}
%>
从上面的E序可以看出Q该lg上传时候可以用了一个地Ҏ存储临时文gQ呆上传完成后直接把文g写过去.q样׃会占用过多的内存Q而且该组件上传大文g的时候效率也不低哦!
在这两个的对比选择中,我选择了后者,因ؓ我做的项目中l常上传大于10M的文Ӟ用前者的时候服务器几乎被整崩溃Q?/p>
不过,现在我已l不用这两种lg?因ؓhttp方式传文件效率始l很?我们现在使用的是web方式实现的ftp文g上传,我将在下文章中写我在项目中是如何实现的.
Author: 江南白
Home Page:http://www.extremecomponents.org
Extreme Table是最功能强大而又Ҏ配置,扩展,自定义的Table 控g?/p>
最紧要的功能包括排? 分页, 导出Excel, pdf和汇怅R?/p>
springside的best CZ代码? listBook.jsp和listOrder.jsp.
基础ȝ:
1. ?a >http://www.extremecomponents.org 下蝲最新版
2.把extremecomponents.jar 攑օweb-inf/lib
3.Ҏminum, 导出excel ?导出pdf的需要,?lib下的jar copy到web-inf/lib
4.把images里的囄攑օweb的Q意目?/p>
5.把css文g攑ֈweb的Q意目?/p>
6.?source/org/extremecomponents/table/core目录扑ֈextremetable.properties文g,把它复制到WEB-INF/classes里面q进行修?
7.修改web.xml (?)?/p>
1.Copy springside的Table Head的图Q查?/p>
2.springside中的修改版extremecomponents.css文g攑օL目录
3.?src/resource/extremetable.properties 复制到对应目?/p>
默认的式样不W合大家的审,q怺q有Compact View和css讄Q让我们可以敬谢不敏它号U非常方便的HtmlView子类扩展?/p>
1. 在全局讄?/p>
table.view.html=org.extremecomponents.table.view.CompactView
2.把images?table/compact/*.gif copy ?/table
ExtremeTable支持在properties文g里方便的l一配置丰富的全局属?/p>
?source/org/extremecomponents/table/core目录扑ֈextremetable.properties文g,把它复制到WEB-INF/classes里面.
在web.xml里面增加
<context-param>
<param-name>extremecomponentsPreferencesLocation</param-name>
<param-value>/extremetable.properties</param-value>
</context-param>
一般只写需要修改的文g:
table.filterable=false
table.imagePath=/images/table/*.gif
table.locale=zh_CN
table.view.html=org.extremecomponents.table.view.CompactView
row.highlightRow=true
column.format.date=yyyy-MM-dd
column.format.currency=###,###,###,###,#00.00
注意Excel 导出的Tag已改为,且官方版不支持中文文件名?/p>
<ec:exportXls fileName="BookList.xls" tooltip="导出 Excel"/>
ExtremeTable导出的一w要特性是可以Ҏ不同的View导出不同的列.
比如html理界面可能只列单几个最重要的列Q而导出excel时则需要导出所有的列?/p>
<ec:column property="orderdate" title="订单日期" cell="date" format="yyyy-MM-dd" viewsDenied= "html"/>
以上订单日期列在html view看不刎ͼ而excel,pdf view可以见到.
?~辑图标"Q?选择Checkbox"q些理界面上的列,也可以设|不export到pdf,excel view
因ؓjavascript的关p?
<ec:column property="customer.name" title="客户名称" alias="customer"/>
在全局属性定?
column.format.date= yyyy-MM-dd column.format.currency= K?##,###,#00.00
<ec:column property="totalprice" title="总金? cell="currency" width="80" />
<ec:column property="shipdate" title="发货日期" cell="date" width= "80"/>
在column中加入两个cac属性,׃自动在table的底端显C汇?/p>
<ec:column property="totalprice" title="总金? cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇?"/>
在Web.xml里面指定i18N的Properties文g
<context-param>
<param-name>extremecomponentsMessagesLocation</param-name>
<param-value>messages</param-value>
</context-param>
<ec:column property="name" title="book.name"/>
EC默认从数据库中查找所有记录然后由它来分页Q如果查询结果较大,可以考虑使用数据库端分页的方案?/p>
此时QEC会用Limit对象向Controller传递PageNo,PageSize,OrderBy{分信息。而服务端向ECq回总记录数和当前页的内容,具体请参?BookController?/p>
最快的方式是设|table的showStatusBar= false
<ec:table items= "order.orderItems"var="item" action="" showStatusBar= "false">
旧版EC包括其文都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文g定义table.imagePath=/images/table/*.gif卛_
ExtremeTable比Display Tag的i一个就是良好的自定义和扩展能力Q不用千Z面?br /> 不过QhL懒的Q虽然扩展子cdҎQ但能不扩展p是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求?/p>
ExtremeTable 的CSS定义非常严}, q且提供很多个层ơ的修改方式:
1.直接修改css文g, 可以把table viewҎL样式
2.修改全局属? 改变某种元素对应的css class?/p>
table.styleClass=tableRegion
3.在某个页面的row,column tag中定义class
<ec:row style="" or styleClass=""/>
SpringSide采用层次1, 直接修改extremecomponents.css为合适的样式
row与column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未?可自行扩?lt;row>?lt;column>tag Qƈ通过全局属性指定新的子cd?/p>
Z方便大家在子cL展属? extreme Table提供了专门的回调函数与Util函数?/p>
public void addColumnAttributes(Column column) { column.addAttribute("customAttributeOne", customAttributeOne);
}
详细L手册,Table, Row,Column都提供相同的扩展:
http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes
如果不是Extremetable的特别支? 普通taglib class要扩展属性的?
1.定义真正的Java属?setter,getter
2. tld文g中声明新的属?
3.重蝲输出函数新属性打印出?/p>
Extreme Table在这些类的扩展上放便很多Q但q个版本里我q没有进行尝试,׃写了。请自行参考官Ҏ?http://extremecomponents.org/wiki/index.php/Html_View_Tutorial .
<c:if test="${product.price >= customer.limit}">
...
</c:if>
<c:forEach var="current">
<c:out value="Product-${current}"/>
</c:forEach>
<jsp:useBean id="customer" type="sample.Customer" scope="request"/> ...
Customer Name: <%=customer.getName()%>
...
<% if (customer.getState().equals("CO")){ %>
...
<%}%>
Customer Name: ${ customer. name}
<c:if test="${customer. state == param. state}">
...
</c:if>
${user.address.city}
${products.[product.id]}
${products.["Part-010"]}
<c:set var="city" value="${user.address.city}" default="N/A" />
<c:out value="${customer.name}" default="N/A" />
<c:if test="${user.visitCount == 1}"
Welcome back!
</c:if>
<c:choose>
<c:when test="${count == 0}">
No records matched your selection.
</c:when>
<c:otherwise>
<c:out value="${count}"/> records matched your selection.
</c:otherwise>
</c:choose>
<table>
<c:forEach var="product"
items="${products}"
varStatus="status">
<tr>
<td><c:out value="${status.count}"/></td>
<td><c:out value="${product.name}"/></td>
</tr>
</c:forEach>
</table>
<c:url=http://mysite.com/register var="myUrl">
<c:param name="name" value="${param.name}"/>
</c:url>
<a href='<c:out value="${myUrl}"/>'>Register</a>
<fmt:message key="welcome">
<fmt:param value="${visitCount}" />
<fmt:message/>
<sql:setDataSource var="datasource" driver="org.gjt.mm.mysql.driver" url="jdbc:mysql://localhost/db" />
<sql:query var="customer" datasource="${datasource}"
SELECT * FROM customers WHERE state = 'CO' ORDER BY city
</sql:query>
<table>
<c:forEach var="row" items="${customers.row}">
<tr>
<td><c:out value="${row.custName}" /></td>
<td><c:out value="${row.address}" /></td>
</tr>
</c:forEach>
</table>
<sql:transaction dataSource="${dataSource}">
<sql:update>
UPDATE account SET Balance =Balance -? WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${accountFrom}"/>
</sql:update>
</sql:transaction>
<c:import url="http://oreilly.com/book?id=1234" var="xml"/>
<x:parse source="${xml}" var="bookInfo"/>
<x:out select="$bookInfo/title"/>
<x:out select="$bookInfo/author"/>
<c:import url="/books" var="xml"/>
<c:import url="/WEB-INF/xslt/bookDisplay.xsl" var="xslt"/>
<x:transform source="${xml}" xslt="${xslt}"/>