jsp自定义标签缓存
Ⅰ jsp自定义标签的主要用处
jsp自定义标签就是通过自定义标签实现类来实现复杂的、可重复利用的功能。简化jsp页面,提高代码的复用性。
比如现在你需要在页面定义一个数据表格(html table),和数据库中的表格结构一样,显示的数据也一样。就可以通过定义jsp标签的方式来将sql查询,组织数据、画html表格的事情全部在jsp标签实现类中实现。
如果在系统中很多页面需要这样的表格,你定义的jsp标签就会很有用。
但实际应用要比这个复杂的多
Ⅱ jsp 页面缓存问题
你好,这个可以在<% %>里的最后来这样的一句代码out.println("<script>window.location='"+当前页.jsp+"');</script>");
表示在图片重写后,页面执行刷新,这个是可以手动控制的
Ⅲ JSP中如何使用缓存
一般保存中间数据,可以使用Cookie或者Session。
你可以用这两个关键字+JSP进行搜索,很多的。
Ⅳ jsp自定义标签
我觉得上楼回答的不完全对,自定义标签,不一定就是tomcat给封装好了的,自己也可以实现接口,编写*.tld(标签库描述文件),然后标签创建成功,便可引入页面使用了。下面截一段API与大家讨论:
javax.servlet.jsp.tagext
Interface JspTag
All Known Subinterfaces:
BodyTag, IterationTag, LoopTag, SimpleTag, Tag
从上一段API内容中可以看出JspTag接口下又有BodyTag, IterationTag, LoopTag, SimpleTag, Tag几个子接口。
然后以SimpleTag接口为例,分享set_等方法之用意:
Method Summary(方法概要)
void doTag()
Called by the container to invoke this tag.
当容器调用该方法时,唤醒该标签
JspTag getParent()
Returns the parent of this tag, for collaboration purposes.
返回该标签的父标签
void setJspBody(JspFragment jspBody)
Provides the body of this tag as a JspFragment object, able to be invoked zero or more times by the tag handler.
把JspFragment对象作为body提供给这个标签,能够被tag管理器调用0或多次。
void setJspContext(JspContext pc)
Called by the container to provide this tag handler with the JspContext for this invocation.
设置上下文
void setParent(JspTag parent)
Sets the parent of this tag, for collaboration purposes.
设置该标签的父标签
最后,一系列set方法,我觉得可以说成是对标签属性的设置
Ⅳ 如何创建使用jsp自定义标签
一.编写java类继承TagSupport或TagSupport
1) 提供属性的set方法,
此后这个属性就可以在jsp页面设置。以jstl标签为例
<c:out
value=""/>,这个value就是jsp数据到tag之间的入口。所以tag里面必须有一个setValue方法,具体的属性可以不叫value。例如setValue(String
data){this.data = data;}
这个“value”的名称是在tld里定义的。取什么名字都可以,只需tag里提供相应的set方法即可。
2)处理 doStartTag 或 doEndTag
这两个方法是
TagSupport提供的。 还是以<c:out value=""/>为例,当jsp解析这个标签的时候,在“<”处触发 doStartTag
事件,在“>”时触发 doEndTag 事件。通常在 doStartTag 里进行逻辑操作,在 doEndTag 里控制输出。
下面是一个简单的例子
Java代码
package com.test.tag;
import java.io.IOException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* PermissionBodyTag 根据是否有权限显示body内容
*/
public
class PermissionBodyTag
extends BodyTagSupport {
boolean permission;
public boolean isPermission() {
return permission;
}
public void setPermission(boolean permission) {
this.permission = permission;
}
public int doStartTag()
throws JspTagException {
if (permission) {
return EVAL_BODY_INCLUDE;
}
else {
return SKIP_BODY;
}
}
public int doEndTag()
throws JspTagException {
System.out.println("doEndTag");
try {
if (bodyContent !=
null) {
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}else{
}
}
catch (IOException e) {
throw new JspTagException("IO ERROR:" + e.getMessage());
}
return EVAL_PAGE;
}
public void doInitBody()
throws JspTagException {
}
public void setBodyContent(BodyContent bodyContent) {
this.bodyContent = bodyContent;
}
}
通常你会发现自己绝大多数活动都集中在 doStartTag 或 doEndTag 方法里。确实如此,熟悉一些接口和类之后,写taglib很容易。正如《jsp设计》的作者所言:里面的逻辑稍微有点复杂,但毕竟没有火箭上天那么难。
二.编写tld文件
标签文件其实只是一个XML格式的说明文件,内容也很简单。
创建tagTest-html.tld文件在这个标签文件中,我们将我们创建的标签取名 tagTest,并声明了类型和参数(permission)。将该文件保存在 /WEB-INF 下面。
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.2</tlibversion>
<jspversion>1.1</jspversion>
<shortname>tagTest</shortname>
<uri>/taiji</uri>
<tag>
<name>permission</name>
<tagclass>com.test.tag.PermissionBodyTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>permission</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
三.加到web.xml中
当然,我们还需要将我们自定义的标签添加到 web.xml 中,否则还是无法使用。
Java代码
<taglib>
<taglib-uri>/tagTest </taglib-uri>
<taglib-location>/WEB-INF/tagTest-html.tld</taglib-location>
</taglib>
四.在jsp页面导入tld
Java代码
<%@ taglib uri="/tagTest " prefix="tagTest "%>
这样,你的jsp页面就可以使用自己的tag了。用这个标签就可以根据传人的boolean值来决定标签包的jsp内容是否输出
Java代码
<tagTest:permission permission="<% java code%>">
//需有权限输出,用户才能看到的内容
</tagTest:permission>
Ⅵ 怎么样使用JSP页面缓存
手段很多,你可以把这个文件生成静态的html,后台跑一个线程,每天更新一下文件。
当然使用squid反向代理加速也行,但是配置安装成本比较高。
另外,你可以把页面的内容放到项目的上下文里,这样不用访问数据库,直接从内存里拿就好了。
当然还有很多方式,数据库缓存,应用程序缓存等等都可以。
Ⅶ 怎么样使用jsp中自定义标签
jsp自定义标签用法,供大家参考,具体如下:
什么是标记
使用HTML语言我们可以这样去编辑我们的网页:
<HTML>
<HEAD>
<TITLE>
HELLO WORLD
</TITLE>
</HEAD>
<BODY>
HELLO WORLD
</BODY>
</HTML>
在这里我们把</HEAD>,<TITLE>,<BODY>称为标记。HTML 标记( HTML Markup)是HTML文档的控制语言,用于指定浏览器显示和打印文档的方式.它是用小于号"<"和大于号">"括起来的短语和符号,如 <Html>、</Body>等。许多HTMl标记以成对的方式出现,如<TITLE>< /TITLE>、<Body></Body> 等。在JSP中我们也可以定制自己的标记,以供JSP页面使用,如下例所示:
<!—login.jsp-->
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:login width="200" height= "100" >
</tagclass:login>
</body>
</html>
在上例中</tagclass:login>就是一个JSP定制标记符。widtht、height是这个标记的属性。<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>是一个标记库定义指令,在稍后我们将会讨论。在JSP中定制标记符,实质上就是以标记的形式封装了一个俱有独立功能的Java类。标记的使用减少了直接嵌入JSP页面的Java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。
JSP服务器解析标记的过程
那么当一个标记被嵌入JSP页面后,JSP服务器是如何对这个标记进行解析的呢?各对象的含义如下所示:
Client: 表示客户端。
JSP-Server:JSP服务器。
JSP-Page:JSP页面。
TLD: 标记库描述文件,定义标记和标记的各种属性和处理文件等。
TagClass 标记处理程序
当一个用户访问一个JSP页面时,这个请求被发送到JSP服务器,JSP服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记, JSP服务就会根据页面指令<%@ taglib>去访问TLD得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。对每个没有设置属性的,调用相应的set方法。当标记符第一次使用时,它的任何属性都不会做过设置,因此对每个属性都调用set方法。属性设置完以后,JSP服务器调用处理程序的doStartTag(),然后再调用doEndTag()方法。最后JSP服务器会继续处理剩下的页面,在页面结尾调用release ()方法,清理占用的所有资源。
TLD文件
TLD(TLD:Tag Library Descriptor标记库描述符)文件,标准的XML格式的标记定义文件,被用来存放标记符的信息,下面就是一个典型的TLD文件。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!—XML的版本及其字符集-->
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
" http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<!—文档类型定义-->
<taglib>
<!—此标记说明我们开始描述一个标记库-->
<tlibversion>1.0</tlibversion>
<!—标记库的版本-->
<jspversion>1.1</jspversion>
<!—所使用的JSP的版本-->
<shortname>tagclass</shortname>
<!—缺省的名称-->
<tag>
<name>login</name>
<!—标记的名称-->
<tagclass>
tagclass.login.login
<!—处理这个Tag的相应的类的名称-->
</tagclass>
<info>
<!—对本标记符的描述-->
</info>
<attribute>
<!—开始定义标记的属性-->
<name>height</name>
<!—属性的名称-->
<required>true</required>
<!—表示这个属性是不是必须的-->
<rtexprvalue>true</rtexprvalue>
<!—表示这个属性是否可以用JSP的程序段的结果输出-->
</attribute>
<attribute>
<name>width</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
在这个TLD文件中定义了只有一个标记符的标记符库,这个名为login的标记符会调用一个Applet以验证用户的合法性。处理这个标记的类就是 tagclass.login.login。width、height是这个标记的两个属性。属性是在使用标记符时作为参数发送的值。我们可以在上面的示例中增加几个标记,也可以为每个标记添加几个属性。我们开发标记符库时不一定非要从头开始,自己编写一个全新TLD。我们可以使用某个集成的开发的环境,也可以修改上面的例子。
TagLib指令
那么当JSP服务器在解析一个标记符时,它是如何定义一个标记库的呢?这就是TagLib指令的主要责任。
Taglib 指令
定义一个标记库以及其自定义标记的前缀.
JSP 语法
复制代码 代码如下:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
例子
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title>login</title>
</head>
<body>
<tagclass:login width="200" height= "100" >
</tagclass:login>
</body>
</html>
描述
<% @ taglib %>指令声明此JSP文件使用了自定义的标记,同时引用标记库,
也指定了他们的标记的前缀。 你必须在使用自定义标记之前使用<% @ taglib %>指令。
属性
uri="URIToTagLibrary" :Uniform Resource Identifier (URI)根据标记的前缀对自定义的标记进行唯一的命名,URI可以是一个相对或绝对的路径。
prefix="tagPrefix":在自定义标记之前的前缀。如上例中的</tagclass:login>
标记符的处理程序(Tag handle)
我们还是以一个例子来看下如何实现一个Tag handle。首先是看一下它的类图:
让我们再看一下它的代码:
package tagclass.login;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import java.io.*;
public class login extends TagSupport
{
public login()
{
super();
}
public int doStartTag() throws JspTagException
{
JspWriter out = pageContext.getOut();
try
{
out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");
}
catch(Exception e)
{
}
return SKIP_BODY;
}
publicc int doEndTag()throws JsptagException
{
return EVAL_PAGE;
}
public void release()
{
super.release();
}
public void setWidth(String language)
{
this.width = width;
}
public String getWidth()
{
return this.width;
}
public void setHeight(String height)
{
this.height=height;
}
public String getHeight()
{
return this.height;
}
private String width;
private String height;
}
从以上我们可以看出,实现一个简单的标记符处理程序有几个要求:①增加一个类,使之继承 java.Servlet.jsp.tagext.TagSupport类。这个类提供了java.Servlet.jsp.tagext.Tag接口所要求的所有的方法。另外,还需要使用一些基本的API,使JSP容器能够调用我们自己提供的标记符处理程序。②必须为每个标记符属性分别创建一个 get<attribute>和set<attribute>方法,JSP容器需要使用这些方法处理程序传递参数。③要为标记符处理程序创建一个构造器和自毁器。JSP需要使用构造器启动处理程序。自毁器是在realease()方法中定义的。在处理程序的生命周期结束时,需要调用自毁器释放所占用的资源。④创建两个名为doStartTag()和doEndTag()的方法,执行具体的处理和输出动作。这两个方法是在处理自定义标记符的起始位置和结束位置调用的。它们的返回值是在Tag Interface里定义的静态int,这几个静态值分别是:
SKIP_BODY隐含0 :跳过了开始和结束标签之间的代码。
EVAL_BODY_INCLUDE隐含1:将body的内容输出到存在的输出流中
SKIP_PAGE隐含5 : 忽略剩下的页面。
EVAL_PAGE隐含6:继续执行下面的页
当然标记符也有它自己的缺点。很不方便的封装过程,有限的功能。对于一些不太复杂和功能单一的逻辑描述,需要传递的参数要求不高时,使用JSP标记,要方便的多。对于大多数的商业逻辑应用,还是使用bean要好的多,也宜于servlet控制。
附:文章中所用示例的完整代码
JSP代码:login.jsp
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
<html>
<head>
<title></title>
</head>
<body>
<tagclass:login width="200" height= "100" >
</tagclass:login>
</body>
</html>
标记符描述库:taglib.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
" http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>tagclass</shortname>
<tag>
<name>login</name>
<tagclass>
tagclass.login.login
</tagclass>
<info>
</info>
<attribute>
<name>height</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>width</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
标记符处理程序:login.java
package tagclass.login;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import java.io.*;
public class login extends TagSupport
{
public login()
{
super();
}
public int doStartTag() throws JspTagException
{
JspWriter out = pageContext.getOut();
try
{
out.println("<APPLET CODEBASE=applet/login/ CODE=login.class width=200 height=100 > </APPLET>");
}
catch(Exception e)
{
}
return SKIP_BODY;
}
publicc int doEndTag()throws JsptagException
{
return EVAL_PAGE;
}
public void release()
{
super.release();
}
public void setWidth(String language)
{
this.width = width;
}
public String getWidth()
{
return this.width;
}
public void setHeight(String height)
{
this.height=height;
}
public String getHeight()
{
return this.height;
}
private String width;
private String height;
}
标记符处理程序中所使用的Applet : login.java
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class login extends Applet implements ActionListener
{
private String s_username;
private String s_userpassword;
private Button b_ok;
private Button b_register;
private Label l_username;
private Label l_userpassword;
private TextField t_username;
private TextField t_userpassword;
private GridLayout g_gridlayout;
public void init()
{
b_ok=new Button("ok");
b_register=new Button("register");
l_username= new Label("name");
l_userpassword=new Label("password");
t_username=new TextField();
t_userpassword=new TextField();
b_ok.addActionListener(this);
b_register.addActionListener(this);
g_gridlayout=new GridLayout(3,2,10,10);
this.setLayout(g_gridlayout);
//this.setBackground(Color.blue);
add(l_username);
add(t_username);
add(l_userpassword);
add(t_userpassword);
add(b_ok);
add(b_register);
}
public void actionPerformed(ActionEvent ev)
{
String s_label=ev.getActionCommand();
if (s_label.equals("ok"))
{
t_username.setText("name");
}
if (s_label.equals("register"))
{
t_userpassword.setText("password");
}
}
public void paint(Graphics g)
{
}
}
Ⅷ jsp自定义标签的作用
自定义标签,它可以在JSP页面中省略很多的代码,就比如说连接数据库来说,只要一个标签,加两个属性,就连接OK.
有些输出需要一大段代码来实面,而使用自定义标签,只需一个标签就可以显示出来,
不过.这个自定义标签,还是有一定的不足,就是有些东西是死的,不如自己自己的写的程序那么好控制.
所以一般我都比较少用.
Ⅸ JSP中怎么自定义标签
自定义JSP标签需要继承TagSupport类,然后在里面重写doEndTag()方法,框架大概如下:
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class Test extends TagSupport {
public int doEndTag() throws JspException {
try {
pageContext.getOut().print("Test");
}
catch(Exception e) {
e.printStackTrace();
}
return SKIP_BODY;
}
public void release() {
super.release();
}
}
然后创建Tag Library的描述文件xx.tld,在tld文件里定义标签,接着在web.xml文件里面加入<taglib>元素,最后在jsp里面引用就可以了
Ⅹ jsp自定义标签到底有什么作用
jsp自定义标签就是通过自定义标签实现类来实现复杂的、可重复利用的功能。简化jsp页面,提高代码的复用性。
比如现在你需要在页面定义一个数据表格(html table),和数据库中的表格结构一样,显示的数据也一样。就可以通过定义jsp标签的方式来将sql查询,组织数据、画html表格的事情全部在jsp标签实现类中实现。
如果在系统中很多页面需要这样的表格,你定义的jsp标签就会很有用。但实际应用要比这个复杂的多。