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標簽就會很有用。但實際應用要比這個復雜的多。