海水正蓝

面朝大海,春暖花开
posts - 145, comments - 29, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

     

Servlet和Filter的url匹配以及url-pattern详解


     Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天 遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西, 放出来供大家参考,以免遇到问题又要浪费时间。

一 servlet容器对url的匹配过


当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:<o:p></o:p>

1.     精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。<o:p></o:p>

2.     最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。<o:p></o:p>

3.     扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action<o:p></o:p>

4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

      对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一 个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。


二 url-pattern详解

  • web.xml文件中,以下语法用于定义映射:
  •  以”/’开头和以”/*”结尾的是用来做路径映射的。
  •  以前缀”*.”开头的是用来做扩展映射的。
  • “/” 是用来定义default servlet映射的。
  • 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断

出自:
http://foxty.iteye.com/blog/39332


posted @ 2013-06-06 15:16 小胡子 阅读(304) | 评论 (0)编辑 收藏

oracle监听不能启动的问题及处理过程!

oracle环境如下:

SQL> select * from V$version

2 ;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

出错过程回忆:在此之前用windows优化大师对系统注册表进行了修复!

Q:链接oracle时报错:ORA-12541: TNS: 无监听程序

A:

1〉查看监听有没有启动:

一:运行lsnrctl

C:\Documents and Settings\Admin>lsnrctl

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 20-4月 -2007 09:

1:43

Copyright (c) 1991, 2005, Oracle. All rights reserved.

欢迎来到LSNRCTL, 请键入"help"以获得信息。

二:查看stauts

LSNRCTL> status

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

TNS-12541: TNS: 无监听程序

TNS-12560: TNS: 协议适配器错误

TNS-00511: 无监听程序

32-bit Windows Error: 2: No such file or directory

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zxt)(PORT=1521)))

TNS-12541: TNS: 无监听程序

TNS-12560: TNS: 协议适配器错误

TNS-00511: 无监听程序

32-bit Windows Error: 61: Unknown error

三:发现监听没有启动,现在启动监听

LSNRCTL> start

启动tnslsnr: 请稍候...

Failed to start service, error 3.

TNS-12560: TNS: 协议适配器错误

TNS-00530: 协议适配器错误

2〉发现监听启动不起来,估计是注册表有点问题,登录注册表

C:\Documents and Settings\Admin>regedit

进入注册表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraDb10g_home1TNSListener

发现ImagePath关键值没有了,增加可扩充字符串值,取名为ImagePathImagePath,编辑字符串的数值数据为:G:\oracle\product\10.2.0\db_2\BIN\TNSLSNR(对应oracle的TNSLSNR的位置) ,退出注册表。

3〉启动监听

LSNRCTL> start

启动tnslsnr: 请稍候...

TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production

系统参数文件为d:\oracle\product\10.2.0\db_1\network\admin\listener.ora

写入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息

监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

LISTENER 的 STATUS

------------------------

别名 LISTENER

版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ

ction

启动日期 20-4月 -2007 09:41:29

正常运行时间 0 天 0 小时 0 分 3 秒

跟踪级别 off

安全性 ON: Local OS Authentication

SNMP OFF

监听程序参数文件 d:\oracle\product\10.2.0\db_1\network\admin\listener.o

ra

监听程序日志文件 d:\oracle\product\10.2.0\db_1\network\log\listener.log

监听端点概要...

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

服务摘要..

服务 "PLSExtProc" 包含 1 个例程。

例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

命令执行成功

4>监听启动成功后尝试登录

C:\Documents and Settings\Admin>sqlplus zxt@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 20 09:42:33 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

输入口令:

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

登录成功!

总结:估计是windows优化大师或者别的工具在修复注册表时候删掉了ImagePath字段,补上后就可以了!

补充:登录sqlplus时报

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务错误!

处理办法:

1〉oracle_home\NETWORK\ADMIN\tnsnames.ora中修改(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

为(ADDRESS = (PROTOCOL = TCP)(HOST = 本地计算机名)(PORT = 1521)),保存即可。

2〉有的人介绍oracle_home\NETWORK\ADMIN\sqlnet.ora中修改SQLNET.AUTHENTICATION_SERVICES = (NTS)为

SQLNET.AUTHENTICATION_SERVICES = (NONE)

这2种方法,第一个最佳!

posted @ 2013-05-30 14:03 小胡子 阅读(607) | 评论 (0)编辑 收藏

Ext GridPanel实现复选框选择框:

1 var selectModel = new Ext.grid.CheckboxSelectionModel({
2     singleSelect : false
3 });
4 

 但是这样每一行都会有复选框,如果需求为:某行数据的某个列满足什么条件我才有复选框选项就不太好实现了,

这样就需要重写Ext.grid.CheckboxSelectionModel的渲染,行点击涵数来实现.

 1 var selectModel = new Ext.grid.CheckboxSelectionModel({
 2       singleSelect : false,
 3       renderer : function(v, p, record){
 4           if (record.data['结果状态'] == '0'){
 5                return '';
 6           }
 7           return '<div class="x-grid3-row-checker">&#160;</div>';
 8       },
 9       onHdMouseDown : function(e, t) {
10           if (t.className == 'x-grid3-hd-checker') {
11                e.stopEvent();
12                var hd = Ext.fly(t.parentNode);
13                var isChecked = hd.hasClass('x-grid3-hd-checker-on');
14                if (isChecked){
15                   hd.removeClass('x-grid3-hd-checker-on');
16                   this.clearSelections();
17               }else {
18                   hd.addClass('x-grid3-hd-checker-on');
19                   if (this.locked){
20                       return;
21                   }
22                   this.selections.clear();
23                   for (var i = 0, len = this.grid.store.getCount(); i < len; i++ ){
24                       if (this.grid.store.getAt(i).data["结果状态"!= '0'){
25                            this.selectRow(i, true);
26                       }
27                  }
28               }
29          }
30       },
31       handleMouseDown : function(g, rowIndex, e){
32             if (e.button !== 0 || this.isLocked()) {
33                    return;
34             }
35             var view = this.grid.getView();
36             if (e.shiftKey && !this.singleSelect && this.last != false ) {
37                  var last = this.last;
38                  this.selectRange(last, rowIndex, e.ctrlKey);
39                  this.last = last;
40                  view.focusRow(rowIndex);
41             }else{
42                  var isSelected = this.isSelected(rowIndex);
43                  if (e.ctrlKey && isSelected) {
44                       this.deselectRow(rowIndex);
45                  }else if(!isSelected || this.getCount() > 1){
46                       if(this.grid.store.getAt(rowIndex).data["结果状态"!= '0'){
47                           this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
48                       }
49                       view.focusRow(rowIndex);
50                  }
51             }
52       }
53 });
原文:
http://fordream.iteye.com/blog/1179252



posted @ 2013-05-06 15:34 小胡子 阅读(331) | 评论 (0)编辑 收藏

     摘要: 在学习中Ext.grid.EditorGridPanel 的时候碰到一个知识点,如何用复选框来表示真假值,当然我们可以直接这样 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 {2    heade...  阅读全文

posted @ 2013-05-06 15:32 小胡子 阅读(247) | 评论 (0)编辑 收藏

Ext.grid.GridPanel可以设置stripeRows: true的属性来实现隔行换颜色的效果,如果你想自定义每行的颜色,那么你可以按照下边地方法来实现:
Ext.ux.GridView=Ext.extend(  
       Ext.grid.GridView,  
       {  
           getRowClass:
function(record,index)  
           {  
               
if(index%2==0)  
                   
return 'red';  
               
else  
                  
return 'green';  
          }  
       }  
   ) 

使用自定义的view

var grid = new Ext.grid.GridPanel({
        
//other code
    store: store,
    view:
new Ext.ux.GridView(),
        
//other code
});
样式定义:

.red {
     background
-color:#FF0000;
}
.green {
     background
-color:#00FF00;
}



通过firebug可以看到,给每行的div添加了自定义的样式
原文出自:
http://love4j.iteye.com/blog/516007


posted @ 2013-05-04 21:33 小胡子 阅读(699) | 评论 (0)编辑 收藏

     摘要: 先上图 grid分页:      把grid和page工具绑定在一起     // create the Data Store     var store = new Ext.data.Store...  阅读全文

posted @ 2013-04-29 11:56 小胡子 阅读(332) | 评论 (0)编辑 收藏

http://yourgame.iteye.com/blog/252853

posted @ 2013-04-29 11:53 小胡子 阅读(299) | 评论 (0)编辑 收藏

Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法:

代码如下:


var gfxmComb  = new Ext.form.ComboBox({
        id : 'gfxmComb',
        store : gfxmStore,
        typeAhead : 
true,
        mode : 'local',
        editable : 
true,
        displayField :'xmMc',
        valueField :'xmBm',
        triggerAction : 'all',
        selectOnFocus : 
true,
        listeners : {
            'beforequery':
function(e){
                 
                
var combo = e.combo;  
                
if(!e.forceAll){  
                    
var input = e.query;  
                    
// 检索的正则
                    var regExp = new RegExp(".*" + input + ".*");
                    
// 执行检索
                    combo.store.filterBy(function(record,id){  
                        
// 得到每个record的项目名称值
                        var text = record.get(combo.displayField);  
                        
return regExp.test(text); 
                    });
                    combo.expand();  
                    
return false;
                }
            }
        }
    });

原文出自:http://weibaojun.iteye.com/blog/1098731

posted @ 2013-04-29 11:33 小胡子 阅读(415) | 评论 (0)编辑 收藏

Javascript是一门非常灵活的语言,我们可以随心所欲的书写各种风格的代码,不同风格的代码也必然也会导致执行效率的差异,开发过程中零零散散地接触到许多提高代码性能的方法,整理一下平时比较常见并且容易规避的问题

Javascript自身执行效率

Javascript中的作用域链、闭包、原型继承、eval等特性,在提供各种神奇功能的同时也带来了各种效率问题,用之不慎就会导致执行效率低下。

1、全局导入

我们在编码过程中多多少少会使用到一些全局变量(window,document,自定义全局变量等等),了解javascript作用域链的人都 知道,在局部作用域中访问全局变量需要一层一层遍历整个作用域链直至顶级作用域,而局部变量的访问效率则会更快更高,因此在局部作用域中高频率使用一些全 局对象时可以将其导入到局部作用域中,例如:


 1 //1、作为参数传入模块
 2 (function(window,$){
 
3     var xxx = window.xxx;
 
4     $("#xxx1").xxx();
 
5     $("#xxx2").xxx();
 
6 })(window,jQuery);
 
7 
 
8 //2、暂存到局部变量
 9 function(){
10     var doc = document;
11     var global = window.global;
12 }

2、eval以及类eval问题

我们都知道eval可以将一段字符串当做js代码来执行处理,据说使用eval执行的代码比不使用eval的代码慢100倍以上(具体效率我没有测试,有兴趣同学可以测试一下)

JavaScript 代码在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用 var 申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是 undefined,并将那些以 function 定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。但是,如果你使用了“eval”,则“eval”中的代码(实际上为字符串)无法预先识 别其上下文,无法被提前解析和优化,即无法进行预编译的操作。所以,其性能也会大幅度降低

其实现在大家一般都很少会用eval了,这里我想说的是两个类eval的场景(new Function{},setTimeout,setInterver)


setTimtout("alert(1)",1000);

setInterver(
"alert(1)",1000);

(
new Function("alert(1)"))();

上述几种类型代码执行效率都会比较低,因此建议直接传入匿名方法、或者方法的引用给setTimeout方法

3、闭包结束后释放掉不再被引用的变量


var f = (function(){
    
var a = {name:"var3"};
    
var b = ["var1","var2"];
    
var c = document.getElementByTagName("li");
    
//****其它变量
    //***一些运算
    var res = function(){
        alert(a.name);
    }
    
return res;
})()

上述代码中变量f的返回值是由一个立即执行函数构成的闭包中返回的方法res,该变量保留了对于这个闭包中所有变量(a,b,c等)的引用,因此这两个变 量会一直驻留在内存空间中,尤其是对于dom元素的引用对内存的消耗会很大,而我们在res中只使用到了a变量的值,因此,在闭包返回前我们可以将其它变 量释放

var f = (function(){
    
var a = {name:"var3"};
    
var b = ["var1","var2"];
    
var c = document.getElementByTagName("li");
    
//****其它变量
    //***一些运算
    //闭包返回前释放掉不再使用的变量
    b = c = null;
    
var res = function(){
        alert(a.name);
        }
    
return res;
})()

在web开发过程中,前端执行效率的瓶颈往往都是在dom操作上面,dom操作是一件很耗性能的事情,如何才能在dom操作过程中尽量节约性能呢?

1、减少reflow

什么是reflow?

当 DOM 元素的属性发生变化 (如 color) 时, 浏览器会通知 render 重新描绘相应的元素, 此过程称为 repaint。

如果该次变化涉及元素布局 (如 width), 浏览器则抛弃原有属性, 重新计算并把结果传递给 render 以重新描绘页面元素, 此过程称为 reflow。

减少reflow的方法

  1. 先将元素从document中删除,完成修改后再把元素放回原来的位置(当对某元素及其子元素进行大量reflow操作时,1,2两种方法效果才会比较明显)

  2. 将元素的display设置为”none”,完成修改后再把display修改为原来的值

  3. 修改多个样式属性时定义class类代替多次修改style属性(for certain同学推荐)
  4. 大量添加元素到页面时使用documentFragment

例如


for(var i=0;i<100:i++){
    
var child = docuemnt.createElement("li");
    child.innerHtml 
= "child";
    document.getElementById(
"parent").appendChild(child);
}

上述代码会多次操作dom,效率比较低,可以改为下面的形式 创建documentFragment,将所有元素加入到docuemntFragment不会改变dom结构,最后将其添加到页面,只进行了一次reflow

var frag = document.createDocumentFragment();
for(var i=0;i<100:i++){
        
var child = docuemnt.createElement("li");
        child.innerHtml 
= "child";
    frag.appendChild(child);
}
document.getElementById(
"parent").appendChild(frag);

2、暂存dom状态信息

当代码中需要多次访问元素的状态信息,在状态不变的情况下我们可以将其暂存到变量中,这样可以避免多次访问dom带来内存的开销,典型的例子就是:


var lis = document.getElementByTagName("li");
for(var i=1;i<lis.length;i++){
    
//***
}
上述方式会在每一次循环都去访问dom元素,我们可以简单将代码优化如下
var lis = document.getElementByTagName("li");
for(var i=1,j=lis.length ;i<j;i++){
    
//***
}

3、缩小选择器的查找范围

查找dom元素时尽量避免大面积遍历页面元素,尽量使用精准选择器,或者指定上下文以缩小查找范围,以jquery为例

  • 少用模糊匹配的选择器:例如$("[name*='_fix']"),多用诸如id以及逐步缩小范围的复合选择器$("li.active")
  • 指定上下文:例如$("#parent .class")$(".class",$el)

4、使用事件委托

使用场景:一个有大量记录的列表,每条记录都需要绑定点击事件,在鼠标点击后实现某些功能,我们通常的做法是给每条记录都绑定监听事件,这种做法会导致页面会有大量的事件监听器,效率比较低下。

基本原理:我们都知道dom规范中事件是会冒泡的,也就是说在不主动阻止事件冒泡的情况下任何一个元素的事件都 会按照dom树的结构逐级冒泡至顶端。而event对象中也提供了event.target(IE下是srcElement)指向事件源,因此我们即使在 父级元素上监听该事件也可以找到触发该事件的最原始的元素,这就是委托的基本原理。废话不多说,上示例


$("ul li").bind("click",function(){
    alert($(
this).attr("data"));
})

上述写法其实是给所有的li元素都绑定了click事件来监听鼠标点击每一个元素的事件,这样页面上会有大量的事件监听器。

根据上面介绍的监听事件的原理我们来改写一下


$("ul").bind("click",function(e){
    
if(e.target.nodeName.toLowerCase() ==="li"){
        alert($(e.target).attr(
"data"));
    }
})

这样一来,我们就可以只添加一个事件监听器去捕获所有li上触发的事件,并做出相应的操作。

当然,我们不必每次都做事件源的判断工作,可以将其抽象一下交给工具类来完成。jquery中的delegate()方法就实现了该功能

语法是这样的$(selector).delegate(childSelector,event,data,function),例如:


$("div").delegate("button","click",function(){
  $(
"p").slideToggle();
});
参数说明(引自w3school)
参数描述
childSelector 必需。规定要附加事件处理程序的一个或多个子元素。
event

必需。规定附加到元素的一个或多个事件。由空格分隔多个事件值。必须是有效的事件。

data 可选。规定传递到函数的额外数据。
function 必需。规定当事件发生时运行的函数。

 

Tips:事件委托还有一个好处就是,即使在事件绑定之后动态添加的元素上触发的事件同样可以监听到哦,这样就不用在每次动态加入元素到页面后都为其绑定事件了

原文出自:
http://www.cnblogs.com/gewei/archive/2013/03/29/2988180.html

posted @ 2013-04-04 23:20 小胡子 阅读(255) | 评论 (0)编辑 收藏

     摘要: 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这 两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责, 所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存。因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有 限的内存的程序。 1...  阅读全文

posted @ 2013-03-30 22:39 小胡子 阅读(209) | 评论 (0)编辑 收藏

仅列出标题
共15页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last