JAVA网页编程之JSP模板使用指南(下)
多谢指点,其实我对.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工具的整合。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 是一种突破用户端机器环境和CPU 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 是一种使网页(Web Page)产生生动活泼画面的语言 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 Java 编程语言的风格十分接近C、C++语言。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 是一种将安全性(Security)列为第一优先考虑的语言 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
页:
[1]