时间: 2021-07-31 作者:daque
对于一个商务网站来说,告白体例是必不行少的。一个好的告白体例是一个网站宁静收入的普通。而旗号告白(banner)则是网站告白中占绝大局部的告白,所以开拓一个旗号告白体例就特殊要害了。运用java servlet 咱们不妨很轻快的建立属于咱们本人的旗号告白体例。 咱们普遍在网页上放上少许图片,树立它们的链接指向告白存户的网页,而后爆发日记文献寄存欣赏的人头,欣赏者的ip等消息,这即是开拓旗号告白体例的普遍思绪。 底下,我想贯串一个例程来引见一下怎样运用java servlet来建立旗号告白体例。这底下这个例子中,你必需运用在你的html文献中运用<img> 标签。 用法有三种是: 1) banner?config_file 或banner?config=config_file 比方: <img height=125 src="http://localhost/servlet/banner?config_file" width=125> 用这种本领你就不妨表露各别的图片了。 2) 你也不妨为每一幅图片树立本人的重定向url。只需在你的树立中增添文献刻画,见底下的例子,servlet也须要更多的刻画参数: <img height=60 src="http://localhost/servlet/banner?config=config_file&mode=1" width=468> 如许你就不妨扶助规范的旗号告白了。 3)你也不妨在同一个页面上有多个旗号告白。你只须要在参数中介入“id=某个平头值”就不妨了。这个值必需是一个你的页面内独一的平头值!比方,对于第一个banner的刻画为: <img height=60 src="http://localhost/servlet/banner?config=config_file&mode=1&id=1" width=468> 第二个为: <img height=125 src="http://localhost/servlet/banner?config=config_file&mode=1&id=2" width=125> 有的伙伴会问了,config_file是什么文献呀? 它是一个文本文献,用来刻画servlet的树立消息。你能在你的长机的任何场合生存这个文献。现把参数引见一下,这个摆设文献有三个参数:辨别为 1、dir=some_directory 证明: dir是你的旗号告白文献寄存的目次,不妨运用的图片方法有jpg ,gif,png ,jpeg等。这个参数是必需有的,要不体例会报错。 2、bannerfilename=some_url 证明: banner文献运用底下的方法,比方: banner.gif=http://www.yesky.com/ banner.jpg=http://www.yesky.com/ 3、log=some_directory_to_store_log_file 证明:寄存日记文献的目次,不妨是效劳器上的任何目次。 附录1、日记文献(log file)及方法 banner 体例每天会机动爆发两个日记文献。辨别为ddmmyyyyv.txt和ddmmyyyyc.txt 。第一个文献生存欣赏banner的记载,第二个文献生存重定向的记载。两个文献都是文本文献,每一条龙囊括一条记载。记录方法是: ip地方 日子 图片文献 用户代劳 重定向记载 (只用来 *c.txt文献) ,字段之间用空格隔绝。 附录2、banner.java源步调: import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class banner extends httpservlet { public banner(){ } //读取摆设文献实质 private boolean readconfig(string sconfig, hashtable hashtable) { try { bufferedreader bufferedreader = new bufferedreader(new inputstreamreader(new fileinputstream(sconfig)));// 树立缓冲区读入一个摆设文献 string slineinformation1;// while((slineinformation1 = bufferedreader.readline()) != null) { slineinformation1 = slineinformation1.trim();//去除字符串中的空格 if(slineinformation1.length() > 0)//即使字符串slineinformation1的长度大于零 { int i = slineinformation1.indexof("="); if(i > 0 && i < slineinformation1.length() - 1 && slineinformation1.charat(0) != "#" && !slineinformation1.startswith("//"))//摆设文献的每一条龙参数必需以不为#或//发端的字符串 hashtable.put(slineinformation1.substring(0, i).trim().tolowercase(), slineinformation1.substring(i + 1).trim()); } } bufferedreader.close(); file file = new file(sconfig);//创造一个摆设文献 hashtable.put("edited", string.valueof(file.lastmodified())); } catch(exception _ex) { return false; } string sdirinfo2 = (string)hashtable.get("dir");//博得目次参数 if(sdirinfo2 != null)//即使目次参数是空值 { if(!sdirinfo2.endswith(separator))//即使sdirinfo2不是以分割符结果,那么 { sdirinfo2 = sdirinfo2 + separator;//给sdirinfo2加上分割符 hashtable.remove("dir");//移去哈希表变量中的dir hashtable.put("dir", sdirinfo2); } file file1 = new file(sdirinfo2); string as[] = file1.list(); if(as == null) { hashtable.remove("dir"); } sdirinfo2 = (string)hashtable.get("log"); if(sdirinfo2 != null) { if(!sdirinfo2.endswith(separator)) { sdirinfo2 = sdirinfo2 + separator; hashtable.remove("log"); hashtable.put("log", sdirinfo2); } file file2 = new file(sdirinfo2); string as1[] = file2.list(); if(as1 == null) { hashtable.remove("log"); } return true; } private hashtable getconfig(string s)//博得摆设 { hashtable hashtable = (hashtable)cfgs.get(s); if(hashtable != null)//即使摆设不为空 try { string s1 = (string)hashtable.get("edited"); file file = new file(s); if(!s1.equals(string.valueof(file.lastmodified()))){ //即使s1的值不即是文献结果一次窜改的值,则hashtable的实质为空值 hashtable = null; } catch(exception _ex)//捕捉exception _ex缺点 { hashtable = null; } if(hashtable != null) return hashtable; hashtable = new hashtable(); if(!readconfig(s, hashtable)) { return null; } else { cfgs.put(s, hashtable); return hashtable; } } public void init(servletconfig servletconfig)//初始化摆设参数 throws servletexception { //即使堕落,抛出一个servletexception缺点 super.init(servletconfig); separator = system.getproperty("file.separator");//博得分割符 cfgs = new hashtable();//树立摆设变量 logs = new hashtable();//树立日记变量 system.out.println("? wayne zheng ");//屏幕输入我的邮箱地方 } public void destroy() { } public void dopost(httpservletrequest request, httpservletresponse response) //发送post乞求 throws servletexception, ioexception { doget(request, response); } public void doget(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) //读取get throws servletexception, ioexception { string strconfig = httpservletrequest.getquerystring(); //读取乞求字符串 if(strconfig == null)//即使字符串为空 strconfig = "";//那么树立strconfig为空 if(strconfig.length() == 0) //即使strconfig长度为零,那么表露缺点消息 { errormessage("无摆设消息!", httpservletresponse); return; } string strconfig1 = getfromquery(s, "config=");//同上 if(strconfig1.length() == 0){ strconfig1 = strconfig; hashtable hashtable = getconfig(strconfig1); if(hashtable == null) { errormessage("摆设消息缺点!", httpservletresponse); return; } if(hashtable.get("dir") == null) //即使哈希表中dir为空值,则输入缺点消息 { errormessage("不许翻开数据目次", httpservletresponse); return; } string strconfigmode2 = getfromquery(strconfig, "mode=");//读取摆设中的mode值 if(strconfigmode2.length() == 0){//即使没有mode值 strconfigmode2 = "1";//则设mode值为1 string strconfigid3 = getfromquery(strconfig, "id=");//读取摆设中的id值 if(strconfigid3.length() == 0){ file://即使没有id值 strconfigid3 = "1";//则设id值为1 httpsession httpsession = httpservletrequest.getsession(true); if(strconfigmode2.equals("1")) file://即使strconfigmode2的值为1,则表露banner告白 { showbanner(hashtable, strconfigid3, httpsession, httpservletrequest, httpservletresponse); return; } else //要不转向banner所指的站点 { gotosite(hashtable, strconfigid3, httpsession, httpservletrequest, httpservletresponse); return; } } private void gotosite(hashtable hashtable, string s, httpsession httpsession, httpservletrequest httpservletrequest, httpservletresponse httpservletresponse)//转向站点 throws ioexception //即使有任何缺点,抛出ioexception缺点 { string sitename1;//设置站点卯 if(httpsession == null)//即使httpsession为空 { sitename1 = getfirstsite(hashtable);//站点卯为哈希表中的第一个站点卯 } else //要不 { hashtable hashtable1 = (hashtable)httpsession.getvalue("旗号告白体例 ,wayne zheng"); if(hashtable1 == null){ //即使哈希表hashtable1为空值,则 sitename1 = getfirstsite(hashtable);// 站点卯为哈希表(hashtable)中的第一个站点卯 else sitename1 = (string)hashtable1.get(s); } if(sitename1 == null) //即使站点卯为空值则站点卯为默许值http://www.yesky.com sitename1 = "http://www.yesky.com"; string s2; if(hashtable.get("log") != null && (s2 = getfilebyurl(hashtable, s1)) != null){ writelog(hashtable, s2, sitename1, "c", httpservletrequest); httpservletresponse.sendredirect(sitename1); } private void showbanner(hashtable hashtable, string s, httpsession httpsession, httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) throws ioexception { string s1 = (string)hashtable.get("dir"); file file = new file(s1); vector vector; if(file == null) { vector = new vector(); } else { string as[] = file.list(); vector = getgraphfiles(as); } if(vector.size() == 0) { httpservletresponse.setcontenttype("text/html"); printwriter out = httpservletresponse.getwriter(); out.println("目次是空的!"); out.flush(); out.close(); return; } int i; if(httpsession != null) synchronized(hashtable.get("dir")) { integer integer; int j; if((integer = (integer)httpsession.getvalue("bi")) == null){ j = 0; else j = integer.intvalue(); if(j >= vector.size()) { j = 0; i = j; if(++j >= 3){ j = 0; httpsession.putvalue("bi", new integer(j)); } else i = 0; string s2 = (string)vector.elementat(i); string s3; if(httpsession != null && (s3 = geturl(hashtable, s2)) != null) { hashtable hashtable1; if((hashtable1 = (hashtable)httpsession.getvalue("旗号告白体例 ,wayne zheng")) == null){ hashtable1 = new hashtable(); hashtable1.put(s, s3); httpsession.putvalue("旗号告白体例 ,wayne zheng", hashtable1); } if(hashtable.get("log") != null) { writelog(hashtable, s2, "v", httpservletrequest); outputbanner(s2, hashtable, httpservletresponse); vector = null; } private void writelog(hashtable loghashtable, string logstring, string logstring1, string logstring2, httpservletrequest httpservletrequest)//写日记的因变量 { string logstring3 = (string)hashtable.get("log"); string logstring4 = getlogstring(logstring, httpservletrequest) + " \"" + logstring1 + "\""; gregoriancalendar gregoriancalendar = new gregoriancalendar(); //获得暂时的功夫 gregoriancalendar.settime(new date()); string logstring5 = logstring3 + stringdate(gregoriancalendar) + logstring2 + ".txt";//以功夫戳和“c”或“v”为文献名来写日记文献 savelog(hashtable, logstring5, logstring4); } private void writelog(hashtable loghashtable, string logstring, string logstring1, httpservletrequest httpservletrequest) file://写日记文献 { string logstring2 = (string)loghashtable.get("log"); string logstring3 = getlogstring(logstring, httpservletrequest); gregoriancalendar gregoriancalendar = new gregoriancalendar(); gregoriancalendar.settime(new date()); string logstring4 = logstring2 + stringdate(gregoriancalendar) + logstring1 + ".txt"; savelog(loghashtable, logstring4, logstring3); } private void savelog(hashtable hashtable, string s, string s1)//把日记文献生存在硬盘上 { synchronized(hashtable.get("log")) { try { filewriter filewriter = new filewriter(s, true); printwriter printwriter = new printwriter(filewriter); printwriter.println(s1); printwriter.flush(); printwriter.close(); filewriter.close(); } catch(exception _ex) { } } } private string getlogstring(string s, httpservletrequest httpservletrequest) //博得日记字符串 { string s1 = httpservletrequest.getremoteaddr(); //博得长途的考察者的ip地方 string s2 = httpservletrequest.getheader("user-agent"); string s3 = httpservletrequest.getheader("referer"); string s4 = "\"" + s + "\""; if(s1 == null) s1 = "-"; if(s2 == null) s2 = "-"; else s2 = "\"" + s2 + "\""; if(s3 == null) s3 = "-"; else s3 = "\"" + s3 + "\""; return s1 + " [" + new date() + "] " + s4 + " " + s3 + " " + s2; } private string stringdate(calendar calendar) //博得功夫戳 { string s = string.valueof(calendar.get(1)); string s1 = string.valueof(calendar.get(2)); if(s1.length() == 1) s1 = "0" + s1; s = s + s1; s1 = string.valueof(calendar.get(5)); if(s1.length() == 1) s1 = "0" + s1; return s + s1; } private string getfilebyurl(hashtable hashtable, string s) { for(enumeration enumeration = hashtable.keys(); enumeration.hasmoreelements();) //hashtable的keys()本领归来了哈希表要害字的列举,enumeration的hasmoreelements()本领尝试列举重能否再有其余元素 { string s1 = (string)enumeration.nextelement(); //让s1的值为enumeration的下一个元素值 if(s.equals(hashtable.get(s1)))//即使s的值为s1的值,则 return s1;//归来s1的值 } return null; } private string getfirstsite(hashtable hashtable)//博得第一个站点的名字 { string s = (string)hashtable.get("dir"); file file = new file(s); if(file == null) return null; string as[] = file.list(); vector vector = getgraphfiles(as); //树立vector向质变量来获得图形文献 if(vector.size() == 0)//即使没有图形文献,则归来空值 return null; else return geturl(hashtable, (string)vector.elementat(0)); } private string geturl(hashtable hashtable, string s)//博得url { string s1 = s.tolowercase();//树立s1为s的小写情势 for(enumeration enumeration = hashtable.keys(); enumeration.hasmoreelements();) { string s2 = (string)enumeration.nextelement(); if(s1.equals(s2.tolowercase())) return (string)hashtable.get(s2); } return null; } private void outputbanner(string s, hashtable hashtable, httpservletresponse httpservletresponse)//输入banner告白 throws ioexception//即使有错则抛出ioexception缺点 { string s1 = (string)hashtable.get("dir") + s; httpservletresponse.setheader("cache-control", "no-store"); httpservletresponse.setheader("pragma", "no-cache"); httpservletresponse.setdateheader("expires", 1l); httpservletresponse.setcontenttype("image/" + s.substring(s.indexof(".") + 1)); javax.servlet.servletoutputstream servletoutputstream = httpservletresponse.getoutputstream(); dumpfile(s1, servletoutputstream); servletoutputstream.flush(); servletoutputstream.close(); } private boolean dumpfile(string s, outputstream outputstream) { byte abyte0[] = new byte[4096]; boolean flag = true; try { fileinputstream fileinputstream = new fileinputstream(s); int i; while((i = fileinputstream.read(abyte0)) != -1) outputstream.write(abyte0, 0, i); fileinputstream.close(); } catch(exception _ex) { flag = false; } return flag; } private vector getgraphfiles(string as[])//赢得图片文献 { vector vector = new vector(); if(as == null)//即使as为空值,则归来vector中的值 return vector; for(int i = 0; i < as.length; i++)//as.length为as[]数组长度 { string s = as[i].touppercase();//树立图片文献文献名的每个字符为小写 if(isgraphfile(s))//即使为图片方法 vector.addelement(as[i]);//介入向量中 } return vector; } private boolean isgraphfile(string stringfilename) //确定文献能否为图形方法 { int i = stringfilename.indexof(".");// if(i <= 0 || i == stringfilename.length() - 1) return false; //确定文献能否以gif、jpg、jpeg或 png结果 string stringextendfilename1 = stringfilename.substring(i + 1); return stringextendfilename1.equals("gif") || stringextendfilename1.equals("jpg") || stringextendfilename1.equals("jpeg") || stringextendfilename1.equals("png"); } private void errormessage(string s, httpservletresponse httpservletresponse) throws ioexception { httpservletresponse.setcontenttype("text/html"); printwriter out = httpservletresponse.getwriter(); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(" " + s + " "); out.println(""); out.println(""); out.flush(); out.close(); } private string getfromquery(string strquery, string strquery1) { if(strquery == null) return ""; int i; if((i = strquery.indexof(strquery1)) < 0) return ""; string strquery2 = strquery.substring(i + strquery1.length()); if((i = strquery2.indexof("&")) < 0) return strquery2; else return strquery2.substring(0, i); } public string getservletinfo() { return "旗号告白体例 ,wayne zheng"; } private static final string cpr = "? wayne zheng "; private static final string default_site = "www.yesky.com"; private static final string banner_session = "旗号告白体例 ,wayne zheng"; private static final string dir = "dir"; private static final string log = "log"; private static final string bannerindex = "bi"; private static final string edited = "edited"; private static final string view_postfix = "v"; private static final string click_postfix = "c"; private static final string config = "config"; private static final string mode = "mode"; private static final string id = "id"; private static final int buffer_size = 4096; static string separator = "/"; private static hashtable cfgs; private static hashtable logs; }