- 浏览: 293394 次
- 性别:
- 来自: 东京
文章分类
最新评论
-
80后的童年2:
企业级分布式搜索平台Solr视频教程网盘地址:https:// ...
企业级搜索引擎Solr使用入门指南 -
springdata_spring:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene / Solr 开发经验 -
springdata-jpa:
java web开发分页demo源代码下载:http://ww ...
简易java分页标签 -
zjf_sdnu:
兄弟,script写错了
jqGrid初学备注 -
85600367:
你好,请教一个问题。当进行分布式查询时solr无法查询到Luc ...
Lucene / Solr 开发经验
Window 工具包提供了一种典型的布局机制,比如说在一个容器中确定部件元素的位置。在AWT 和 Swing都有布局管理器,而在VisualWorks Smalltalk中有wrapper。本文将介绍一种JSP模板机制,它允许布局被封装和重新利用。JSP模板最小化了布局改变所造成的影响,这里我们 将鼓励大家采用封装模块化设计。
尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk)。例如,在传统的GUI工具包中提供了布局管理器,在一个窗体或另一个窗体中,允许布局运算被封装和重新利用。本文介绍的这种JSP 模板机制,就象布局管理器一样,可以封装布局,所以它能够被重新利用而不只是复制使用。
由于在布局的发展过程中出现了许多的变化,而对功能的封装是非常重要的一步,它能够被自如修改而做到对其他应用的影响最小。
JSP没有提供对封装布局的直接支持,所以具有统一格式的网页通常可以复制布局代码;例如,在图1中,显示了一个网页,它包含了标题、页脚、工具条以及页面的主要内容。
在图1中显示的网页布局将以HTML表格标签来执行:
例1.包含内容:
在上面的例子中,包括了JSP include 命令,它允许页面内容改变——通过改变包含的文件——无须修改网页自身。不过,由于布局是很难被编码的,布局改变需要对网页进行修改。如果一个网站有多个 相同格式的页面,那么一般情况下甚至简单布局的改变也涉及到整个页面的修改。
为了减少布局改变所造成的影响,我们需要一种仅仅只包含布局的机制;采用这种机制,布局和内容都可以在不修改文件的情况下分开进行修改。这种机制就是JSP模板。
使用模板
模板是一种JSP文件,它包含了参数化了的内容。这里所讨论的模板使用的是一套定制化标签来执行的:template:get,template: put和template:insert。template:get 标签访问参数化的内容,就象在例 2.a中的一样,它将和图 1一样的格式来生成网页。
例 2.a.一个模板
例 2.a几乎与例1完全一样,不过在例2.a中我们使用了template:get 取代了例1中的include 命令.让我们来分析一下template:get 如何运行。
template:get 使用了一个专门的名字(在请求的范围内)来对一个Java Bean进行修改。Bean包含了URI (统一资源标志符,网页的一个组件,它包含在template:get中)。例如,在例 2.a的模板列表中,template:get 获得了一个URI——header.html——从一个名为header 的Bean中(在请求的范围内)。接着在template:get 中包含了header.html。
template:put 把Bean放到请求的范围内(此范围将在后面被template:get修改)。 模板包含在template:insert中。 例 2.b中举例说明了put 和 insert 标签的用法:
例 2.b. 从例2.a中使用模板
在insert 开头标签指定了被包含的模板,在这个例子里,模板在例2.a中。每一个put 标签在请求范围内存储了一个Bean,而在insert 结尾标签包含了模板。模板接着象上面所描述的那样访问Bean。
direct 的属性能够为template:put指定;如果direct 设置为true, 和标签相关联的内容将不包含在template: get中。
一个网站包含了多页相同格式的页面,这样就可以使用一个模板,比如在例 2.a中列出了一个模板,在许多的JSP网页(例2.b)中,都用到了这个模板。
使用模板的另一个好处是可以进行模块化设计。例如,例2.b中列出的JSP 文件中包含了header.html,让我们再来看下面的例2.c。
例2.c. header.html
由于header.html 是被包含的内容,所以它不必在需要显示标头的页面中复制其代码。而且,尽管header.html 是一个HTML文件,但是在文件中并没有使用一般的起始HTML标签(比如<html>或<body>),因为这些标签都将被模 板定义。由于在模板中包含了header.html,这些标签在header.html就可以不必再使用了。
注意:JSP提供了 两种方式来包含内容:静态方式,使用include命令;动态方式,使用include action。include命令包含了目标页面的引用源,这和C语言中的#include和Java中的import相似。include action 包含了在运行时间内目标所产生的响应。
与JSP include action一样,模板包含有动态内容。所以,尽管在例1和例2.b中的JSP网页在功能上是一致的,但是前面包含的静态内容被后面动态的包含了。
可选内容
所有的模板内容都是可选的,模板的内容可以很容易的在更多的网页中使用。例如,在图 2.a和图 2.B中显示了两个页面——登录和清单——它们使用的是同一个模板。两个页面中都包含一个标头、页脚和主要内容。清单页面中有一个编辑Panel (这是登陆页面所缺乏的)用来改变清单。
下面,你会发现模板将被登录和清单页面共用:
清单页面使用了上面的模板以及专门用于编辑Panel的内容:
与上面相对照,登录页面没有专门用于编辑Panel的内容:
由于登录页面中没有专门用于编辑Panel的内容,所以它没有包括。
基于Role的内容
Web应用程序常常会基于不同的用户生成不同的内容。 例如,相同的 JSP模板,只有当用户为管理员的时候才出现编辑Panel,下面是得出的两个不同的页面(如图3.a和3.b.)
在图3.a和3.b中的模板使用了template:get的 role 属性:
get 标签仅仅在用户的Role 与Role属性相匹配的时候才包含内容。让我们来看看标签handler是如何使用Role属性的:
执行模板
这里所讨论的模板将在三种定制标签下执行:
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。图 4 显示了堆栈是如何被保留的。
在图 4中每一个模板访问正确的页脚、footer.html 和footer_2.html。如果 bean被直接存储在请求区域,图 4中的step 5将覆盖在step 2中指定的footer bean。
模板标签执行
接下来我们将分析三个模板标签的执行: insert, put和get。我们先从图 5开始。这个图表说明了当一个模板被使用时,insert和put标签事件的执行顺序。
如果一个模板堆栈已经不存在,insert 开始标签就会建立一个并把它放置到请求区域。随后一个hashtable也被建立并放到堆栈中。
每一个 put 开始标签建立一个PageParameter bean,并存储在由封装的insert标签建立的hashtable中。
插入 end 标签包含了这个模板。这个模板使用get标签来访问由put标签建立的bean。在模板被处理以后,由insert 开始标签建立的hashtable就从堆栈中清除。
模板标签列表
标签handler很简单。在例 3.a中列出了Insert标签类——标签handler。
例 3.a. InsertTag.java
例 3.b 列出了 Put标签类和标签handler:
例 3.b. PutTag.java
PutTag.doStarttag建立了一个 PageParameter bean – 在例 3.c中列出——然后存储到请求区域。
例 3.c. PageParameter.java
尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk)。例如,在传统的GUI工具包中提供了布局管理器,在一个窗体或另一个窗体中,允许布局运算被封装和重新利用。本文介绍的这种JSP 模板机制,就象布局管理器一样,可以封装布局,所以它能够被重新利用而不只是复制使用。
由于在布局的发展过程中出现了许多的变化,而对功能的封装是非常重要的一步,它能够被自如修改而做到对其他应用的影响最小。
JSP没有提供对封装布局的直接支持,所以具有统一格式的网页通常可以复制布局代码;例如,在图1中,显示了一个网页,它包含了标题、页脚、工具条以及页面的主要内容。
在图1中显示的网页布局将以HTML表格标签来执行:
例1.包含内容:
xml 代码
- < html > < head > < title > JSPtemplates </ title > </ head >
- < body background = 'graphics/background.jpg' >
- < table >
- < tr valign = 'top' > < td > < %@include file = 'sidebar.html' % > </ td >
- < td > < table >
- < tr > < td > < %@include file = 'header.html' % > </ td > </ tr >
- < tr > < td > < %@include file = 'introduction.html' % > </ td > </ tr >
- < tr > < td > < %@include file = 'footer.html' % > </ td > </ tr >
- </ table >
- </ td >
- </ tr >
- </ table >
- </
body
>
</
html
>
在上面的例子中,包括了JSP include 命令,它允许页面内容改变——通过改变包含的文件——无须修改网页自身。不过,由于布局是很难被编码的,布局改变需要对网页进行修改。如果一个网站有多个 相同格式的页面,那么一般情况下甚至简单布局的改变也涉及到整个页面的修改。
为了减少布局改变所造成的影响,我们需要一种仅仅只包含布局的机制;采用这种机制,布局和内容都可以在不修改文件的情况下分开进行修改。这种机制就是JSP模板。
使用模板
模板是一种JSP文件,它包含了参数化了的内容。这里所讨论的模板使用的是一套定制化标签来执行的:template:get,template: put和template:insert。template:get 标签访问参数化的内容,就象在例 2.a中的一样,它将和图 1一样的格式来生成网页。
例 2.a.一个模板
xml 代码
- < %@taglib uri = '/WEB-INF/tlds/template.tld' prefix = 'template' % >
- < html > < head > < title > < template:get name = 'title' /> </ title > </ head >
- < body background = 'graphics/background.jpg' >
- < table >
- < tr valign = 'top' > < td > < template:get name = 'sidebar' /> </ td >
- < td > < table >
- < tr > < td > < template:get name = 'header' /> </ td > </ tr >
- < tr > < td > < template:get name = 'content' /> </ td > </ tr >
- < tr > < td > < template:get name = 'footer' /> </ td > </ tr >
- </ table >
- </ td >
- </ tr >
- </ table >
- </
body
>
</
html
>
例 2.a几乎与例1完全一样,不过在例2.a中我们使用了template:get 取代了例1中的include 命令.让我们来分析一下template:get 如何运行。
template:get 使用了一个专门的名字(在请求的范围内)来对一个Java Bean进行修改。Bean包含了URI (统一资源标志符,网页的一个组件,它包含在template:get中)。例如,在例 2.a的模板列表中,template:get 获得了一个URI——header.html——从一个名为header 的Bean中(在请求的范围内)。接着在template:get 中包含了header.html。
template:put 把Bean放到请求的范围内(此范围将在后面被template:get修改)。 模板包含在template:insert中。 例 2.b中举例说明了put 和 insert 标签的用法:
例 2.b. 从例2.a中使用模板
xml 代码
- < %@taglib uri = '/WEB-INF/tlds/template.tld' prefix = 'template' % >
- < template:inserttemplate template:inserttemplate = '/articleTemplate.jsp' >
- < template:put name = 'title' content = 'Templates' direct = 'true' />
- < template:put name = 'header' content = '/header.html' />
- < template:put name = 'sidebar' content = '/sidebar.jsp' />
- < template:put name = 'content' content = '/introduction.html' />
- < template:put name = 'footer' content = '/footer.html' />
- </
template:
insert
>
在insert 开头标签指定了被包含的模板,在这个例子里,模板在例2.a中。每一个put 标签在请求范围内存储了一个Bean,而在insert 结尾标签包含了模板。模板接着象上面所描述的那样访问Bean。
direct 的属性能够为template:put指定;如果direct 设置为true, 和标签相关联的内容将不包含在template: get中。
一个网站包含了多页相同格式的页面,这样就可以使用一个模板,比如在例 2.a中列出了一个模板,在许多的JSP网页(例2.b)中,都用到了这个模板。
使用模板的另一个好处是可以进行模块化设计。例如,例2.b中列出的JSP 文件中包含了header.html,让我们再来看下面的例2.c。
例2.c. header.html
xml 代码
- < table >
- < tr >
- < td > < img src = 'graphics/java.jpg' /> </ td >
- < td > < img src = 'graphics/templates.jpg' /> </ td >
- </ tr >
- </
table
>
<
hr
>
由于header.html 是被包含的内容,所以它不必在需要显示标头的页面中复制其代码。而且,尽管header.html 是一个HTML文件,但是在文件中并没有使用一般的起始HTML标签(比如<html>或<body>),因为这些标签都将被模 板定义。由于在模板中包含了header.html,这些标签在header.html就可以不必再使用了。
注意:JSP提供了 两种方式来包含内容:静态方式,使用include命令;动态方式,使用include action。include命令包含了目标页面的引用源,这和C语言中的#include和Java中的import相似。include action 包含了在运行时间内目标所产生的响应。
与JSP include action一样,模板包含有动态内容。所以,尽管在例1和例2.b中的JSP网页在功能上是一致的,但是前面包含的静态内容被后面动态的包含了。
可选内容
所有的模板内容都是可选的,模板的内容可以很容易的在更多的网页中使用。例如,在图 2.a和图 2.B中显示了两个页面——登录和清单——它们使用的是同一个模板。两个页面中都包含一个标头、页脚和主要内容。清单页面中有一个编辑Panel (这是登陆页面所缺乏的)用来改变清单。
下面,你会发现模板将被登录和清单页面共用:
xml 代码
- < %@taglib uri = 'template.tld' prefix = 'template' % >
- ……
- < table width = '670' >
- < tr > < td width = '60' > </ td >
- < td > < template:get name = 'header' /> </ td > </ tr >
- < tr > < td width = '60' > </ td >
- < td > < template:get name = 'main-content' /> </ td > </ tr >
- < tr > < td width = '60' > </ td >
- < td > < template:get name = 'editPanel' /> </ td > </ tr >
- < tr > < td width = '60' > </ td >
- < td > < template:get name = 'footer' /> </ td > </ tr >
- </ table >
- ……
清单页面使用了上面的模板以及专门用于编辑Panel的内容:
xml 代码
- < %@taglib uri = 'template.tld' prefix = 'template' % >
- < %@taglib uri = 'security.tld' prefix = 'security' % >
- < template:inserttemplate template:inserttemplate = '/template.jsp' >
- ……
- < template:put name = 'editPanel' content = '/editPanelContent.jsp' />
- ……
- </
template:insert
>
与上面相对照,登录页面没有专门用于编辑Panel的内容:
xml 代码
- < %@taglib uri = 'template.tld' prefix = 'template' % >
- < template:inserttemplate template:inserttemplate = '/template.jsp' >
- < template:put name = 'title' content = 'Login' direct = 'true' />
- < template:put name = 'header' content = '/header.jsp' />
- < template:put name = 'main-content' content = '/login.jsp' />
- < template:put name = 'footer' content = '/footer.jsp' />
- </
template:insert
>
由于登录页面中没有专门用于编辑Panel的内容,所以它没有包括。
基于Role的内容
Web应用程序常常会基于不同的用户生成不同的内容。 例如,相同的 JSP模板,只有当用户为管理员的时候才出现编辑Panel,下面是得出的两个不同的页面(如图3.a和3.b.)
在图3.a和3.b中的模板使用了template:get的 role 属性:
xml 代码
- < %@taglib uri = 'template.tld' prefix = 'template' % >
- ......
- < table >
- ......
- < td > < template:get name = 'editPanel' role = 'curator' /> </ td > </ tr >
- ......
- </ table >
- ......
get 标签仅仅在用户的Role 与Role属性相匹配的时候才包含内容。让我们来看看标签handler是如何使用Role属性的:
java 代码
- public class GettagextendstagSupport {
- private String name = null , role = null ;
- ......
- public void setRole(String role) { this .role = role; }
- ......
- public int doStartTag() throws JspException {
- ......
- if (param != null ) {
- if (roleIsValid()) {
- // include or print content ......
- }
- }
- ......
- }
- private boolean roleIsValid() {
- return role == null || // valid if role isn't set
- ((javax.Servlet.http.HttpServletRequest)
- pageContext.getRequest()).isUserInRole(role);
- }
- }
执行模板
这里所讨论的模板将在三种定制标签下执行:
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。图 4 显示了堆栈是如何被保留的。
在图 4中每一个模板访问正确的页脚、footer.html 和footer_2.html。如果 bean被直接存储在请求区域,图 4中的step 5将覆盖在step 2中指定的footer bean。
模板标签执行
接下来我们将分析三个模板标签的执行: insert, put和get。我们先从图 5开始。这个图表说明了当一个模板被使用时,insert和put标签事件的执行顺序。
如果一个模板堆栈已经不存在,insert 开始标签就会建立一个并把它放置到请求区域。随后一个hashtable也被建立并放到堆栈中。
每一个 put 开始标签建立一个PageParameter bean,并存储在由封装的insert标签建立的hashtable中。
插入 end 标签包含了这个模板。这个模板使用get标签来访问由put标签建立的bean。在模板被处理以后,由insert 开始标签建立的hashtable就从堆栈中清除。
模板标签列表
标签handler很简单。在例 3.a中列出了Insert标签类——标签handler。
例 3.a. InsertTag.java
java 代码
- packagetags.templates;
- import java.util.Hashtable;
- import java.util.Stack;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.TagSupport;
- public class InserttagextendstagSupport {
- private Stringtemplate;
- private Stack stack;
- // setter method fortemplate 属性
- public void setTemplate(Stringtemplate) {
- this .template =template;
- }
- public int doStartTag() throws JspException {
- stack = getStack(); // obtain a reference to thetemplate stack
- stack.push(new Hashtable()); // push new hashtable onto stack
- return EVAL_BODY_INCLUDE; // pass tagbody through unchanged
- }
- public int doEndTag() throws JspException {
- try {
- pageContext.include(template); // includetemplate
- }
- catch (Exception ex) { // IOException or ServletException
- throw new JspException(ex.getMessage()); // recast exception
- }
- stack.pop(); // pop hashtable off stack
- return EVAL_PAGE; // evaluate the rest of the page after the tag
- }
- // taghandlers should always implement release() because
- // handlers can be reused by the JSP container
- public void release() {
- template = null ;
- stack = null ;
- }
- public Stack getStack() {
- // try to get stack from request scope
- Stack s = (Stack)pageContext.get属性(
- "template-stack" ,
- PageContext.REQUEST_SCOPE);
- // if the stack's not present, create a new one和
- // put it into request scope
- if (s == null ) {
- s = new Stack();
- pageContext.set属性("template-stack" , s,
- PageContext.REQUEST_SCOPE);
- }
- return s;
- }
- }
例 3.b 列出了 Put标签类和标签handler:
例 3.b. PutTag.java
java 代码
- packagetags.templates;
- import java.util.Hashtable;
- import java.util.Stack;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.TagSupport;
- import beans.templates.PageParameter;
- public class PuttagextendstagSupport {
- private String name, content, direct= "false" ;
- // setter methods for Put tag attributes
- public void setName(String s) { name = s; }
- public void setContent(String s) {content = s; }
- public void setDirect(String s) { direct = s; }
- public int doStartTag() throws JspException {
- // obtain a reference to enclosing insert tag
- Inserttagparent = (InsertTag)getAncestor("tags.templates.InsertTag" );
- // puttags must be enclosed in an insert tag
- if (parent == null )
- throw new JspException( "PutTag.doStartTag(): " + "No Inserttagancestor" );
- // gettemplate stack from insert tag
- Stacktemplate_stack = parent.getStack();
- //template stack should never be null
- if (template_stack == null )
- throw new JspException( "PutTag: notemplate stack" );
- // peek at hashtable on the stack
- Hashtable params = (Hashtable)template_stack.peek();
- // hashtable should never be null either
- if (params == null )
- throw new JspException( "PutTag: no hashtable" );
- // put a new PageParameter in the hashtable
- params.put(name, new PageParameter(content, direct));
- return SKIP_BODY; // not interested in tagbody, if present
- }
- // taghandlers should always implement release() because
- // handlers can be reused by the JSP container
- public void release() {
- name = content = direct = null ;
- }
- // convenience method for finding ancestor names with
- // a specific class name
- privatetagSupport getAncestor(String className) throws JspException {
- Class klass = null ; // can't name variable "class"
- try {
- klass = Class.forName(className);
- }
- catch (ClassNotFoundException ex) {
- throw new JspException(ex.getMessage());
- }
- return (TagSupport)findAncestorWithClass( this , klass);
- }
- }
PutTag.doStarttag建立了一个 PageParameter bean – 在例 3.c中列出——然后存储到请求区域。
例 3.c. PageParameter.java
java 代码
- package beans.templates;
- public class PageParameter {
- private String content, direct;
- public void setContent(String s) {content = s; }
- public void setDirect(String s) { direct = s; }
- public String getContent() { return content;}
- public boolean isDirect() {
发表评论
-
Bean-Managed Transactions
2009-01-19 22:58 1322To control transaction boundari ... -
EJB3.0初学备注
2008-08-31 23:33 1447Session Bean Example @State ... -
JUnit初学备注
2008-08-24 19:32 10381,Create a class for testing,he ... -
简易java分页标签
2007-12-17 15:18 68331,标签的实现类NumenTag.java java 代码 ... -
用Java Mail发送带图片附件
2007-12-15 16:35 26671,读入图片的方式: 发现网上讲的很多读取图片的方式都不对,按 ... -
Filter对权限和session的控制
2007-12-15 16:26 1781用Filter防止用户访问一些未被授权的资源,比如一个用户未登 ... -
创建Java中的线程池
2007-12-15 16:12 1766线程是Java的一大特性,它可以是给定的指令序列、给定的方法中 ... -
JMF简单示例
2007-12-15 16:08 2006java 代码 import java.awt.*; ... -
在jar中查找类
2007-12-15 16:02 1632java 代码 import java.util.* ... -
Java Media Framework
2007-12-15 15:59 2212安装JMF 下载完JMF安装程序后,双击安装程序的图 ... -
Java程序易犯的21种错误
2007-12-15 15:57 10541.Duplicated Code 代码重复几乎 ... -
六种异常处理的陋习
2007-12-15 00:26 1150你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Ja ... -
JXTA P2P网络编程技术
2007-12-15 00:24 22761.前言 最近,P2P(Peer-to-Peer)又成为 ...
相关推荐
本文将介绍一种JSP模板机制,它允许布局被封装和重新利用。JSP模板最小化了布局改变所造成的影响,这里我们将鼓励大家采用封装模块化设计。 尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)...
执行模板 这里所讨论的模板将在三种定制标签下... template:put 把Bean 存储在请求区域(但并不直接存储),因为如果两个模板使用了相同的内容名,一个嵌套模板就将覆盖封装模板中的内容。 为了保证每一个模板能够只
当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java...
velocity是一个很实用的页面工具,相对于jsp更便于开发维护,本文档是他的一个基础使用工具,便于比更快学习使用velocity!
OpenCms是一个J2EE的产品,它是用Java写成的。它和Tomcat捆绑在一起。但是也能够使用ATG Dynamo、WebLogic和WebSphere。...新版本提供了一个新的模板引擎,JSP支持,一种新的连接管理系统,提高了稳定性
FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...
谁应该使用这指南 13 关于例子 13 理解例子的准备工作 13 例子下载 13 如何编译并运行例子 13 相关信息 14 第1章 总 括 14 一.分布式得多层应用程序 14 J2EE组件 15 J2EE客户端 15 网络浏览器 15 小程序 15 应用...
Web 应用中模板技术与 JSP 技术的对比 输入验证与数据绑定 异常处理 国际化支持 WebWork2 & Spring Quick Start WebWork 高级特性 Action 驱动模式 XWork 拦截器体系 输入校验 国际化支持 Webwork2...
Velocity用户指南旨在帮助页面设计者和内容提供者了解Velocity和其简单而又强大的脚本语言(Velocity Template Language (VTL))。本指南中有很多示例展示了用Velocity来讲动态内容嵌入到网站之中,但是所有的VTL ...
使用Spock测试Spring Boot应用 iv. 35.4. 测试工具 i. 35.4.1. ConfigFileApplicationContextInitializer ii. 35.4.2. EnvironmentTestUtils iii. 35.4.3. OutputCapture iv. 35.4.4. TestRestTemplate xv. 36. ...
本书增强型模板介绍了ExtJS与数据交互重要的数据模型、ExtJS的JSP标签库ExtTLD和ExtJS高级组件。考虑到 ExtJS与主流服务端框架的整合也越来越紧密,本书还特意讲解了Struts和Struts2框架的整合与配置。本书全面细致...
本书增强型模板介绍了ExtJS与数据交互重要的数据模型、ExtJS的JSP标签库ExtTLD和ExtJS高级组件。考虑到 ExtJS与主流服务端框架的整合也越来越紧密,本书还特意讲解了Struts和Struts2框架的整合与配置。本书全面细致...
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 ...l FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库 l FreeMarker是免费的
本书利用大量使用了标准JSP标记库和Struts附加程序的实际例子,研究了Struts环境中的JSP编程技术。用户还将掌握多层应用程序编程,从Struts应用程序同EJB交互,利用Struts提供的包和工具处理复杂验证和登录。无论你...
二、FreeMarker与JSP、Velocity的对比 三、一个简单的FreeMarker Demo 四、FreeMarker的数据模型 五、模板的常用指令 六.常用的FTL标记 七、内建函数: 八、FreeMarker macro(宏)的使用 九、通过Struts2设置type来...
1.3 JSP流行模板Struts的安装配置 8 1.4Struts 用户指南 8 1.5 你的第一个struts应用程序 8 第2章深入Struts结构 8 2.1人介绍应用框架 mvc和model2 8 2.2 Struts原理、开发及项目实施 8 2.3使用STRUST控制流 8 2.4...
项目经理和架构师:这些项目可以作为参考和模板,帮助您更好地规划和设计实际业务场景中的Java项目。 四、下载与使用 下载:所有项目均提供下载,您只需在平台上注册并登录即可获取。 安装与部署:每个项目都提供了...
Struts映射到Model 2设计模式的完整介绍 , 详细论述利用JSP使用Struts的知识,包括Struts标记库 Struts异常处理、验证和登录 Struts应用程序的国际化和本地化 完整论述新StrutsTiles模板库 ...