HTTP请求中浏览器的缓存机制
流程
当资源第一次被访问的时候,HTTP头部如下
(Request-Line) GET /a.html HTTP/1.1
Host 127.0.0.1
User-Agent Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset gb2312,utf-8;q=0.7,;q=0.7
Keep-Alive 300
Connection keep-alive
HTTP返回头部如下
(Status-Line) HTTP/1.1 200 OK
Date Thu, 26 Nov 2009 13:50:54 GMT
Server Apache/2.2.11 (Unix) PHP/5.2.9
Last-Modified Thu, 26 Nov 2009 13:50:19 GMT
Etag "8fb8b-14-4794674acdcc0"
Accept-Ranges bytes
Content-Length 20
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html
当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如
Last-Modified // 指示最后修改的时间
Etag // 指示资源的状态唯一标识
Expires // 指示资源在浏览器缓存中的过期时间
接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息
当第二次请求该文件时,浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息
If-Modified-Since Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match "8fb8b-14-4794674acdcc0"
即把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信息。
如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下
(Status-Line) HTTP/1.1 304 Not Modified
Date Thu, 26 Nov 2009 14:09:07 GMT
Server Apache/2.2.11 (Unix) PHP/5.2.9
Connection Keep-Alive
Keep-Alive timeout=5, max=100
Etag "8fb8b-14-4794674acdcc0"
这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。
当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。
基本字段
Pragma
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。
Expires
文件在本地缓存的过期时间,如果浏览器发现缓存中的文件没有过期,则不发送请求(有例外,后面介绍)
Cache-Control
Cache -Control指定请求和响应遵循的缓存机制。
在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括
no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached
响应消息中的指令包括
public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各个消息中的指令含义如下:
-
Public指示响应可被任何缓存区缓存。
-
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
-
no-cache指示请求或响应消息不能缓存
-
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
-
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
-
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
-
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Etag/If-None-Match
一对验证文件实体的标记“Entity Tag”的响应/请求头Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的
Last-Modified/If-Modified-Since
一对验证文件的修改时间的响应/请求头
Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。
前两个用来控制缓存的失效日期,浏览器可通过它来判定,需不需要发出HTTP请求;
后两个用来验证网页的有效性,服务器端利用它来验证这个文件是否需要重新返回
Last-Modified VS Etag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
不同的情况
上面描述的是一个普通的浏览器缓存状态,在实际应用中,如页面跳转(点击页面链接跳转,window.open,在地址栏敲回车,刷新页面)等操作,会有一些区别
普通页面跳转
普通页面跳转包括链接点击跳转,用js脚本打开新页面(window.open)
无缓存情况下,请求会返回所有资源结果
设置Expires并且未过期时,浏览器将不会发出http请求
如果Expires过期,则会发送相应请求,并附带上Last-Modifed等信息,供服务器校验
页面刷新(F5)
这种情况一下,一般会看到很多304的请求,就是说即便资源设置了Expires且未过期,浏览器也会发送相应请求
IE和FF稍有区别
IE:
If-Modified-Since Wed, 18 Nov 2009 15:54:52 GMT
If-None-Match "2360492659"
Pragma: no-cache // 禁止缓存
FF:
If-Modified-Since Wed, 18 Nov 2009 15:54:52 GMT
If-None-Match "2360492659"
Cache-Control max-age=0 // 文件立即过期
强制刷新(Ctrl+F5)
效果和无缓存时候一致,返回200的结果
一些特殊的资源
IFRAME
FLASH
异步获取的数据
待研究……
Firefox常用web开发插件
Web Developer
以工具栏的形式对网页的(X)HTML、脚本、多媒体、CSS、缓存、图象等多方面的实用工具。使我们能轻易的获得网页的更多信息,使我们进一步的了解当前所浏览的网页。
说明:超强的web分析工具,开发人员必装
Firebug
Firebug是firefox下的一个插件,能够调试所有网站语言,如Html,Css等,但FireBug最吸引我的就是javascript调试功能,使用起来非常方便,而且在各种浏览器下都能使用(IE,Firefox,Opera, Safari),简直难以置信。除此之外,其他功能还很强大。比如html,css,dom的察看与调试,网站整体分析等等。总之就是一整套完整而强大的 WEB开发工具。
说明:查看,编辑,Debug页面的CSS,HTML,JavaScript。超强的开发调试的工具,开发人员必装。
View Source Char
画一个 Color-Coded 的图表的 Web 页的源代码。
说明:显示非常好看的源码,分级缩进,不同颜色区分。
Tamper Data
Tamper Data 的真实含义,即“篡改数据”(或者说定制 HTTP 请求):截取浏览器发出的每一个 HTTP 请求,提示我们选择是要进行定制,还是不做定制而直接提交请求,还是终止当前被截取的请求,然后根据我们的选择决定是打开定制窗口,还是直接向 WEB 服务器提交请求,还是终止当前的请求。
说明:查看 firefox收发请求的 header,特别是在发出请求前,可以修改 header。
YSlow
YSlow分析网页,并提出如何提高其性能的基础上一套规则,高性能的网页。
说明:能够帮我们分析web页面比较慢的原因,它是基于Firebug的,也能分开浏览web页面的元素,比如js,css.
HTML Validator
HTML Validator是一个Firefox扩展,它能查找并标志出HTML页面上的错误。HTML Validator以Tidy为基础,Tidy最初是W3C为验证HTML代码开发的一个工具。
说明:著名的 CSE HTML Validator 引擎。
MeasureIt
通过可以绘制在页面任何地方的刻度尺来显示以像素(px)计算的宽度、高度、元素缩进量。
说明:可以测量页面上任何选择区域的长宽,对界面设计人员非常有帮助。
ColorZilla
利用ColorZilla 您可以从浏览器中的任一点读取色彩值,快速调节颜色并粘贴到其他应用程序。您可以缩放正在查看的页面或测量页面任意两点之间的距离。
说明:从页面,或者调色板上取色,同时可以缩放页面。
如何解决DIV+CSS设置网页背景图片/位置/层次/背景不显示
对有些人来说,在网页上利用DIV+CSS来定位背景图片是一件难事,学会如何用DIV+CSS正确设置背景图片/位置/层次才能在日后的网页设计中少走弯路,希望本文能帮助你。
1、位置/层次
网页背景图片的位置可以是相对位置,也可以是绝对位置:
相对位置是以其他html标签为基础的,可以使用margin进行相应的设置;
绝对位置时要设置div的position属性为absolute,然后再通过left、top等确定位置。如果要控制背景的层次时一般使用绝对位置,并通过z-index对背景进行层次排列,z-index越大表示越在上层。
2、背景不显示
当给div设置背景图片时,没看到背景效果,有以下的可能原因:
a、背景图片路径错误或背景图片不存在或背景图片已损坏而不能正常加载;
b、没有设置div的宽高,当div中没有任何内容时,它的高度是0,那么自然就看不到背景图片了,你可以通过设置宽高来确定是否是这个原因导致的。
PHP自动执行任务的网站建设代码
PHP自动执行任务,关掉页面或浏览器也会自动定时执行:
<?php
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*5; // 每隔5分钟运行
do{
$fp = fopen(¹test.txt¹,¹a¹);
fwrite($fp,¹test¹);
fclose($fp);
sleep($interval); // 按设置的时间等待5分钟循环执行
}while(true);
?>
首先运行该程序,然后关闭该页面,程序仍然运行中,test便会每隔30秒的写入到text3.txt文件。
隔时生成首页的PHP代码:
<?php
set_time_limit(0);
$baseCmsUrl = "http://www.studstu.com";//你网站的根网址,结束不要加 /
$dmPageName = "index.php";//动态主页的名称
$stPageName = "index.html";//生成静态主页的名称
$mkTime = 3600;//你希望多长时间更新一次,单位是秒
//下面是执行的代码
$tureStFile = dirname(__FILE__).¹/¹.$stPageName;
$ftime = @filemtime($tureStFile);
if(!file_exists($tureStFile) || ($ftime < time()-$mkTime))
{
$body = file_get_contents($baseCmsUrl.¹/¹.$dmPageName);
$fp = fopen($tureStFile, ¹w¹);
fwrite($fp, $body);
fclose($fp);
}
?>
将上面代码保存为task.php
在经常访问的页面调用:<script language=¹Javascript¹ src=¹task.php¹></script>
在某个固定的时间执行的PHP代码:
<?php
//计划执行时间
if($job==¹cron¹){
check_method();
//查询数据库的下一个时间是否小于现在的时间
if($maxrecord[¹deltemptime¹]<$nowtime[¹timestamp¹]){
$crondb = array();
//day为0为每日 week周 minute时间断 hour什么时侯开始
$rt[¹cron¹] = array(¹day¹=>¹0¹,¹week¹=>$config[¹cron_week¹],¹m¹=>$config[¹cron_minute¹],¹hour¹=>$config[¹cron_hour¹]);
$crondb[] = $rt;
}
foreach ($crondb AS $key => $cron_val){
//设置了允许分钟段
if (!empty($config[¹cron_minute¹])){
$m = explode(¹ ¹, $config[¹cron_minute¹]);
$m_now = intval(local_date(¹i¹,$nowtime[¹timestamp¹]));
if (!in_array($m_now, $m)) {//不包含此分钟的跳出
continue;
}
}
/*执行任务*/
/*********此处是你写的任务***********************/
$next_time = get_next_time($cron_val[¹cron¹]);
$DB->query("UPDATE `maxrec` SET `deltemptime`={$next_time}");
}
exit;
}
?>
PHP自动执行任务代码自动生成静态页面
1.在某个固定的时间执行的PHP代码:
//计划执行时间
if($job=="cron"){
check_method();
//查询数据库的下一个时间是否小于现在的时间
if($maxrecord["deltemptime"]<$nowtime["timestamp"]){
$crondb = array();
//day为0为每日 week周 minute时间断 hour什么时侯开始
$rt["cron"] = array("day"=>"0","week"=>$config["cron_week"],"m"=>$config["cron_minute"],"hour"=>$config["cron_hour"]);
$crondb[] = $rt;
}
foreach ($crondb AS $key => $cron_val){
//设置了允许分钟段
if (!empty($config["cron_minute"])){
$m = explode(" ", $config["cron_minute"]);
$m_now = intval(local_date("i",$nowtime["timestamp"]));
if (!in_array($m_now, $m)) {//不包含此分钟的跳出
continue;
}
}
/*执行任务*/
/*********此处是你写的任务***********************/
$next_time = get_next_time($cron_val["cron"]);
$DB->query("UPDATE `maxrec` SET `deltemptime`={$next_time}");
}
exit;
}
>
2.隔时生成首页的PHP代码:
set_time_limit(0);
$baseCmsUrl = "http://www.kz27.com";//你网站的根网址,结束不要加 /
$dmPageName = "index.php";//动态主页的名称
$stPageName = "index.html";//生成静态主页的名称
$mkTime = 3600;//你希望多长时间更新一次,单位是秒
//下面是执行的代码
$tureStFile = dirname(__FILE__)."/".$stPageName;
$ftime = @filemtime($tureStFile);
if(!file_exists($tureStFile) || ($ftime < time()-$mkTime))
{
$body = file_get_contents($baseCmsUrl."/".$dmPageName);
$fp = fopen($tureStFile, "w");
fwrite($fp, $body);
fclose($fp);
}
>
将上面代码保存为task.php
在经常访问的页面调用:
3.PHP自动执行任务,关掉页面或浏览器也会自动定时执行:
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*5; // 每隔5分钟运行
do{
$fp = fopen("test.txt","a");
fwrite($fp,"test");
fclose($fp);
sleep($interval); // 按设置的时间等待5分钟循环执行
}while(true);
>
首先运行该程序,然后关闭该页面,程序仍然运行中,test便会每隔30秒的写入到text3.txt文件。
以上几个PHP自动执行任务的代码,好好掌握将会对PHP程序员们在网站建设过程中有所帮助,如生成HTML静态文件等。
在网站建设过程中,如果想让您的网站有更好的性能,更人性化的功能,那就得学会更多的代码程序技巧。如果您是PHP程序员,学习Javascript、Ajax、DIV+CSS、这些都是很有必要的。因为有些功能PHP可能不好去实现,但是要是使用Javascript、Ajax、DIV+CSS可能就会方便很多多了。
FLASH CS3 无法将动作应用于当前所选内容
主要想说说AS3与AS2的不同之处,没有什么逻辑性,想到什么就写点什么,因此,它不适合AS高手们阅读。本文将力求用最直白的语言,尽量不用那些艰涩难懂的名词和术语。
一、在什么地方写代码
为了更好地理解,我们还是用例子来说明。现在,就让我们一起来回顾一下,在AS2中我们都会把代码写在什么地方。我们在AS2中建一新文档,新建一个影片剪辑元件取名为bt,元件很简单,随便画一个方块就行,你说我偏要画一个园,那当然随你高兴罗,我没意见。然后,在场景中,用文字工具建一文本框,设为动态文本框,实例名称命名为:text1,将元件bt从库中拖到舞台上,实例名称命名为:bt_mc.现在写代码,想一想,代码写在什么地方,我们来做下面三个测试:
测试一:在帧动作中,直接写代码,点中第一层,第一帧,然后打开动作面板,在上面写到:
text1.text = "代码执行了“;
测试影片,OK,我们看到了”代码执行了“这几个字。
测试二:还在帧动作中写代码,将代码改为:
bt_mc.onPress = function() {
text1.text = "代码执行了“;
}
测试影片,当我们点击,元件bt_mc时,又看到了“代码执行了”几个字。
测试三:好象还可以把代码写到元件上,清除帧动作中的代码,点中bt_mc,打开动作面板,写下如下代码:
on(press){
_root.text1.text = "代码执行了“;
}
测试影片,点击bt_mc又看到了“代码执行了”几个字。
它怎么老是执行了呢,真是的。
下面我们在AS3中,作相同的测试:
测试一、在测试影片时,我们还是看到了那几个字,它都又执行了。
那AS3和AS2不是一样的?你还写个啥子劲?是哈,整了半天AS3和AS2整成一样的了。在“不到黄河心不死”的精神鼓舞下,我们还是把剩下的两个测试做完。
测试二、在测试影片时,哈哈,出错了,为我们出错喝彩吧(有病!),出错了,说明AS3与AS2还是不一样,那么本文就还可以写下去了。
测试三、当我们点中bt_mc,然后打开动作面板时,我们看到的是:
“无法将动作应用于当前所选内容”
真是过分,它连测试的机会都不给你。
好了,测试做完了,所谓实践出真知,通过测试,我们可以得出如下结论:
在AS2中,我们可以把代码写在帧动作中,也可以写在影片剪辑、按钮等元件上。
在AS3中,我们只能把代码写在帧动作中。(当然也可以写在.as等外部文件中,然后将它导入进来)。
二、AS3中的事件侦听
看到这里,聪明的你一定会说,在AS3中做上面的测试二时,代码是写在帧动作中的啊,为什么会出错呢?是啊,正因为有你的聪明,才使本文可以继续写下去啊。
在AS2中我们在让程序响应一个事件,比如鼠标单击,我们可以在帧动作中这样写:
事件对象.onPress = function() { 语句}
在AS3中,就不能这样写了,所以上面的测试二就出错了。
在AS3中,你必须先声明一个函数,其中包含你要执行的语句,然后用事件对象来侦听事件并调用这个函数,这将用到事件侦听语句:addEventListener
无论何时编写事件侦听器代码,该代码都会采用以下基本结构(以粗体显示的元素是占位符,您将针对具体情况对其进行填写):
function eventResponse(eventObject:EventType):void
(函数名称) (事件类型)
{
// 此处是为响应事件而执行的动作。
}
eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse);
(事件对象) (事件类型.名称 函数名称)
我想还是用测试二,来说明好理解一些:
在AS3中,将测试二中帧动作代码改为:
function test(event:MouseEvent):void //先声明一个函数test,其中包含了要执行的代码。
{
text1.text = "代码执行了";
}
bt_mc.addEventListener(MouseEvent.CLICK,test) //然后,用bt_mc元件来侦听事件,并调用test
测试影片,哈哈,代码它终于执行了。
上述代码中的事件类型是:鼠标事件(MouseEvent),事件名称是:单击(CLICK)。
你又要说话了,“这不是更麻烦吗?”,是有点麻烦哈,不过据说是更规范,更利于代码维护,不过不管你愿不愿意,你要用AS3你就得这么写。
三、添加显示对象
这一节,来说说显示对象。这个简单,你在舞台上能看到的东西就叫显示对象。你说显示对象是咋个到舞台上去的呢?你傻哦,当然是放上去的啰。那它是咋个放上去的呢?当然是用鼠标放上去麻。那只有用鼠标才能放上去吗?那不一定,我还以用attachMovie从库里头加载一个,我也可以用duplicateMovieClip复制一个,高兴了,我还可以用代码画一个,我还可以用loadMovie导入一个外部文件。你耐我何?真的吗?你敢不敢试一下吗?试就试,谁怕谁?
先试attachMovie:在AS3中在帧动作中写如下代码:
attachMovie ("bt","bt1",1)
测试影片,出错了。我们知道,这在AS2中是不会出错的,而且会将库中的“bt"元件,加载一个到舞台上。
还在那写文章,要加载库里的元件,必须要在元件的链接属性中为元件指定标识符,这一步你都不晓得?是哈,咋把这一步给忘了,赶紧去设置,在库中,bt原件上单击右键,点链接,选中“ActionSpript导出“,再看”标示符“那一栏,不能用!你能干,你来设麻。
其实,在AS3中根本就没有attachMovie这一说。
现在试一下:duplicateMovieClip:将代码改为:
duplicateMovieClip ("bt_mc","bt1",1)
bt1._x = 300;
测试影片,又出错了。同样的,AS3中也没有duplicateMovieClip这一说。
画一个?画麻:将代码改为:
| 1. createEmptyMovieClip("bt1",0); 2. with (bt1) { 3. beginFill(0xFF0000); 4. moveTo(100,0); 5. lineTo(200,100); 6. lineTo(0,100); 7. lineTo(100,0) 8. endFill(); 9. } |
测试影片,还是出错了。而这几句代码在AS2中会画出一个红色的三角形。
在AS3中,加载一个显示对象,必须用new关键字来构造,要在舞台上看到它,还必须用addChild()将它加到显示列表中才行。
还是来做个实例吧,我们将库中的bt元件,加载到舞台上:
首先我们在库中,在bt元件上,点右键-链接,选中,“为ActionScript导出“,这时”类“和”基类“两栏均变为可用。这样,就在flash.display.MovieClip类中创建了一个”bt"类。点击确定,在接下弹出的对话框中,再点确定,就行了。
现在我们可以在代码中加载bt了
var bt1:bt = new(bt); //声明一个新的bt类的实例,并用new()来构造它
this.addChild(bt1); //将bt1载到舞台
bt1.x =200;
bt1.y=300; //设置bt1的x,y值,注意在AS3中,x和y前而没有下划线了。
测试影片,bt已加载到舞台上了。
下面我们在AS3中画一个,代码这样写:
var bt1:MovieClip = new(MovieClip); //声明一个新的mc类bt1,并用new来构造它
bt1.graphics.lineStyle(2, 0x990000, .75);//使用bt1的graphics属性设置线条粗细,颜色,透明度
| 1. bt1.graphics.beginFill(0x00FF00);//以下的代码是用graphics画三角形。 2. bt1.graphics.moveTo(100,200); 3. bt1.graphics.lineTo(200,100); 4. bt1.graphics.lineTo(0,100); 5. bt1.graphics.lineTo(100,200); 6. this.addChild(bt1); |
在AS3中,除了MovieClip类外,还可以用Shape、Sprite 类来绘图或加载显示对象,而且还要更节约系统资源一些。
加载外部显示对象,在AS3中,利用Loader类来加载外部对象;同样的也要先声明一个Loader类实例:
| 1. var loadpict:Loader = new(Loader); 2. var pictURLReq:URLRequest = new URLRequest(pictURL);//pictURL为外部文件的路径 3. loadpict.load(pictURLReq); 4. this.addChild(loadpict); |
JSP中的相对和绝对路径
//在Servlet与JSP中取得当前文件所在的相对路径与绝对路径
//JSP中
out.println("根目录所对应的绝对路径:" + request.getRequestURI() + "<br/>");
String strPathFile = application.getRealPath(request.getRequestURI());
out.println("文件的绝对路径:" + strPathFile+ "<br/>");
out.println(application.getRealPath(request.getRequestURI()));
String strDirPath = new File(application.getRealPath(request.getRequestURI())).getParent();
out.println("目录的绝对路径:" + strDirPath + "<br/>");
//Servlet中
//JSP中的application对象就是Servlet中的ServerContext,所以在Servlet中是如此获得
//import java.io.File;
System.out.println("根目录所对应的绝对路径:" + request.getServletPath() + "<br/>");
String strPathFile = request.getSession().getServletContext().getRealPath(request.getRequestURI());
System.out.println("文件的绝对路径:" + strPathFile + "<br/>");
String strDirPath = new File(request.getSession().getServletContext().getRealPath(request.getRequestURI())).getParent();
System.out.println("目录的绝对路径:" + strDirPath + "<br/>");
文件名不能包括以下字符:/:*?"<>|
获取Web项目的全路径
String strDirPath = getServletContext().getRealPath("/");
在JSP中获取当前文件,当前文件夹,当前web的绝对路径
当前WEB应用的物理路径:<%=application.getRealPath("/")%>
当前访问的JSP文件的物理路径:<%=application.getRealPath(request.getRequestURI())%>
当前访问jsp文件的所在目录的物理路径:
<%
String path=application.getRealPath(request.getRequestURI());
String dir=new java.io.File(path).getParent();
out.println("dir);
%>
jsp和Servlet中获取路径的各种方法
1.JSP中获得当前应用的相对路径和绝对路径:
根目录所对应的绝对路径:request.getRequestURI()
文件的绝对路径:application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :application.getRealPath("/");
取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent();
2.Servlet中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getServletPath();
文件的绝对路径:request.getSession().getServletContext().getRealPath
(request.getRequestURI());
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");
ServletContext对象获得几种方式:
Javax.servlet.http.HttpSession.getServletContext()
Javax.servlet.jsp.PageContext.getServletContext()
Javax.servlet.ServletConfig.getServletContext()
jsp的cookies
用习惯了php的方式,jsp的很是不适应。
记一个小小的练习上来,别忘了!
XML/HTML代码
<%@page contentType="text/html" pageEncoding="GBK"%>
<%@page import="javax.servlet.http.Cookie,java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>JSP Page</title>
</head>
<body>
<%
//String CookiesName="username";
//Cookie cookie_username=new Cookie("username",CookiesName);
//response.addCookie(cookie_username);
int click=0;
Cookie[] cookies=request.getCookies();
Cookie cookie_reponse=null;
List list=Arrays.asList(cookies);
Iterator it=list.iterator();
while(it.hasNext()){
Cookie temp=(Cookie)it.next();
if(temp.getName().equals("clicktimes")){
click=Integer.parseInt(temp.getValue());
cookie_reponse=temp;
break;
}
}
//取得了click的值
//输出
out.println("第 "+click+" 次刷新");
//更新
clickclick=click+1;
if(cookie_reponse==null){
//空的
cookie_reponse=new Cookie("clicktimes", String.valueOf(click));
}else{
cookie_reponse.setValue(String.valueOf(click));
}
response.addCookie(cookie_reponse);
response.setContentType("text/html");
response.flushBuffer();
%>
</body>
</html>
- 默认分类(20)
- J2EE(25)
- Java(56)
- PHP(55)
- SEO(10)
- 网页设计(20)
- 网站建设(37)
- 数据库(7)
- JavaScript(17)
- JQuery(6)
- MySQL(20)
- SQL Server(6)
- Access(1)
- Oracle(6)
- office(6)
- Dreamweaver(4)
- Photoshop(12)
- Flash(9)
- Fireworks(13)
- CSS(14)
- HTML(4)
- .NET(7)
- ASP(2)
- DB2(1)
- Ajax(2)
- Linux(12)
- Struts(7)
- Hibernate(8)
- Spring(2)
- Jsp(22)
- Asp(8)
- C#(3)
- C++(1)
- 网络安全(5)
- 软件工程(7)
- XML(1)
- English(2)
- 计算机等级考试(2)
- 计算机病毒(4)
- 个人日志(76)
- 互联网(15)
- ActionScript(10)
- Android(3)
- 数据结构与算法(1)
- 游戏策略(3)
- 美文翻译(2)
- 编程开发(19)
- 计算机应用(4)
- 计算机(10)
- Unity3d(6)
- 其他(1)
- egret(1)