知识大全 用Java Servlet构建旗帜广告系统
Posted 文件
篇首语:男儿欲遂平生志,五经勤向窗前读。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java Servlet构建旗帜广告系统相关的知识,希望对你有一定的参考价值。
用Java Servlet构建旗帜广告系统 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
对于一个商务网站来说 广告系统是必不可少的 一个好的广告系统是一个网站稳定收入的基础 而旗帜广告(banner)则是网站广告中占绝大部分的广告 因此开发一个旗帜广告系统就非常重要了 利用Java Servlet 我们可以很轻松的构建属于我们自己的旗帜广告系统
我们一般在网页上放上一些图片 设置它们的链接指向广告客户的网页 然后产生日志文件存放浏览的人数 浏览者的IP等信息 这就是开发旗帜广告系统的一般思路 下面 我想结合一个例程来介绍一下如何使用Java Servlet来构建旗帜广告系统 下面这个例子中 你必须在你的HTML文件中使用<IMG> 标签 用法有三种是
) Banner?config_file 或Banner?config=config_file
例如
<IMG height= src= //localhost/servlet/Banner?config_file width= >
用这种方法你就可以显示不同的图片了
) 你也可以为每一幅图片设置自己的重定向URL 只需在你的设置中添加文件描述 见下面的例子 Servlet也需要更多的描述参数
<IMG height= src= //localhost/servlet/Banner?config=config_file&mode= width= >
这样你就可以支持标准的旗帜广告了
)你也可以在同一个页面上有多个旗帜广告 你只需要在参数中加入 id=某个整数值 就可以了 这个值必须是一个你的页面内唯一的整数值!例如 对于第一个banner的描述为
<IMG height= src= //localhost/servlet/Banner?config=config_file&mode= &id= width= >
第二个为
<IMG height= src= //localhost/servlet/Banner?config=config_file&mode= &id= width= >
有的朋友会问了 config_file是什么文件呀? 它是一个文本文件 用来描述Servlet的设置信息 你能在你的主机的任何地方保存这个文件 现把参数介绍一下 这个配置文件有三个参数 分别为
dir=some_directory
解释 dir是你的旗帜广告文件存放的目录 可以使用的图片格式有JPG GIF PNG JPEG等 这个参数是必须有的 否则系统会报错
bannerfilename=some_url
解释 banner文件使用下面的格式 例如
banner gif=// yesky /
banner jpg=// yesky /
log=some_directory_to_store_log_file
解释 存放日志文件的目录 可以是服务器上的任何目录 附录 日志文件(log file)及格式
Banner 系统每天会自动产生两个日志文件 分别为ddmmyyyyv txt和ddmmyyyyc txt 第一个文件保存浏览banner的记录 第二个文件保存重定向的记录 两个文件都是文本文件 每一行包括一条记录 纪录格式是
IP地址 日期 图片文件 用户代理 重定向记录 (只用于 *c txt文件) 字段之间用空格隔开
附录 Banner java源程序
import java io *;
import java util *;
import javax servlet *;
import javax servlet *;
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 sLineInformation ;//
while((sLineInformation = bufferedreader readLine()) != null)
sLineInformation = sLineInformation trim();//去除字符串中的空格
if(sLineInformation length() > )//如果字符串sLineInformation 的长度大于零
int i = sLineInformation indexOf( = );
if(i > && i < sLineInformation length() && sLineInformation charAt( ) != # && !sLineInformation startsWith( // )) //配置文件的每一行参数必须以不为#或//开头的字符串
hashtable put(sLineInformation substring( i) trim() toLowerCase() sLineInformation substring(i + ) trim());
bufferedreader close();
File file = new File(sConfig);//创建一个配置文件
hashtable put( edited String valueOf(file lastModified()));
catch(Exception _ex)
return false;
String sDirInfo = (String)hashtable get( dir );//取得目录参数
if(sDirInfo != null)//如果目录参数是空值
if(!sDirInfo endsWith(separator))//如果sDirInfo 不是以分隔符结尾 那么
sDirInfo = sDirInfo + separator;//给sDirInfo 加上分隔符
hashtable remove( dir );//移去哈希表变量中的dir
hashtable put( dir sDirInfo );
File file = new File(sDirInfo );
String as[] = file list();
if(as == null)
hashtable remove( dir );
sDirInfo = (String)hashtable get( log );
if(sDirInfo != null)
if(!sDirInfo endsWith(separator))
sDirInfo = sDirInfo + separator;
hashtable remove( log );
hashtable put( log sDirInfo );
File file = new File(sDirInfo );
String as [] = file list();
if(as == null)
hashtable remove( log );
return true;
private Hashtable getConfig(String s)//取得配置
Hashtable hashtable = (Hashtable)cfgs get(s);
if(hashtable != null)//如果配置不为空
try
String s = (String)hashtable get( edited );
File file = new File(s);
if(!s equals(String valueOf(file lastModified())))
//如果s 的值不等于文件最后一次修改的值 则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 ervletrequest HttpServletResponse ervletresponse) //读取GET
throws ServletException IOException
String strConfig = ervletrequest getQueryString();
//读取请求字符串
if(strConfig == null)//如果字符串为空
strConfig = ;//那么设置strConfig为空
if(strConfig length() == )
//如果strConfig长度为零 那么显示错误信息
errorMessage( 无配置信息! ervletresponse);
return;
String strConfig = getFromQuery(s config= );//同上
if(strConfig length() == )
strConfig = strConfig;
Hashtable hashtable = getConfig(strConfig );
if(hashtable == null)
errorMessage( 配置信息错误! ervletresponse);
return;
if(hashtable get( dir ) == null)
//如果哈希表中dir为空值 则输出错误信息
errorMessage( 不能打开数据目录 ervletresponse);
return;
String strConfigMode = getFromQuery(strConfig mode= );//读取配置中的mode值
if(strConfigMode length() == )//如果没有mode值
strConfigMode = ;//则设mode值为
String strConfigId = getFromQuery(strConfig id= );//读取配置中的id值
if(strConfigId length() == ) file://如果没有id值
strConfigId = ;//则设id值为
HttpSession ession = ervletrequest getSession(true);
if(strConfigMode equals( ))
file://如果strConfigMode 的值为 则显示banner广告
showBanner(hashtable strConfigId ession ervletrequest ervletresponse);
return;
else //否则转向banner所指的站点
goToSite(hashtable strConfigId ession ervletrequest ervletresponse);
return;
private void goToSite(Hashtable hashtable String s HttpSession ession HttpServletRequest ervletrequest HttpServletResponse ervletresponse)//转向站点
throws IOException //如果有任何错误 抛出IOException错误
String sitename ;//定义站点名
if(ession == null)//如果ession为空
sitename = getFirstSite(hashtable);//站点名为哈希表中的第一个站点名
else //否则
Hashtable hashtable = (Hashtable)ession getValue( 旗帜广告系统 Wayne Zheng );
if(hashtable == null) //如果哈希表hashtable 为空值 则
sitename = getFirstSite(hashtable);// 站点名为哈希表(hashtable)中的第一个站点名
else
sitename = (String)hashtable get(s);
if(sitename == null)
//如果站点名为空值则站点名为默认值// yesky
sitename = // yesky ;
String s ;
if(hashtable get( log ) != null && (s = getFileByUrl(hashtable s )) != null)
writeLog(hashtable s sitename c ervletrequest);
ervletresponse sendRedirect(sitename );
private void showBanner(Hashtable hashtable String s HttpSession ession HttpServletRequest ervletrequest HttpServletResponse ervletresponse)
throws IOException
String s = (String)hashtable get( dir );
File file = new File(s );
Vector vector;
if(file == null)
vector = new Vector();
else
String as[] = file list();
vector = getGraphFiles(as);
if(vector size() == )
ervletresponse setContentType( text/ );
PrintWriter out = ervletresponse getWriter();
out println( 目录是空的! );
out flush(); out close();
return;
int i;
if(ession != null)
synchronized(hashtable get( dir ))
Integer integer;
int j;
if((integer = (Integer)ession getValue( bi )) == null)
j = ;
else
j = integer intValue();
if(j >= vector size())
j = ;
i = j;
if(++j >= )
j = ;
ession putValue( bi new Integer(j));
else
i = ;
String s = (String)vector elementAt(i);
String s ;
if(ession != null && (s = getUrl(hashtable s )) != null)
Hashtable hashtable ;
if((hashtable = (Hashtable)ession getValue( 旗帜广告系统 Wayne Zheng )) == null)
hashtable = new Hashtable();
hashtable put(s s );
ession putValue( 旗帜广告系统 Wayne Zheng hashtable );
if(hashtable get( log ) != null)
writeLog(hashtable s v ervletrequest);
outputBanner(s hashtable ervletresponse);
vector = null;
private void writeLog(Hashtable logHashtable String logString String logString String logString HttpServletRequest ervletrequest)//写日志的函数
String logString = (String)hashtable get( log );
String logString = getLogString(logString ervletrequest) + \\ + logString + \\ ;
GregorianCalendar gregoriancalendar = new GregorianCalendar();
//获取当前的时间
gregoriancalendar setTime(new Date());
String logString = logString + stringDate(gregoriancalendar) + logString + txt ;//以时间戳和 c 或 v 为文件名来写日志文件
saveLog(hashtable logString logString );
private void writeLog(Hashtable logHashtable String logString String logString HttpServletRequest ervletrequest) file://写日志文件
String logString = (String)logHashtable get( log );
String logString = getLogString(logString ervletrequest);
GregorianCalendar gregoriancalendar = new GregorianCalendar();
gregoriancalendar setTime(new Date());
String logString = logString + stringDate(gregoriancalendar) + logString + txt ;
saveLog(logHashtable logString logString );
private void saveLog(Hashtable hashtable String s String s )//把日志文件保存在硬盘上
synchronized(hashtable get( log ))
try
FileWriter filewriter = new FileWriter(s true);
PrintWriter prinriter = new PrintWriter(filewriter);
prinriter println(s );
prinriter flush();
prinriter close();
filewriter close();
catch(Exception _ex)
private String getLogString(String s HttpServletRequest ervletrequest) //取得日志字符串
String s = ervletrequest getRemoteAddr();
//取得远程的访问者的IP地址
String s = ervletrequest getHeader( User Agent );
String s = ervletrequest getHeader( Referer );
String s = \\ + s + \\ ;
if(s == null)
s = ;
if(s == null)
s = ;
else
s = \\ + s + \\ ;
if(s == null)
s = ;
else
s = \\ + s + \\ ;
return s + [ + new Date() + ] + s + + s + + s ;
private String stringDate(Calendar calendar) //取得时间戳
String s = String valueOf(calendar get( ));
String s = String valueOf(calendar get( ));
if(s length() == )
s = + s ;
s = s + s ;
s = String valueOf(calendar get( ));
if(s length() == )
s = + s ;
return s + s ;
private String getFileByUrl(Hashtable hashtable String s)
for(Enumeration enumeration = hashtable keys(); enumeration hasMoreElements();)
//hashtable的keys()方法返回了哈希表关键字的枚举 enumeration的hasMoreElements()方法测试枚举重是否还有其他元素
String s = (String)enumeration nextElement();
//让s 的值为enumeration的下一个元素值
if(s equals(hashtable get(s )))//如果s的值为s 的值 则
return s ;//返回s 的值
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() == )//如果没有图形文件 则返回空值
return null;
else
return getUrl(hashtable (String)vector elementAt( ));
private String getUrl(Hashtable hashtable String s)//取得URL
String s = s toLowerCase();//设置s 为s的小写形式
for(Enumeration enumeration = hashtable keys(); enumeration hasMoreElements();)
String s = (String)enumeration nextElement();
if(s equals(s toLowerCase()))
return (String)hashtable get(s );
return null;
private void outputBanner(String s Hashtable hashtable HttpServletResponse ervletresponse)//输出banner广告
throws IOException//如果有错则抛出IOException错误
String s = (String)hashtable get( dir ) + s;
ervletresponse setHeader( Cache control no store );
ervletresponse setHeader( Pragma no cache );
ervletresponse setDateHeader( Expires L);
ervletresponse setContentType( image/ + s substring(s indexOf( ) + ));
javax servlet ServletOutputStream servletoutputstream = ervletresponse getOutputStream();
dumpFile(s servletoutputstream);
servletoutputstream flush();
servletoutputstream close();
private boolean dumpFile(String s OutputStream outputstream)
byte abyte [] = new byte[ ];
boolean flag = true;
try
FileInputStream fileinputstream = new FileInputStream(s);
int i;
while((i = fileinputstream read(abyte )) != )
outputstream write(abyte 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 = ; 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 <= || i == stringFileName length() )
return false;
//判断文件是否以GIF JPG JPEG或 PNG结尾
String stringExtendFileName = stringFileName substring(i + );
return stringExtendFileName equals( GIF ) || stringExtendFileName equals( JPG ) || stringExtendFileName equals( JPEG ) || stringExtendFileName equals( PNG );
private void errorMessage(String s HttpServletResponse ervletresponse)
throws IOException
ervletresponse setContentType( text/ );
PrintWriter out = ervletresponse 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 strQuery )
if(strQuery == null)
return ;
int i;
if((i = strQuery indexOf(strQuery )) < )
return ;
String strQuery = strQuery substring(i + strQuery length());
if((i = strQuery indexOf( & )) < )
return strQuery ;
else
return strQuery substring( i);
public String getServletInfo()
return 旗帜广告系统 Wayne Zheng ;
private static final String CPR = ? Wayne Zheng ;
private static final String DEFAULT_SITE = yesky ;
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 = ;
static String separator = / ;
private static Hashtable cfgs;
private static Hashtable logs;
cha138/Article/program/Java/hx/201311/27253相关参考
Javaservlet多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Servlet体系结
知识大全 面向Java开发人员的Scala指南: Scala和servlet
面向Java开发人员的Scala指南:Scala和servlet 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
怎样使用JavaServlet动态生成图片详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在
Ajax代理的JavaServlet的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 
知识大全 Java Servlet 和 JSP入门教程(1)
JavaServlet和JSP入门教程(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 概述
知识大全 Java Servlet 和 JSP入门教程(4)
JavaServlet和JSP入门教程(4) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 输出
知识大全 Java Servlet 和 JSP入门教程(2)
JavaServlet和JSP入门教程(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 安装
知识大全 Java Servlet 和 JSP入门教程(3)
JavaServlet和JSP入门教程(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Se
知识大全 深入理解Java Servlet与Web容器之间的关系
深入理解JavaServlet与Web容器之间的关系 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
对于方法的创建可将其想象成为自己写的每个类都调用一次initialize()这个名字提醒我们在使用对象之前应首先进行这样的调用但不幸的是这也意味着用户必须记住调用方法在Java中由于提供了名为