|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
多谢指点,其实我对.net和ruby也不是很了解,对与java也只是刚起步的阶段,只是在学习中有了点想法就写出来了,现在俺本科还没毕业,所以对大型项目基本上也没有什么经验。js|模板
实行模板
这里所会商的模板将在三种定制标签下实行:
Template:insert
Template:put
Template:get
insert标签中包括一个模板,可是在包括之前,put标签存储有一些信息――name,URI和Boolean值(用来指定将内容是包括仍是间接显现)――关于模板所包括的内容。在template:get中包括(或显现)了指定的内容,随后将会见这些信息。
template:put把Bean存储在哀求地区(但其实不间接存储),由于假如两个模板利用了不异的内容名,一个嵌套模板就将掩盖封装模板中的内容。
为了包管每个模板可以只存取它本人的信息,template:insert保存了一个hashtable仓库。每个insert入手下手标签创建一个hashtable并把它放进仓库。封装的put标签创建bean并把它们保留到比来创建的hashtable中。随后,在被包括模板中的get标签会见hashtable中的bean。显现了仓库是怎样被保存的。
<br>
.在哀求地区存储模板参数点击缩小(24KB)
在中每个模板会见准确的页脚、footer.html和footer_2.html。假如bean被间接存储在哀求地区,中的step5将掩盖在step2中指定的footerbean。
模板标签实行
接上去我们将剖析三个模板标签的实行:insert,put和get。我们先从入手下手。这个图表申明了当一个模板被利用时,insert和put标签事务的实行按次。
<br>
.put和insert标签实行按次点击缩小(24KB)
假如一个模板仓库已不存在,insert入手下手标签就会创建一个并把它安排到哀求地区。随后一个hashtable也被创建并放到仓库中。
每个put入手下手标签创建一个PageParameterbean,并存储在由封装的insert标签创建的hashtable中。
拔出end标签包括了这个模板。这个模板利用get标签来会见由put标签创建的bean。在模板被处置今后,由insert入手下手标签创建的hashtable就从仓库中扫除。
显现template:get的按次图表。
<br>
.get标签的按次图表点击缩小(11KB)
模板标签列表
标签handler很复杂。在例3.a中列出了Insert标签类――标签handler。
例3.a.InsertTag.java
packagetags.templates;
importjava.util.Hashtable;
importjava.util.Stack;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.PageContext;
importjavax.servlet.jsp.tagext.TagSupport;
publicclassInserttagextendstagSupport{
privateStringtemplate;
privateStackstack;
//settermethodfortemplate属性
publicvoidsetTemplate(Stringtemplate){
this.template=template;
}
publicintdoStartTag()throwsJspException{
stack=getStack();//obtainareferencetothetemplatestack
stack.push(newHashtable());//pushnewhashtableontostack
returnEVAL_BODY_INCLUDE;//passtagbodythroughunchanged
}
publicintdoEndTag()throwsJspException{
try{
pageContext.include(template);//includetemplate
}
catch(Exceptionex){//IOExceptionorServletException
thrownewJspException(ex.getMessage());//recastexception
}
stack.pop();//pophashtableoffstack
returnEVAL_PAGE;//evaluatetherestofthepageafterthetag
}
//taghandlersshouldalwaysimplementrelease()because
//handlerscanbereusedbytheJSPcontainer
publicvoidrelease(){
template=null;
stack=null;
}
publicStackgetStack(){
//trytogetstackfromrequestscope
Stacks=(Stack)pageContext.get属性(
"template-stack",
PageContext.REQUEST_SCOPE);
//ifthestacksnotpresent,createanewone和
//putitintorequestscope
if(s==null){
s=newStack();
pageContext.set属性("template-stack",s,
PageContext.REQUEST_SCOPE);
}
returns;
}
}
例3.b列出了Put标签类和标签handler:
例3.b.PutTag.java
packagetags.templates;
importjava.util.Hashtable;
importjava.util.Stack;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.TagSupport;
importbeans.templates.PageParameter;
publicclassPuttagextendstagSupport{
privateStringname,content,direct="false";
//settermethodsforPuttagattributes
publicvoidsetName(Strings){name=s;}
publicvoidsetContent(Strings){content=s;}
publicvoidsetDirect(Strings){direct=s;}
publicintdoStartTag()throwsJspException{
//obtainareferencetoenclosinginserttag
Inserttagparent=(InsertTag)getAncestor(
"tags.templates.InsertTag");
//puttagsmustbeenclosedinaninserttag
if(parent==null)
thrownewJspException("PutTag.doStartTag():"+
"NoInserttagancestor");
//gettemplatestackfrominserttag
Stacktemplate_stack=parent.getStack();
//templatestackshouldneverbenull
if(template_stack==null)
thrownewJspException("PutTag:notemplatestack");
//peekathashtableonthestack
Hashtableparams=(Hashtable)template_stack.peek();
//hashtableshouldneverbenulleither
if(params==null)
thrownewJspException("PutTag:nohashtable");
//putanewPageParameterinthehashtable
params.put(name,newPageParameter(content,direct));
returnSKIP_BODY;//notinterestedintagbody,ifpresent
}
//taghandlersshouldalwaysimplementrelease()because
//handlerscanbereusedbytheJSPcontainer
publicvoidrelease(){
name=content=direct=null;
}
//conveniencemethodforfindingancestornameswith
//aspecificclassname
privatetagSupportgetAncestor(StringclassName)
throwsJspException{
Classklass=null;//cantnamevariable"class"
try{
klass=Class.forName(className);
}
catch(ClassNotFoundExceptionex){
thrownewJspException(ex.getMessage());
}
return(TagSupport)findAncestorWithClass(this,klass);
}
}
PutTag.doStarttag创建了一个PageParameterbeanC在例3.c中列出――然后存储到哀求地区。
例3.c.PageParameter.java
packagebeans.templates;
publicclassPageParameter{
privateStringcontent,direct;
publicvoidsetContent(Strings){content=s;}
publicvoidsetDirect(Strings){direct=s;}
publicStringgetContent(){returncontent;}
publicbooleanisDirect(){returnBoolean.valueOf(direct).booleanValue();}
publicPageParameter(Stringcontent,Stringdirect){
this.content=content;
this.direct=direct;
}
}
PageParameter将作为复杂的占位符利用。我们来看一看例3.d中的Gettag类和taghandler:
例3.d.GetTag.java
packagetags.templates;
importjava.util.Hashtable;
importjava.util.Stack;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.PageContext;
importjavax.servlet.jsp.tagext.TagSupport;
importbeans.templates.PageParameter;
publicclassGettagextendstagSupport{
privateStringname;
//settermethodfornameattribute
publicvoidsetName(Stringname){
this.name=name;
}
publicintdoStartTag()throwsJspException{
//obtainreferencetotemplatestack
Stackstack=(Stack)pageContext.getattribute(
"template-stack",PageContext.REQUEST_SCOPE);
//stackshouldnotbenull
if(stack==null)
thrownewJspException("GetTag.doStartTag():"+
"NOSTACK");
//peekathashtable
Hashtableparams=(Hashtable)stack.peek();
//hashtableshouldnotbenull
if(params==null)
thrownewJspException("GetTag.doStartTag():"+
"NOHASHTABLE");
//getpageparameterfromhashtable
PageParameterparam=(PageParameter)params.get(name);
if(param!=null){
Stringcontent=param.getContent();
if(param.isDirect()){
//printcontentifdirectattributeistrue
try{
pageContext.getOut().print(content);
}
catch(java.io.IOExceptionex){
thrownewJspException(ex.getMessage());
}
}
else{
//includecontentifdirectattributeisfalse
try{
pageContext.getOut().flush();
pageContext.include(content);
}
catch(Exceptionex){
thrownewJspException(ex.getMessage());
}
}
}
returnSKIP_BODY;//notinterestedintagbody,ifpresent
}
//taghandlersshouldalwaysimplementrelease()because
//handlerscanbereusedbytheJSPcontainer
publicvoidrelease(){
name=null;
}
}
GetTag.doStartTag从哀求地区前往了页面参数bean并从bean中取得了content和direct属性。然后,内容能够依据direct属性值选择是被包括仍是显现。
结论
模板是一种复杂而有十分有效的观点。模板的封装结构可以对结构改动的影响到达最小化。并且模板可以依据用户的分歧来辨别分歧的内容,它还可以嵌套到其他的模板和JSP页面中。
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,netBeans等等,但是我认为如果java想超越.net,那么他首先要解决的就是IDE工具的整合。 |
|