??xml version="1.0" encoding="utf-8" standalone="yes"?>
HashSet的排序規則是利用Hash TableQ所以加入HashSet容器的物仉必須重新定義hashCode()ҎQ利用Hash的方式,可以讓您快速的扑ֈ容器中的物g?BR>
事實上,在撰寫新的類別時Q最好總是重新定equals()與hashCode()ҎQ以W合Java的設a規,您可以參?nbsp;Object 別 中的介紹瞭解如何重新定義equals()與hashCode()?/FONT>
]]>
-a 查看本地机器的所有开攄口,可以有效发现和预防木马,可以知道机器所开的服务等信息Q如??BR>
q里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务{。用法:netstat -a IP?BR>
-r 列出当前的\׃息,告诉我们本地机器的网兟뀁子|掩码等信息。用法:netstat -r IP?/FONT>
]]>
Meta标记的含?-如何理解关键字、标题、URL、站Ҏq?BR>Meta标记臛_需要包含网站关键字 标题 URL 站点描述
我们在向搜烦引擎d|站Ӟ需要填写关键字、标题、URL、站Ҏq几内容,不要看q四内容,它对|站的被收录成功率以及您d|站在搜索引擎中的排名位|、吸引客h览和是否方便查询您的|站Q都L关键性的作用Q所以要认真对待?BR>
?nbsp;关键字:搜烦引擎客户惌在网上查找某些内ҎQ所键入的相兛_键字。客h索这个关键字Ӟ您针对这个关键字所填写的信息就会出现在搜烦l果的前列。关键字不限语言U类Q可以是中文、英文、数字,也可以是不同文字的合Ş式?BR>包含在meta keyword 标记中的关键字应和相应页面的内容相匹配。网站首|最为重要的面?BR>??个主要的关键包含在该面的关键字标记中。一般可以书?5个关键字左右。有些搜索引??nbsp;Inktomi)关键字之间用逗号分开?nbsp;
搜烦引擎Q如 Altavista, Direct Hit 支持关键字meta标记QInktomi甚至q把关键字和描述标记作ؓ排名的一个因素,当然是还要考虑其他更ؓ重要的优化标准?BR>对于搜烦引擎来说Qؓ讉K者提供的内容是提高网站排名最为重要的因素Q尽如此,增加必要的META标记当然不会影响您的排名Q因为它也是排名的一个因素,只要您的META标记和网站内Ҏ兌性?BR>
?nbsp;?nbsp;标题Q您的站点的标题Q将出现在作为检索结果的站点列表?BR>
?nbsp;?nbsp;URLQ您的网站(/或网)?nbsp;URL 地址Q客L接点L地址卛_来到您的|站Q?或网)Q将出现在作为检索结果的站点列表中。目前不接受动态URL?BR>
?nbsp;?nbsp;站点描述Q您的网站或|页的一些简短描qͼ主要说明|站的主题、性质、内容等{,出现在作ؓ索结果的站点列表中。内容必M您的|站或网内ҎW合?BR>|站描述标记(meta description tag)被绝大部分搜索引擎支持,它提供了|站的概要描q。因此,该标记无论对搜烦引擎q是对访问者来说都是重要的部分。一般来_描述标记长度应该?50个字W。再ơ重壎ͼ该标记对搜烦引擎臛_重要Q对讉K者至关重要,因ؓ搜烦引擎用来评判排名Q显C搜索结果,讉K者根据它来决定是否点击进入您的网站?/FONT>
]]>
15.3.3 HashSetc?BR>HashSet扩展AbstractSetq且实现Set接口。它创徏一个类集,该类集用散列表q行?BR>储。正像大多数读者很可能知道的那P散列表通过使用UC为散列法的机制来存储信息?BR>在散列(hashingQ中Q一个关键字的信息内容被用来定唯一的一个|UCؓ散列码(hash
codeQ。而散列码被用来当做与关键字相q的数据的存储下标。关键字到其散列码的转换
是自动执行的??你看不到散列码本w。你的程序代码也不能直接索引散列表。散列法?BR>优点在于即对于大的集合Q它允许一些基本操作如add( )Qcontains( )Qremove( )和size( )
Ҏ的运行时间保持不变?BR>下面的构造函数定义ؓQ?BR>HashSet( )
HashSet(Collection c)
HashSet(int capacity)
HashSet(int capacity, float fillRatio)
W一UŞ式构造一个默认的散列集合。第二种形式用c中的元素初始化散列集合。第?BR>UŞ式用capacity初始化散列集合的定w。第四种形式用它的参数初始化散列集合的容量和
填充比(也称为加载容量)。填充比必须介于0.0?.0之间Q它军_在散列集合向上调整大
之前,有多能被充满。具体的_是当元素的个数大于散列集合定w乘以它的填充
比时Q散列集合被扩大。对于没有获得填充比的构造函敎ͼ默认使用0.75?BR>HashSet没有定义M过它的类和接口提供的其他Ҏ?BR>重要的是Q注意散列集合ƈ没有保其元素的序Q因为散列法的处理通常不让自己
参与创徏排序集合。如果需要排序存储,另一U类??TreeSet是一个更好的选择?BR>q里是一个说明HashSet的例子?BR>// Demonstrate HashSet.
import java.util.*;
class HashSetDemo {
public static void main(String args[]) {
// create a hash set
HashSet hs = new HashSet();
// add elements to the hash set
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println(hs);
}
}
下面是该E序的输出:
[A, F, E, D, C, B]
如上面解释的那样Q元素ƈ没有按顺序进行存储?BR>15.3.4 TreeSetc?BR>TreeSetZ用树来进行存储的Set接口提供了一个工P对象按升序存储。访问和?BR>是很快的。在存储了大量的需要进行快速检索的排序信息的情况下QTreeSet是一个很好的
选择?BR>下面的构造函数定义ؓQ?BR>TreeSet( )
TreeSet(Collection c)
TreeSet(Comparator comp)
TreeSet(SortedSet ss)
W一UŞ式构造一个空的树集合Q该树集合将Ҏ其元素的自然序按升序排序。第
二种形式构造一个包含了c的元素的树集合。第三种形式构造一个空的树集合Q它按照?BR>comp指定的比较函数进行排序(比较函数在本章后面介绍Q。第四种形式构造一个包?BR>了ss的元素的树集?BR>q里是一个说明TreeSet的例子?BR>// Demonstrate TreeSet.
import java.util.*;
class TreeSetDemo {
public static void main(String args[]) {
// Create a tree set
TreeSet ts = new TreeSet();
// Add elements to the tree set
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
System.out.println(ts);
}
}
q个E序的输出如下所C:
[A, B, C, D, E, F]
正如上面解释的那P因ؓTreeSet按树存储其元素,它们被按照排序次序自动安排,
如程序输出所C?BR>15.4 通过q代函数讉Kc集
通常希望循环通过c集中的元素。例如,可能会希望显C每一个元素。到目前为止Q?BR>处理q个问题的最单方法是使用iteratorQiterator是一个或者实现Iterator或者实?BR>ListIterator接口的对象。Iterator可以完成循环通过c集Q从而获得或删除元素。ListIterator
扩展IteratorQ允许双向遍历列表,q可以修改单元。Iterator接口说明的方法ȝ在表15-4
中。ListIterator接口说明的方法ȝ在表15-5中?BR>?5-4 由Iterator 定义的方?BR>Ҏ描述
boolean hasNext( ) 如果存在更多的元素,则返回trueQ否则返回false
Object next( ) q回下一个元素。如果没有下一个元素,则引发NoSuchElementException异常
void remove( ) 删除当前元素Q如果试囑֜调用next( )Ҏ之后Q调用remove( )ҎQ则引发
IllegalStateException异常
?5-5 由ListIterator 定义的方?BR>Ҏ描述
void add(Object obj) obj插入列表中的一个元素之前,该元素在下一ơ调用next( )ҎӞ被返
?BR>boolean hasNext( ) 如果存在下一个元素,则返回trueQ否则返回false
boolean hasPrevious( ) 如果存在前一个元素,则返回trueQ否则返回false
Object next( ) q回下一个元素,如果不存在下一个元素,则引发一个NoSuchElement
Exception异常
int nextIndex( ) q回下一个元素的下标Q如果不存在下一个元素,则返回列表的大小
Object previous( ) q回前一个元素,如果前一个元素不存在Q则引发一个NoSuchElement
Exception异常
int previousIndex( ) q回前一个元素的下标Q如果前一个元素不存在Q则q回-1
void remove( ) 从列表中删除当前元素。如果remove( )Ҏ在next( )Ҏ或previous( )Ҏ?BR>用之前被调用Q则引发一个IllegalStateException异常
void set(Object obj) obj赋给当前元素。这是上一ơ调用next( )Ҏ或previous( )Ҏ最后返回的
元素
15.4.1 使用q代函数
在通过q代函数讉Kc集之前Q必dC个P代函数。每一个Collectionc都提供一
个iterator( )函数Q该函数q回一个对c集头的q代函数。通过使用q个q代函数对象Q可
以访问类集中的每一个元素,一ơ一个元素。通常Q用P代函数@环通过c集的内容,
步骤如下Q?BR>1. 通过调用c集的iterator( )Ҏ获得对类集头的P代函数?BR>2. 建立一个调用hasNext( )Ҏ的@环,只要hasNext( )q回trueQ就q行循环q代?BR>3. 在@环内部,通过调用next( )Ҏ来得到每一个元素?BR>对于执行List的类集,也可以通过调用ListIterator来获得P代函数。正如上面解释的?BR>P列表q代函数提供了前向或后向讉Kc集的能力,q可让你修改元素。否则,ListIterator
如同Iterator功能一栗?BR>q里是一个实现这些步骤的例子Q说明了Iterator和ListIterator。它使用ArrayList对象Q?BR>但是ȝ原则适用于Q何类型的c集。当ӞListIterator只适用于那些实现List接口的类集?BR>// Demonstrate iterators.
import java.util.*;
class IteratorDemo {
public static void main(String args[]) {
// create an array list
ArrayList al = new ArrayList();
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// use iterator to display contents of al
System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
// modify objects being iterated
ListIterator litr = al.listIterator();
while(litr.hasNext()) {
Object element = litr.next();
litr.set(element + "+");
}
System.out.print("Modified contents of al: ");
itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
314 W? 部分Java ?BR>// now, display the list backwards
System.out.print("Modified list backwards: ");
while(litr.hasPrevious()) {
Object element = litr.previous();
System.out.print(element + " ");
}
System.out.println();
}
}
E序的输出如下所C:
Original contents of al: C A E B D F
Modified contents of al: C+ A+ E+ B+ D+ F+
Modified list backwards: F+ D+ B+ E+ A+ C+
特别值得注意的是Q列表是如何被反向显C的。在列表被修改之后,litr指向列表的末
端(CQ当到达列表末端Ӟlitr.hasNext( )Ҏq回falseQ。ؓ了以反向遍历列表Q程?BR>l箋使用litrQ但q一ơ,E序它是否有前一个元素。只要它有前一个元素,该元素就
被获得ƈ被显C出来?BR>
]]>
1、?”ؓ通配W,表示M一个字W,例如Q“a.c”可以匹配“anc”、“abc”、“acc”;
2、“[]”,在[]内可以指定要求匹配的字符Q例如:“a[nbc]c”可以匹配“anc”、“abc”、“accQ?BR>但不可以匚w“ancc?a到z可以写成[a-z],0?可以写成[0-9];
3、数量限定符P表示匚wơ数Q或者叫做长度)的符P
包括Q?”—?ơ或者多?BR> ?”—?ơ或者多?BR> ?”—?ơ或??BR> “{n}”——匹配nơ,n为整?BR> “{n,m}”——匹配从n到m之间的某个数的次敎ͼn和m都是整数Q?BR> “{n,}”——匹配n到无Ih之间Lơ数Q?BR> “{,m}”——匹?到m之间Lơ数Q?BR>他们攑ֈ匚w格式的后面:
例如Q?BR>电话LQ?24Q?4820482Q?2484820482(假设前面3或?位,后面7或?位,q且中间的减号可有可?
都是W合规定的,那么可以用如下格式来匚wQ[0-9]{3,4} \-? [0-9]{7,8}Q?BR>注意Q“\”ؓ转义字符Q因为?”在正则表达式用有代表一个范围的意义Q例如:前面所说的[0-9]Q?BR>所以它需要{义字W“\”进行{义才可用;
4、“^”ؓ否符P表示不想匚w的符P例如Q[^z][a-z]+可以匚w所有除“z”开头的以外的所有字
W串Q长度大?Q因为?”表C大于等?的次敎ͼ从第二位开始都是小写英文字W)Q?BR>如果^攑ֈ[]的外边则表示以[]开头的字符Ԍ^[az][a-z]+表示a或者z开头的长度大于{于2的英文字W串Q?BR>
5、“|”或q算W,例如Qa[n|bc|cb]c可以匚w“abcc?“anc?“acbc”;
6、?”以它前面的字符l尾的;例如Qab+$可以被“abb”,“ab”匹配;
7、一些简单表C方法:
\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],是I格字符包括tabQ空格等{?\S表示[^\t\n\r\f]Q就是非I格字符;
]]>
自定义标{ֿ得:
1昄面QjspQ:<%@ taglib uri="/helloworld" prefix="mytag" %>
2web.xml:
3helloword.tld文g
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
4新徏java文g模型Q?BR>package untitled1;
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.http.HttpSession;
public class HelloWorldTag extends TagSupport {
public HelloWorldTag() {
}
public int doStartTag() throws JspTagException{
JspWriter out=pageContext.getOut();
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspTagException{
return EVAL_PAGE;
}
}
自定义标{֏数ȝQ?/P>
java文g加入Q?BR> private String parm1=null;
public void setParm1(String parm1)
{
this.parm1 = parm1;
}
tld文g加入Q?BR>
1.若明参数名和参数值则直接在URI后输出,
如:
2.对于参数g定的,paramName和paramProperty来输出,用paramId属性指定参数名?BR>对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来_是从ActioncMq来的,作ؓrequest的属性之一Qrequst.setAttribute("name",object)Q?BR>如果paramName指定的对象是action的ActionFormQ则无需使用request.setAttributeҎ?BR>例:
若参数值是一个bean对象的属性|比如ActionForm,或者集合中存放的对象)则:
3.若两个参敎ͼ一个确定一个不定Q则是以上两U方法的l合Q即Q?BR>
4.对于多个参数的问题,可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式QparamName属性值指定ؓ该HashMap集合对象卛_?BR>举例Q?BR><%
//代码理想的位|应该是在action?BR>//可以在jsp面试
java.util.HashMap pms = new java.util.HashMap();
pms.put("code", "001002");
pms.put("name", "tester");
pms.put("alias", new String[]{"matin","jack"});
request.setAttribute("params", pms);
%>
~译后的l果Q?A href="/test.do?code=001002&name=tester&alias=matin&alias=jack">test
q种方式虽然可以解决传多参数的问题,但是实现h也比较麻烦,特别是对记录集中的数据逐条列出的时?/P>
5.针对有的|友?html:link>标签中嵌入用jsp脚本(scriptlet)的问题,
例如:
虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用Q但是有时在委曲求全的情况下也只能如此了Q除非用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只ȝQ就可以用嵌入jsp脚本来实玎ͼ
<%
boolean rdonly=false;
if(2==2) rdonly=true;
%>
Q题外话Q呵呵)
6.另外一U比较变态的ҎQ既不是真正意义上的strutsQ也不符合xml规范。那是?A>标签中用 先说q么多吧Q有更好的方法再来补充!
Q偶l常q样用,哈哈Q简单!Q?/P>
表达式语a
?JSP 1.2 中,可以使用静态字W串或表辑ּQ如果允许的话)指定 JSP 操作的属性。例如,在清?2 中,?
清单 2. 合ƈh时属性值的 JSP 操作
因ؓh时属性值是用表辑ּ指定的,所以它们往往有和其它脚本元素一L软gl护问题。因此,JSTL 定制标记支持另一U用于指定动态属性值的机制。可以用化的表达式语aQELQ而不使用完整?JSP 表达式来指定 JSTL 操作的属性倹{EL 提供了一些标识符、存取器和运符Q用来检索和操作ȝ?JSP 容器中的数据。EL 在某U程度上?EcmaScriptQ请参阅参考资料)?XML 路径语言QXML Path LanguageQXPathQؓ基础Q因此页面设计h员和E序员都应该熟悉它的语法。EL 擅长L对象及其Ҏ,然后对它们执行简单操作;它不是编E语aQ甚至不是脚本编制语a。但是,?JSTL 标记一起用时Q它p使用单而又方便的符h表示复杂的行为。EL 表达式的格式是这LQ用元W号Q?Q定界,内容包括在花括号Q{}Q中Q如清单 3 所C?
清单 3. 说明 EL 表达式定界符?JSTL 操作