posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1. tomcat的manager中可以reload一个servlet,但是貌似这样容易导致死机,还是每次需要重载的时候重启tomcat比较安全。

posted @ 2007-05-13 20:00 ZelluX 阅读(139) | 评论 (0)编辑 收藏

1. Filter 简介
这方面的内容以前看的几本书里都找不到,想到了Sun J2EE的Tutorial,果然里面有比较详细的解释。
Filter是一个传输请求或者响应的报头和内容的对象,通常的作用是:
a) 根据不同情况处理请求。
b) 阻止请求-响应的过远传送。(Block the request-and-response pair from passing any further.)
c) 通过自定义新的请求版本,修改请求报头和数据。
d) 通过自定义新的响应版本,修改响应报头和数据。
e) 和外部资源交互。

2. Filter 编程
filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定义。
其中最重要的方法是doFilter。它可以用来:
a) 检查请求报头。
b) 自定义请求对象。
c) 自定义响应对象。
d) 调用过滤链(filter chain)中的下一个实体(entity)。如果当前过滤器已经是链中最后一个过滤器了,下一个实体就是链尾的资源;否则它就是在WAR中设置的下一个过滤器。当然也可以在此时通过不调用下一个实体来中断请求、
e) 在响应报头调用下一个过滤器后检查。
f) 抛出反应处理错误的异常。

3. 一个 Duke's Bookstore 的例子
HitCounterFilter在servlet被访问时计数。
public final class HitCounterFilter implements Filter {
  private FilterConfig filterConfig = null;

  public void init(FilterConfig filterConfig)
    throws ServletException {
    this.filterConfig = filterConfig;
  }
  public void destroy() {
    this.filterConfig = null;
  }
  public void doFilter(ServletRequest request,
    ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    if (filterConfig == null)
      return;
    StringWriter sw = new StringWriter();
    PrintWriter writer = new PrintWriter(sw);
    Counter counter = (Counter)filterConfig.
      getServletContext().
      getAttribute("hitCounter");
    writer.println();
    writer.println("===============");
    writer.println("The number of hits is: " +
      counter.incCounter());
    writer.println("===============");
    // Log the resulting string
    writer.flush();
    System.out.println(sw.getBuffer().toString());
    ...
    chain.doFilter(request, wrapper);
    ...
  }
}

4. 设置过滤器映射
部署描述符文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素:
icon 这是一个可选的元素,它声明IDE能够使用的一个图象文件。
filter-name 这是一个必需的元素,它给过滤器分配一个选定的名字。
display-name 这是一个可选的元素,它给出IDE使用的短名称。
description 这也是一个可选的元素,它给出IDE的信息,提供文本文档。
filter-class 这是一个必需的元素,它指定过滤器实现类的完全限定名。
init-param 这是一个可选的元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。

filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素::
l filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。
l url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式,可重复整个filter-mapping元素。
l servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素。

 

posted @ 2007-05-13 17:12 ZelluX 阅读(528) | 评论 (0)编辑 收藏

1. 使用DisplayTag时一直报错,检查了出错信息后发现是common-lang的某个类出错。
估计是MyEclipse自动添加Struts相关库文件时使用的commons包比较早的缘故,于是把那些包都替换成了最新的版本,问题解决。

2. HQL查询中的属性名应当是beans的属性名
数据库的Book表中有inner_id这一字段
对应于Hibernate逆向工程生成的Book类的innerId属性
查询id为bookId的书时应该使用
session.createQuery("from Book b where b.innerId='" + bookId + "'")
       .list()
       .get(0);

3. DisplayTag分页显示功能中,使用的List变量必须是Session及以上级别的。

4. iframe的使用,设置iframe的name属性,然后就能通过<a target"iframename" href="#">控制iframe的浏览对象了。

posted @ 2007-05-12 21:57 ZelluX 阅读(167) | 评论 (0)编辑 收藏

感觉比去年那个简单点。不少地方都简化了,比如图书分类,使用了enum类型,而不像去年的需要多表查询才能获得分类。
使用了Struts + Hibernate,准备先把基本功能做出来,然后再加上Ajax。
1. html:select 的列表框选择
在csdn上看到的两种方法:
1)
<html:select   property="personnelId">  
      <html:option   value="">请选择</html:option>  
      <html:options  collection="personList"   property="personId"   labelProperty="personName"/>  
  </html:select>  
  html:options自动帮你迭代personList中的内容,前提是personList是Collection类型的,而且封装的是一个包含personId,personName属性的对象  
  property显示的是value,labelProperty显示的是页面看到的内容


2)
<html:select>  
  <html:option   value="">请选择***</html:option>  
  <logic:notEmpty>  
    <logic:iterate>  
      <option   value='11'>11</option>  
    </logic:iterate>  
  </logic:notEmpty>  
</html:select>

2. jsp页面中用户权限判断的问题
BBS上问了下,一般是采用Filter类的。具体方法明天再看吧。

posted @ 2007-05-11 22:32 ZelluX 阅读(229) | 评论 (0)编辑 收藏

1. Dictionary 类型
1) 类似于Java中的Hashtable类,Dictionary定义了键和值的一对一的关系。
2) 定义:{key:value}
d = {"server":"Tomcat", "database":"MySQL"}
3) key对大小写敏感。
4) 可混用各种数据类型。
5) 删除元素 del d["server"]
6) 清除所有元素 d.clear()

2. List 类型
1) 定义:
li = ["a", "b", 1]
2) 下标从0开始。
3) 负数索引从list的尾部向前计数来存取元素,即
li[-n] == li[len(li) - n]
4) 分片(slice)
>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[1:3]   //从第2个元素到第3个元素
['b', 'mpilgrim']
>>> li[1:-1]  //从第2个元素到倒数第2个元素
['b', 'mpilgrim', 'z']
>>> li[:3]
['a', 'b', 'mpilgrim']
>>> li[3:] 
['z', 'example']
>>> li[:]
['a', 'b', 'mpilgrim', 'z', 'example']

5) 增加元素
a) append 末尾追加单个元素
b) insert 将单个元素插入某个位置
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']
>>> li.insert(2, "new")           
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']
c) extend 合并另一个List

6) 搜索
a) index 查找一个值的首次出现并返回索引值,如果没有找到则引发异常,与Java不同
b) in 操作符测试一个值是否在list内

7) 删除元素
a) remove 删除某个元素,如不存在则引发异常
b) pop 弹出栈顶元素,即删除最后一个值并返回该值

8) List运算符 真方便啊 -,=
>>> li = ['a', 'b', 'mpilgrim']
>>> li = li + ['example', 'new']
>>> li
['a', 'b', 'mpilgrim', 'example', 'new']
>>> li += ['two']               
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two']
>>> li = [1, 2] * 3             
>>> li
[1, 2, 1, 2, 1, 2]

posted @ 2007-05-11 16:22 ZelluX 阅读(238) | 评论 (0)编辑 收藏

1. Javascript中的继承要自己模拟实现。一些常用方法:
a) Object masquerading
function ClassA(sColor) {
    
this.color = sColor;
    
this.sayColor = function () {
        alert(
this.color);
    }
;
}

function ClassB(sColor, sName) {
    
this.newMethod = ClassA;
    
this.newMethod(sColor);
    
delete this.newMethod;
    
this.name = sName;
    
this.sayName = function () {
        alert(
this.name);
    }
;
}
通过调用ClassA的生成方法,ClassB继承了ClassA的属性和方法,同时newMethod所占用的空间也被释放。

另外,Object masquerading还支持多重继承,方法类似。

b) 使用call()方法
感觉这个方法类似于Java反射机制中的invoke方法,第一个参数是个调用的对象主体,后面是被调用方法的参数。
function ClassB(sColor, sName) {
    ClassA.call(
this, sColor);
    
this.name = sName;
    
this.sayName = function () {
        alert(
this.name);
    }
;
}
ClassB通过调用ClassA的生成方法完成了初始化。

c) 使用apply()方法
和call()方法很相似,不同的是apply方法只有两个参数,一个是调用对象主体,一个是参数数组。
因此只要被上例的call语句改成ClassA.apply(this, new Array(sColor));即可

d) prototype链
function ClassA() {
}

ClassA.prototype.color 
= “red”;
ClassA.prototype.sayColor 
= function () {
    alert(
this.color);
}
;
function ClassB() {
}

ClassB.prototype 
= new ClassA();
注意被继承的类ClassA构造方法里没有任何参数。
ClassB新的属性要在prototype被赋值后再添加,否则就会被删除。
这种方法的好处在于,使用instanceof判断子类对象和父类的关系的结果是true,和面向对象的思想一致。

e) 混合
Object masquerading的缺点在于性能不好,而prototype链又只能用无参构造器。因此要把两者结合起来。
function ClassA(sColor) {
    
this.color = sColor;
}

ClassA.prototype.sayColor 
= function () {
    alert(
this.color);
}
;
function ClassB(sColor, sName) {
    ClassA.call(
this, sColor);
    
this.name = sName;
}

ClassB.prototype 
= new ClassA();
ClassB.prototype.sayName 
= function () {
    alert(
this.name);
}
;
要求ClassA在创建的时候也使用了prototype和constructor方法。

f) 动态创建的类的继承
function Triangle(iBase, iHeight) {
    Polygon.call(
this3);
    
this.base = iBase;
    
this.height = iHeight;
    
if (typeof Triangle._initialized ==     “undefined”) {
        Triangle.prototype.getArea 
= function () {
            
return 0.5 * this.base * this.height;
        }
;
        Triangle._initialized 
= true;
    }

}

Triangle.prototype 
= new Polygon();
注意prototype继承这一语句是在最后执行的,也不能被封装进构造器中。

2. zInherit库
简略的看了下,基本功能Prototype框架都提供。

3.xbObjects
同样是个库,略

posted @ 2007-05-05 18:57 ZelluX 阅读(280) | 评论 (0)编辑 收藏

看到Firebug升级到1.0.5了,就去官网看了下
更新内容没什么,不过发现一个不错的脚本插件Firebug lite,适用于其他浏览器。
http://www.getfirebug.com/releases/firebuglite1.0-b1.zip
http://www.blogjava.net/Files/zellux/firebug.rar
使用方法很简单,解压到要测试的网页目录下(包括目录)
在html中加入
<script language="javascript" type="text/javascript" src="/firebug/firebug.js"></script>
然后在html标签中声明
<html debug="true">
就可以在网页中使用Ctrl+Shift+F12打开Firebug的控制栏进行调试了。

posted @ 2007-05-05 12:26 ZelluX 阅读(1425) | 评论 (6)编辑 收藏

     摘要: 1. 面向对象语言的四个要素:封装、聚合(Aggregation)、继承、多态。ps. Aggragation - the capability to store one object inside of another object(貌似这本书并没有区分Object-based和Object-oriented)2. 创建对象基本和Java一样,但对于无参构造器,也可以使用类似Delphi的没有括...  阅读全文

posted @ 2007-05-04 23:06 ZelluX 阅读(438) | 评论 (0)编辑 收藏

越来越发现JavaScript其实是一门很强大、很精深的语言,要好好学习下。
以下例子都摘自于Professional JavaScript for Web Developers

1. JavaScript中函数不能重载。

2. 每个函数有一个对应的arguments[]数组,包含所有的参数,且数量不需固定。

function howManyArgs() {
    alert(arguments.length);
}

3. 函数也是一个对象,使用Function类创建函数的方法是:
var function_name = new Function(argument1, argument2,..,argumentN, function_body);
这里所有的参数都必须是字符串。
var sayHi = new Function("sName", Message""alert(\"Hello \" + sName + \", \" + sMessage + \”);”);
从这个角度看,不支持函数重载的原因也很简单。
doAdd = new Function("iNum""alert(iNum + 100)");
doAdd 
= new Function("iNum""alert(iNum + 10)");
doAdd(
10);
可以推出的几个结论:
a) 第二次函数声明使得doAdd指向了另一个对象,自然不可能实现重载。
b) 函数可以通过句柄很容易的复制。
c) 函数能作为参数传递给另一个函数。
d) func.toString()可以得到函数的具体内容。

4. 闭包 Closure
简单的定义就是使用了函数体之外的引用。
var sMessage = “Hello World!”;
function sayHelloWorld() {
    alert(sMessage);
}

sayHelloWorld();
var iBaseNum = 10;
function addNumbers(iNum1, iNum2) {
    
function doAddition() {
        
return iNum1 + iNum2 + iBaseNum;
    }

    
return doAddition();
}
例二中的内嵌方法doAddition()使用了外部方法的参数。

posted @ 2007-05-04 22:20 ZelluX 阅读(299) | 评论 (0)编辑 收藏

java.util.AbstractCollection
感谢BBS上的outerheaven解答了add(E o)方法的问题。在把add方法写成抛出异常不是为了防止子类向上转型时错误地调用AbstractCollection的这个方法,而是为了让不支持add方法的子类继承,比如EnumSet类,它的元素是在创建时就决定的,不支持add方法。

java.util.AbstractList
1) 包含了
private class Itr implements Iterator<E>
private class ListItr extends Itr implements ListIterator<E>
而ListIterator又是继承Iterator接口的。
分成两个类写是不是为了使代码清晰呢?

2) 使用了modCount变量检查并发操作时容易发生的问题。
Iterator中有一个expectedModCount变量,每次通过Iterator操作时,都会调用checkForComodification()方法,检查expectedModCount是否和AbstractList的modCount相等,如果不同则抛出ConcurrentModificationException。

3) subList方法和SubList类和视图view有关(是不是Observer模式的应用呢?),先不看了

4) equals方法中最后那个判断语句有点新颖(或者我土了)
public boolean equals(Object o) {
  
if (o == this)
    
return true;
  
if (!(o instanceof List))
    
return false;

  ListIterator
<E> e1 = listIterator();
  ListIterator e2 
= ((List) o).listIterator();
  
while(e1.hasNext() && e2.hasNext()) {
    E o1 
= e1.next();
    Object o2 
= e2.next();
    
if (!(o1==null ? o2==null : o1.equals(o2)))
      
return false;
    }

    
return !(e1.hasNext() || e2.hasNext());
  }

}

5) hashCode的生成:
hashCode(e1, e2, ..., en) = Sigma(hashCode(ei) * 32^i)
没有考虑溢出之类的情况,因为只是个hashCode嘛

posted @ 2007-05-04 13:11 ZelluX 阅读(915) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 25 26 27 28 29 30 31 32 33 下一页 Last