狐狸&花生

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  16 Posts :: 15 Stories :: 7 Comments :: 0 Trackbacks

2008年5月15日 #

     摘要:   阅读全文
posted @ 2008-05-15 10:42 崔振 阅读(330) | 评论 (0)编辑 收藏

     摘要:   阅读全文
posted @ 2008-05-15 10:39 崔振 阅读(451) | 评论 (0)编辑 收藏

     摘要:   阅读全文
posted @ 2008-05-15 10:37 崔振 阅读(330) | 评论 (2)编辑 收藏

2008年5月14日 #

     摘要:   阅读全文
posted @ 2008-05-14 09:24 崔振 阅读(42) | 评论 (0)编辑 收藏

2007年8月31日 #

jLynx是一个简单、轻量级、高性能的持久层框架。它非常适合于中小应用程序开发,其jar文件大小只有32K并且不依赖任何第三方组件。jLynx的API远比Hibernate、EJB 或JPA来得简单。POJO与java.util.Map持久化都是使用现有JDBC标准。经测试支持的数据库包括:Microsoft SQL Server 2000+、Oracle 9i、10g、IBM DB2/UDB、MySQL和HSQL。 支持通过XML定义SQL查询。提供完整的示例包括POJO与JSP代码生成。

于是我google了一下,没有源代码,有点可惜。只有一个zip包。里面有个war包。
唉……既然是开源,为啥没有源代码呢?有点耿耿于怀。
还是来一个QS吧
1.web.xml
1 <servlet>
2   <servlet-name>jLynxFormHandler</servlet-name>
3     <servlet-class>example.FormHandlerServlet</servlet-class>
4     <load-on-startup>1</load-on-startup>
5 </servlet>
6 <servlet-mapping>
7   <servlet-name>jLynxFormHandler</servlet-name>
8   <url-pattern>/jLynxServlet/*</url-pattern>
9 </servlet-mapping>

2.实现getDatabaseConnection()方法
 1 public class FormHandlerServlet extends net.sf.jlynx.web.FormHandlerServlet {
 2 
 3     public Connection getDatabaseConnection() throws SQLException {
 4 
 5                 Context c;
 6                 try {
 7                         c = new InitialContext();
 8                         DataSource ds = (DataSource) c.lookup("java:jdbc/MyDatabase");
 9                         return ds.getConnection();
10                 } catch (NamingException e) {
11                         e.printStackTrace();
12                         throw new SQLException(e.getMessage());
13                 }
14     }
15 }
16 

官方提供了一个完整的servlet的例子
 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.SQLException;
 4 
 5 import net.sf.jlynx.RelationalFactory;
 6 
 7 @SuppressWarnings("unchecked")
 8 public class FormHandlerServlet extends net.sf.jlynx.web.FormHandlerServlet {
 9 
10     private static final long serialVersionUID = 7379859928139821607L;
11 
12     private static boolean tableCreated = false;
13 
14     public Connection getDatabaseConnection() throws SQLException {
15 
16         try {
17             Class.forName(params.get("driver"));
18         } catch (Exception e) {
19         }
20         Connection c = DriverManager.getConnection(params.get("url"), params
21                 .get("user"), params.get("password"));
22 
23         if (!tableCreated) {
24             try {
25                 RelationalFactory.getInstance().setConnection(c).exec(
26                         "PersonDDL"null);
27                 tableCreated = true;
28             } catch (Exception e) {
29                 // TODO Auto-generated catch block
30                 e.printStackTrace();
31             } finally {
32                 c = DriverManager.getConnection(params.get("url"), params
33                         .get("user"), params.get("password"));
34             }
35 
36         }
37 
38         return c;
39     }
40 
41     @SuppressWarnings("unused")
42     public String list() throws SQLException {
43 
44         String result = RelationalFactory.getInstance().setConnection(conn)
45                 .select("SelectAllPersons"null"PERSON");
46 
47         result = "<?xml version='1.0' encoding='UTF-8'?>\n<PERSONS>\n" + result
48                 + "</PERSONS>";
49 
50         logger.debug("\n\nXML..\n\n" + result + "\n\n");
51         return result;
52     }
53 
54     @Override
55     public String save() throws SQLException {
56         return "No. of objects saved: " + super.save();
57     }
58 
59 }
60 
61 
3.页面的实现
 1 <form action="#" id="person">   
 2     <input name="person.id" type="hidden"> 
 3        Name: <input name="person.name" type="text"> <br> 
 4        City: <input name="person.city" type="text"> <br>
 5        Country: <input name="person.country" type="text"> <br>    
 6        <href="javascript:savePerson()">Save</a>
 7        <href="javascript:deletePerson()">Delete</a>
 8    </form><script type="text/javascript">
 9    function savePerson() {   
10     $("person").action = "jLynxServlet/action/save"    
11     $("person").request() 
12    }
13    function deletePerson() {    
14        $("person").action = "jLynxServlet/action/delete"   
15        $("person").request() 
16    }
17    </script>


唉,其实一直都没觉得吧action的路径放到js里是个好的解决方法……

总的说来,感觉没有官方说的那么牛……

posted @ 2007-08-31 02:09 崔振 阅读(96) | 评论 (0)编辑 收藏

2007年4月18日 #

Map接口:
    |
    + -- WeakHashMap: 以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条
    |      目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终
    |      止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。此实现
    |      不是同步的。
    |
    + -- TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的
    |    构造方法。此实现不是同步的。
    |
    + -- HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了      
    |        非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺   
    |       序恒久不变。此实现不是同步的。
    |
    +-- SortedMap: 进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有
         序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回
         )进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映
         射)。

Collection接口:
    |
    + -- Set接口:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并
    |      |     且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
    |      |
    |      + -- HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;
    |      |    特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,此实现不是同
    |      |    步的。
    |      |
    |      + -- LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在
    |      |    于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set
    |      |    中 的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。此实现不是同步
    |      |    的。
    |      |
    |      + -- TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时
    |           提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为基本操作(add、remove 和 contains)
    |           提供受保证的 log(n) 时间开销。此实现不是同步的。
    |
    + -- List接口:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户
           |      可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
           |
           + -- ArrayList:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。
           |    除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于
           |    Vector 类,除了此类是不同步的。)每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数
           |    组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增
           |    长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。此实现不是同步的。
           |
           + -- LinkedList:List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实
           |    现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方
           |    法。这些操作允许将链接列表用作堆栈、队列或双端队列。提供先进先出队列操作(FIFO)。此实现不是同步的。
           |
           + -- Vector:Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是
                ,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。此实现是同步的
                。
posted @ 2007-04-18 11:18 崔振 阅读(134) | 评论 (0)编辑 收藏

2007年3月13日 #

     摘要:   阅读全文
posted @ 2007-03-13 16:22 崔振 阅读(421) | 评论 (0)编辑 收藏

2007年1月9日 #

自从用上了tomcat5.5,发现日志信息没了,出错了也找不着有用的信息,上apache找答案,果然

Tomcat 5.5 uses Commons Logging throughout its internal code allowing the developer to choose a logging configuration that suits their needs, e.g java.util.logging or Log4J. Commons Logging provides Tomcat the ability to log hierarchially across various log levels without needing to rely on a particular logging implementation.

An important consequence for Tomcat 5.5 is that the <Logger> element found in previous versions to create a localhost_log is no longer a valid nested element of <Context>. Instead, the default Tomcat configuration will use java.util.logging. If the developer wishes to collect detailed internal Tomcat logging (i.e what is happening within the Tomcat engine), then they should configure a logging system such as java.util.logging or log4j as detailed next

习惯用log4j来配置log信息的输出。

新建log4j.properties,内容为

log4j.rootLogger=info,Console,R

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.Console.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/tomcat.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %5p %c{1}(%L):  %m%n

log4j.logger.org.apache=info, R
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R
log4j.logger.org.apache.catalina.core=info, R
log4j.logger.org.apache.catalina.session=info, R

最后四行是tomcat的信息,如果改为debug日志文件将十分庞大。

将这个文件放入${catalina.home}/common/classes下,再将log4j.jar和commons-logging.jar放入${catalina.home}/common/lib下,就可以在${catalina.home}/logs/下见到日志了。

posted @ 2007-01-09 18:42 崔振 阅读(661) | 评论 (0)编辑 收藏

2007年1月4日 #

我在做项目时曾碰到这个问题,怎样动态地添加一个文本框或文件域,这在网上很容易找到。但对怎样处理提交的动态数据就很少有这方面的信息了。本人翻阅了一些资料,把自己的方法写了下来,以飨读者。

1.提交表单

 

<html>
<body>
 <form name
= " form "  method = " post "  action = " add.jsp " >
   <input name
= " button "  type = button onClick = 'additem( " tb " )' value = " 添加>> " >
 <table id
= " tb " >
 </table>
<script language
= " javascript " >

function additem(id)
{
  var row
, cell , str ;
  row  =  eval( " document.all[ " +' " '+id+' " '+ " ] " ).insertRow() ;
  if(row ! =  null )
     {
        cell 
=  row.insertCell() ;
        str = " <input type= " +' " '+ " text " +' " '+ "  name= " +' " '+ " StuName " +' " '+ " ><input type= " +' " '+ " button " +' " '+ "  value= " +' " '+ " 删除 " +' " '+ "  onclick='deleteitem(this, " +' " '+ " tb " +' " '+ " );'> "
   cell.innerHTML
= str ;

      }
}
function deleteitem(obj
, id)
{
  var rowNum
, curRow ;
  curRow  =  obj.parentNode.parentNode ;
  rowNum  =  eval( " document.all. " +id).rows.length -  1 ;
  eval( " document.all[ " +' " '+id+' " '+ " ] " ).deleteRow(curRow.rowIndex) ;
}
</script>
   <p>
     <input type
= " submit "  name = " submit "  value = " 提交 " >
   </p>
 </form>
</body>
</html>

 

2.处理数据

< body >
< table  border ="1" >< tr >< td  colspan ="2" > eg </ td ></ tr >
<%
Enumeration params
= request.getParameterNames();
while (params.hasMoreElements()){
String  name = ( String )params.nextElement();
String [] values = request.getParameterValues(name);
if (name.equals( " StuName " )){
%>
< tr >
< td > <% = name %> </ td >
< td >
<%
for ( int  index = 0 ;index < values.length;index ++ ){
%>
<% = values[index] %>
<% }} %>
</ td >
</ tr >
</ table >
</ body >

posted @ 2007-01-04 14:44 崔振 阅读(382) | 评论 (1)编辑 收藏

2006年12月18日 #

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

    一,servlet容器对url的匹配过程:

     

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

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

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

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

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

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

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

    二,url-pattern详解

         web.xml文件中,以下语法用于定义映射:

l  ”/’开头和以”/*”结尾的是用来做路径映射的。

l  以前缀”*.”开头的是用来做扩展映射的。

l  “/” 是用来定义default servlet映射的。

l  剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

posted @ 2006-12-18 10:45 崔振 阅读(183) | 评论 (0)编辑 收藏