随笔-29  评论-5  文章-0  trackbacks-0
  2010年5月21日
xwork-core-2.1.6
http://release.opensymphony.com/xwork/2.1.6/
struts 2.1.8
http://struts.apache.org/download.cgi#struts2181
spring 3.0.3
http://www.springsource.org/download
hibernate
http://sourceforge.net/projects/hibernate/files/
itatis 3v
http://ibatis.apache.org/java.cgi
posted @ 2010-07-24 18:05 豪情 阅读(350) | 评论 (0)编辑 收藏

package org.apache.struts2.dispatcher.ng.filter;

import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.mapper.ActionMapping;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Handles both the preparation and execution phases of the Struts dispatching process.  This filter is better to use
* when you don't have another filter that needs access to action context information, such as Sitemesh.
*/
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
    private PrepareOperations prepare;
    private ExecuteOperations execute; 
//初始化过滤器
    public void init(FilterConfig filterConfig) throws ServletException {
        InitOperations init = new InitOperations(); //初始化辅助对象,封装了初始化的一些操作
        try {
            FilterHostConfig config = new FilterHostConfig(filterConfig); //对filterConfig进行封装
            init.initLogging(config); //通过config,初始化内部Struts的记录


            Dispatcher dispatcher = init.initDispatcher(config); //通过config,创建并初始化dispatcher

 

            init.initStaticContentLoader(config, dispatcher); //通过config和dispatcher,初始化与过滤器相关的静态内容加载器

            prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); //通过config和dispatcher,创建request被处理前的系列操作对象
            execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);//通过config和dispatcher,创建处理request的系列操作对象
 
        } finally {
            init.cleanup(); //清空ActionContext
        }

    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        try {
            prepare.createActionContext(request, response); //创建ACTIONCONTEXT,并初始化Theadlocal 

            prepare.assignDispatcherToThread(); //指派dispatcher给Theadlocal
            prepare.setEncodingAndLocale(request, response); //设置request的编码和LOCAL
            request = prepare.wrapRequest(request); //封装request
            ActionMapping mapping = prepare.findActionMapping(request, response); //查找并选择创建ActionMapping
            if (mapping == null) { //如果映射不存在
                boolean handled = execute.executeStaticResourceRequest(request, response); //试图执行一个静态资源的请求
                if (!handled) {
                    chain.doFilter(request, response);
                }
            } else { //如果存在映射
                execute.executeAction(request, response, mapping); //执行action
            }
        } finally {
            prepare.cleanupRequest(request); //清除request的Threadlocal
        }
    }

    public void destroy() {
        prepare.cleanupDispatcher();
    }
}

来自于:http://qianjian21.javaeye.com/blog/480206

最后不得不下载新版的struts 解决这个问题

posted @ 2010-07-22 23:45 豪情 阅读(991) | 评论 (0)编辑 收藏
http://java.ccidnet.com/art/3559/20070612/1109407_1.html
posted @ 2010-07-06 11:33 豪情 阅读(249) | 评论 (0)编辑 收藏
来自于:http://www.cnblogs.com/linbaoji/archive/2009/01/07/1370919.html


lazy,延迟加载

Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。

lazy策略可以用在:

* <class>标签上:可以取值true/false

* <property>标签上,可以取值true/false,这个特性需要类增强

* <set>/<list>等集合上,可以取值为true/false/extra

* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy

6.1 get和load的区别:

* get不支持延迟加载,而load支持。

* 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。

6.2 类(Class)的延迟加载:

* 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性)

* 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。

* //不会发出查询sql

       System.out.println("
group id=+ group.getId());

这里有一个问题,为什么加载主键的时候不需要发出sql语句。

6.3 集合(collection)的延迟加载:可以取值true,false,extra

* 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。

   
* 设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。

* 设置集合上的lazy=false

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据

false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据

extra:一种比较聪明的懒加载策略,即调用集合的size
/contains等方法的时候,hibernate

并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据

6.4 Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置

懒加载策略。可以取值为:false
/proxy/no-proxy

false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象

proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类

no
-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

注意:在class标签上配置的lazy属性不会影响到关联对象!!!


posted @ 2010-06-10 17:47 豪情 阅读(622) | 评论 (0)编辑 收藏
源自于:http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html
最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法

设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 Hibernate的Criteria 的用法进行总结:
   Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。
   Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所
以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需
Session,DetachedCriteria 提供了 
2 个静态方法 forClass(Class) 或 forEntityName(Name)
进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate
().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结
果。
   Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设
置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于 Criteria 还可以设置 FlushModel
(冲刷 Session 的方式)和 LockMode (数据库锁模式)。
下面对 Criterion 和 Projection 进行详细说明。
     Criterion 是 Criteria 的查询条件。Criteria 提供了 
add(Criterion criterion) 方法来
添加查询条件。
     Criterion 接口的主要实现包括: Example 、 Junction 和 SimpleExpression 。而
Junction 的实际使用是它的两个子类 conjunction 和 disjunction ,分别是使用 
AND 和 OR 操
作符进行来联结查询条件集合。
     Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态
方法,如 eq (等于)、 ge (大于等于)、 
between 等来方法的创建 Criterion 查询条件
(SimpleExpression 实例)。除此之外, Restrictions 还提供了方法来创建 conjunction 和
disjunction 实例,通过往该实例的 
add(Criteria) 方法来增加查询条件形成一个查询条件集合

     至于 Example 的创建有所不同, Example 本身提供了一个静态方法 
create(Object
entity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些
过滤条件:
Example exampleUser 
=Example.create(u)
.ignoreCase() 
// 忽略大小写
.enableLike(MatchMode.ANYWHERE);
// 对 String 类型的属性,无论在那里值在那里都匹配。相当于 %value%
  Project 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Project 主要有
SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和
ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 
avg 、 count 、 max 、
min 、 sum 可以让开发者很容易对某个字段进行统计查询。
       Property 是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”).
in
(new String
[]{“black”,”red”,”write”}); 则可以创建一个 Project 实例。通过
criteria 的 
add(Project) 方法加入到查询条件中去。
    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查
询条件的创建和组装,下面介绍几种用法:
1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
Criteria crit 
= sess.createCriteria(Cat.class);
crit.setMaxResults(
50);
List cats 
= crit.list();
 
2. 限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。

org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.like("name", "Fritz%") )
    .
add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();

约束可以按逻辑分组。
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.like("name", "Fritz%") )
    .
add( Restrictions.or(
        Restrictions.eq( "age", new 
Integer(0) ),
        Restrictions.
isNull("age")
    ) )
    .list();
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
    .
add( Restrictions.disjunction()
        .
add( Restrictions.isNull("age") )
        .
add( Restrictions.eq("age", new Integer(0) ) )
        .
add( Restrictions.eq("age", new Integer(1) ) )
        .
add( Restrictions.eq("age", new Integer(2) ) )
    ) )
    .list();
 
Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许

你直接使用SQL。
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",

Hibernate.STRING) )
    .list();
 
{alias}占位符应当被替换为被查询实体的列别名。
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个

Property。
 
  Property age 
= Property.forName("age");
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.disjunction()
        .
add( age.isNull() )
        .
add( age.eq( new Integer(0) ) )
        .
add( age.eq( new Integer(1) ) )
        .
add( age.eq( new Integer(2) ) )
    ) )
    .
add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
    .list();
 
3. 结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序。
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.like("name", "F%")
    .addOrder( 
Order.asc("name") )
    .addOrder( 
Order.desc("age") )
    .setMaxResults(
50)
    .list();
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Property.forName("name").like("F%") )
    .addOrder( Property.forName("name").
asc() )
    .addOrder( Property.forName("age").
desc() )
    .setMaxResults(
50)
    .list();
 
4. 关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.like("name", "F%")
    .createCriteria("kittens")
        .
add( Restrictions.like("name", "F%")
    .list();


注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。
接下来,替换形态在某些情况下也是很有用的。
 
List cats 
= sess.createCriteria(Cat.class)
    .createAlias("kittens", "kt")
    .createAlias("mate", "mt")
    .
add( Restrictions.eqProperty("kt.name", "mt.name") )
    .list();


(createAlias()并不创建一个新的 Criteria实例。)
Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得

符合条件的kittens, 你必须使用returnMaps()。
 
List cats 
= sess.createCriteria(Cat.class)
    .createCriteria("kittens", "kt")
    .
add( Restrictions.eq("name", "F%") )
    .returnMaps()
    .list();
Iterator iter 
= cats.iterator();
while ( iter.hasNext() ) {
    Map map 
= (Map) iter.next();
    Cat cat 
= (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten 
= (Cat) map.get("kt");
}

5. 动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
 
List cats 
= sess.createCriteria(Cat.class)
    .
add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.EAGER)
    .setFetchMode("kittens", FetchMode.EAGER)
    .list();
 
这个查询可以通过外连接抓取mate和kittens。
 
6. 查询示例
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。
 
Cat cat 
= new Cat();
cat.setSex(
'F');
cat.setColor(Color.BLACK);
List results 
= session.createCriteria(Cat.class)
    .
add( Example.create(cat) )
    .list();


版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。
可以自行调整Example使之更实用。
 
Example example 
= Example.create(cat)
    .excludeZeroes()           
//exclude zero valued properties
    .excludeProperty("color")  
//exclude the property named "color"
    .ignoreCase()              
//perform case insensitive string comparisons
    .enableLike();             
//use like for string comparisons
List results 
= session.createCriteria(Cat.class)
    .
add(example)
    .list();


甚至可以使用examples在关联对象上放置条件。
 
List results 
= session.createCriteria(Cat.class)
    .
add( Example.create(cat) )
    .createCriteria("mate")
        .
add( Example.create( cat.getMate() ) )
    .list();


7. 投影(Projections)、聚合(aggregation)和分组(grouping
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用

setProjection()应用投影到一个查询。
 
List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.
rowCount() )
    .
add( Restrictions.eq("color", Color.BLACK) )
    .list();
 
List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .
add( Projections.rowCount() )
        .
add( Projections.avg("weight") )
        .
add( Projections.max("weight") )
        .
add( Projections.groupProperty("color") )
    )
    .list();



在一个条件查询中没有必要显式的使用 "
group by" 。某些投影类型就是被定义为 分组投影,他

们也出现在SQL的group by子句中。

可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的

实现方式:
 
List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
    .addOrder( 
Order.asc("colr") )
    .list();



List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.groupProperty("color").
as("colr") )
    .addOrder( 
Order.asc("colr") )
    .list();
 
alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,

当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:
 
List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .
add( Projections.rowCount(), "catCountByColor" )
        .
add( Projections.avg("weight"), "avgWeight" )
        .
add( Projections.max("weight"), "maxWeight" )
        .
add( Projections.groupProperty("color"), "color" )
    )
    .addOrder( 
Order.desc("catCountByColor") )
    .addOrder( 
Order.desc("avgWeight") )
    .list();


List results 
= session.createCriteria(Domestic.class, "cat")
    .createAlias("kittens", "kit")
    .setProjection( Projections.projectionList()
        .
add( Projections.property("cat.name"), "catName" )
        .
add( Projections.property("kit.name"), "kitName" )
    )
    .addOrder( 
Order.asc("catName") )
    .addOrder( 
Order.asc("kitName") )
    .list();


也可以使用Property.forName()来表示投影:
 
List results 
= session.createCriteria(Cat.class)
    .setProjection( Property.forName("name") )
    .
add( Property.forName("color").eq(Color.BLACK) )
    .list();
List results 
= session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .
add( Projections.rowCount().as("catCountByColor") )
        .
add( Property.forName("weight").avg().as("avgWeight") )
        .
add( Property.forName("weight").max().as("maxWeight") )
        .
add( Property.forName("color").group().as("color" )
    )
    .addOrder( 
Order.desc("catCountByColor") )
    .addOrder( 
Order.desc("avgWeight") )
    .list();


8. 离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来

执行它。
 
DetachedCriteria query 
= DetachedCriteria.forClass(Cat.class)
    .
add( Property.forName("sex").eq('F') );
//创建一个Session
Session session 
= .;
Transaction txn = session.beginTransaction();
List results 
= query.getExecutableCriteria(session).setMaxResults(100).list();
txn.
commit();
session.
close();


DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者
Property获得。
 
DetachedCriteria avgWeight 
= DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight").
avg() );
session.createCriteria(Cat.class)
    .
add( Property.forName("weight).gt(avgWeight) )
    .list();
DetachedCriteria weights 
= DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .
add( Subqueries.geAll("weight", weights) )
    .list();

相互关联的子查询也是有可能的:
 
DetachedCriteria avgWeightForSex 
= DetachedCriteria.forClass(Cat.class, "cat2")
    .setProjection( Property.forName("weight").
avg() )
    .
add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
    .
add( Property.forName("weight).gt(avgWeightForSex) )
    .list();


posted @ 2010-06-10 17:44 豪情 阅读(215) | 评论 (0)编辑 收藏
http://space.itpub.net/11310314/viewspace-178

记得去年某世界级的大师到中国忽悠几天后回去说,中国只是开源“消费者”,那话的意思好像我们只会从开源社区中索取, 不懂得贡献似的。那么实际情况又是如何呢?这是昨晚整理的中国Java开源领域的斗士们的情况,根据他们对中国java开源界的贡献值、重要性、发展潜力等作了一个综合评价,可以说他们是中国Java开源界里最可爱的人。欢迎大家来看看这里是否有你认识英雄。

1、  Huihoo动力—当之无愧的老大 

代表人物:龙辉(Allen)程勇(Peter)、杨泳(Orbat)

代表项目:JFox

官方网站:http://www.huihoo.org/

简评:说到java开源,大家不可能不知道HuihooHuihoo曾经创造了很多奇迹,不管是对是团队成员的技术水平还是开源理念、开源组织的管理等都可以说是最棒 的,JFox项目 一直具有生命力,huihoo这么多年了也一直具有生命力,AllenPeterOrbat等对这个团队这么多年来的坚持及贡献,要选国内最值得推崇的开源团体,huihoo排在第一位可以说是当之无愧。因此,他们是最可爱的人。
 

2Jdon高处不胜寒

代表人物:彭晨阳(板桥里人)

代表项目:jdonframework

官方网站:http://www.jdon.com/

简评:作为国内第一个开源框架的发起人,作为国内第一个敢于与国外框架叫板的板桥里人,他曾经带给大家很多 很多的欣喜及回忆,桥技术水平及造诣这里就更不用说了,他“一个开源人的 孤独告白”,有点沧桑,有点心寒,jdon今天的现状,是中国对待技术人才的真实写照。无论如何,选中国Java开源界最可爱的人,板桥当之无愧。
 

3Apusic OperaMasks谁说开源不赚钱

代表人物:袁红岗 张勇

代表项目:OperaMasks

官方网站:http://www.operamasks.org/

  简评:1000万人民币的投入,一篇“勇敢者的新 世界”也算是在中国开源界掀起了一阵波澜,产品发布会上那一份份合同,更是让同行的老总们有点眼红。除去商业因素不说,这两天Check outOperaMasks的代码,也看了示例, 表现非常不错,值得深层次的java开发人员学习。老袁深厚的技术功底、老张卖力的全国路演,公司经营战略的成功,OperaMasks能否发展成为一个最能适合中国国情的开源组织, 让我们拭目以待。

4EasyJF后生可畏

  代表人物:蔡 世友(大峡)、吴嘉俊(stef_wu)、程强(天一)

代表项目:EasyJWeb

官方网站:http://www.easyjf.com

  简评:看 了大峡小朋友的一些文章,看到EasyJF现在的发展,真真实实有一种后生 可畏的感叹。他们有自己的专职团队,有网下办公室,还有硬件设施,还拥有一群有激情、好学的年轻小伙子们。虽然要得到中国人自己的认可是很不容易的事情, 但搜索一下带是发现国内已经有不少网站在用EasyJWeb做开发。因此,最可爱的人当他们莫属,衷心希望他们能成功。

5SpringSide天才团队

代表人物:肖 桦(江南白衣)陈俊(cac)、田淼(差沙)

代表项目:SpringSide

官方网站:http://www.springside.org.cn/

简评:虽然只是站在春天的傍边,但已经带给了整天忙于追逐新技术、新潮流的Java程序员们很多极具参考价值的东西。江 南白衣同学可以算是一个天才般的人物,技术的攻底、接受并译释新技术的速度、能力及水平,可以说是少数中的少数。因此,SpringSide可以称得上最具有偶像潜 质的团队,Java开源界最可爱的人,他们 当之无愧,希望他们能从“傍边”走到“中间”。

6Buffalo社区浓缩是精

代表人物:陈 金洲(Michael Chen)

代表项目:Buffalo

官方网站:http://buffalo.sourceforge.net/

简评:作为第一个国人开发的Ajax框架,作为一个能把一直受java大拿们岐视javascript玩转得如何熟悉的项目,作为一个能几年坚持更新的开源项目,Buffalo是成功的,Michael Chen让我们体会到国内开源贡献者们执着与坚持。 他是不是最可爱的人,谁是?
 

7、天乙社区—享受开 源动力

代表人物:laoer

代表项目:天乙开源社区

官方网站:http://www.laoer.com/

简评:有多少开源项目的产品发布到8.0,从jspstruts1struts2一路走来,一直能跟着新技术的步伐,不断改进及完善。因此,当之无愧java开源界最可爱的人。

8CowNew开源真有一点牛

代表人物:杨 中科

代表项目:CowNewSQL

官方网站:http://www.cownew.com/

简评:看过杨中科同学的两篇文章,我觉得他是可爱的。多数据库翻译引擎CowNewSQL的价值将在哪里体现?CowNew能在何时给我们带来更多实用的东西,值得大家期待。无论 如何,他们的进步是有目共睹。

9CommonTemplate值得期待

代表人物:梁 飞(javatar)

代表项目:CommonTemplate

官方网站:http://www.commontemplate.org/

简评:也许很多人不知道这个项目,但他确实是一个很不错的模板引擎,金子总有发光的时候。只要坚持,相信有一 天梁飞同学会给大家带来更多的惊喜。

10、恩信—小公司也能开源

代表人物:刘有涛

代表项目:恩 信开源ERP

官方网站:http://www.nseer.com/

简评:听过刘总的演讲,从“捕鱼”到“授之以渔”,从刘总一系 列运作手法,我觉得恩信可以成为很多追逐开源但又没有上千万资金来投入而总在为是否参加开源而徘徊的老总们的参考学习的案例。虽然没有技术牛人加盟,虽然 还使用稍为古老的技术体系,但既然开源了,总能让我们学到很多东西。呵呵,所有最可爱的开源人中,刘总算是算是最年长的了,祝他们开源ERP大卖。

除了上面10个开源项目里面的最可爱的人以外,还有一些曾经激情一时并给大家带来快乐,但因为很多原因没能坚持下来的开源斗士们,这里就不逐一列出来,为他 们感到惋惜的同时,也希望有一天能看到更多的人与企业参与到开源的队伍中来。当然,可能还有一些比较优秀的团队我没有发现,而恰好你又知道,那么请您告诉 我,在今后的日子里我会尽我的力量也来做点贡献。

版权声明:本文版权由Blogjava小雨开源所有,受法律保护。欢迎转载,转载请保留作者版权 声明及连接。


posted @ 2010-06-09 22:08 豪情 阅读(293) | 评论 (0)编辑 收藏
<property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</property>

<!-- 乱码 -->
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
posted @ 2010-06-08 23:21 豪情 阅读(204) | 评论 (0)编辑 收藏
来自于:http://www.blogjava.net/apple0668/archive/2008/10/09/233436.html

transient、persistent、 detached状态关系图如下:



1、transient状态的特征:
                                     
* 在数据库中没有与之匹配的数据
                                     
* 没有纳入session的管理
 
2、persistent状态的特征:
                                     
* persistent状态的对象在数据库中有与之匹配的数据
                                     
* 纳入了session的管理
                                     
* 在清理缓存(脏数据检查)的时候,会和数据库同步
 
3、detached状态的特征:
                                     
* 在数据库中有与之匹配的数据
                                     
* 没有纳入session的管理 

PS:了解这几种状态对深入使用hibernate有比较大的意义,开发过程中减少很多不必要的错误。

posted @ 2010-06-08 22:57 豪情 阅读(269) | 评论 (0)编辑 收藏
来自于:http://linweihan.javaeye.com/blog/144652
2.6  构建SessionFactory
Hibernate的SessionFactory接口提供Session类的实例,Session类用于完成对数据库的操作。由于 SessionFactory实例是线程安全的(而Session实例不是线程安全的),所以每个操作都可以共用同一个SessionFactory来获取Session。

Hibernate配置文件分为两种格式,一种是xml格式的配置文件,另一种是Java属性文件格式的配置文件,因此构建SessionFactory也有两种方法,下面分别介绍。

2.6.1  从XML文件读取配置信息构建 SessionFactory
从XML文件读取配置信息构建SessionFactory的具体步骤如下。

1)创建一个Configuration对象,并通过该对象的configura()方法加载Hibernate 配置文件,代码如下。

Configuration config 
= new Configuration().configure();

configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。 Configuration在实例化时默认加载classpath中的hibernate.cfg.xml,当然也可以加载名称不是hibernate.cfg.xml的配置文件,例如wghhibernate.cfg.xml,可以通过以下代码实现。

Configuration config 
= new Configuration().configure("wghhibernate.cfg.xml");

2)完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的 Configuration实例,通过Configuration实例

的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下。

SessionFactory sessionFactory 
= config.buildSessionFactory();

构建SessionFactory要放在静态代码块中,因为它只在该类被加载时执行一次。一个典型的构建 SessionFactory的代码如下。

例程2
-9:光盘\mr\02\sl\09\CoreSession.java

java 代码

 
import org.hibernate.*;   
 
import org.hibernate.cfg.*;   
 
public class CoreSession {   
 
static SessionFactory sessionFactory;   
//注意到这里的SessionFactory都是static的
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次   
 
static{   
 
    try{   
 
         Configuration config = new Configuration().configure();   
 
         sessionFactory = config.buildSessionFactory();   
 
    } catch (Exception e) {   
 
        System.out.println(e.getMessage());   
 
    }   
 
}   
 
}  
 

2.6.2  从Java属性文件读取配置信息构建SessionFactory
从Java属性文件读取配置信息构建SessionFactory的具体步骤如下。

1)创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties,代码如下。

Configuration config 
= new Configuration();

2)由于在配置文件中缺少相应的配置映射文件的信息,所以此处需要通过编码方式加载,这可以通过Configuration对象的

addClass()方法实现,具体代码如下。

config.addClass(BranchForm.
class);

addClass()方法用于加载实体类。

3)完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的Configuration实例,通过Configuration实例

的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下。

SessionFactory sessionFactory 
= config.buildSessionFactory();

构建SessionFactory要放在静态代码块中,因为它只需在该类被加载时执行一次,一个典型的构建SessionFactory的代码如下。

例程2
-10:光盘\mr\02\sl\10 \CoreSession.java

java 代码

import org.hibernate.*;   
 
import org.hibernate.cfg.*;   
 
public class CoreSession {   
 
static SessionFactory sessionFactory;   
 
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次   
 
static{   
 
    try{   
 
       Configuration config = new Configuration();   
 
        config.addClass(BranchForm.class);   
 
        sessionFactory = config.buildSessionFactory();   
 
    } catch (Exception e) {   
 
        System.out.println(e.getMessage());   
 
    }   
 
}   
 



posted @ 2010-06-08 20:48 豪情 阅读(3395) | 评论 (0)编辑 收藏
来自于:http://letle.javaeye.com/blog/78530


Hibernate主键生成方式  Key Generator
主键产生器
可选项说明:
1) assigned
主键由外部程序负责生成,无需Hibernate参与。

2) hilo
通过hi
/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

3) seqhilo
与hilo 类似,通过hi
/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。

6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

7native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。

10) foreign
使用外部表的字段作为主键。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。

另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto
-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。
因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。

posted @ 2010-06-07 22:10 豪情 阅读(249) | 评论 (0)编辑 收藏
来自于:http://developer.51cto.com/art/200906/132121.htm
在*.hbm.xml必须声明的< generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。
< generator class="sequence"/>

这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是一些内置生成器的快 捷名字:

increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。

sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

hilo (高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next_hi)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要 使用这种生成器。

seqhilo(使用序列的高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一 个32位16进制数字的字符串。

uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在 PostgreSQL数据库中

native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

assigned(程序设置)
让应用程序在save()之前为对象分配一个标示符。

foreign(外部引用)
使用另外一个相关联的对象的标识符。和< one-to-one>联合一起使用。

<class name="onlyfun.caterpillar.User" table="USER"> 

<id name="id" type="string" unsaved-value="null"> 

 
<column name="USER_ID"/> 

 
<generator class="uuid.hex"/> 

</id>
posted @ 2010-06-07 22:07 豪情 阅读(152) | 评论 (0)编辑 收藏
package org.apple.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;



class UserTest{ 
public static void main(String[] args) throws Exception{            
   
//配置环境,分析xml映射文件
   Configuration conf= new Configuration().addClass(User.class);
   
   
//生成并输出sql到文件(当前目录)和数据库
   SchemaExport dbExport=new SchemaExport(conf);
   dbExport.create(
truetrue);
}
posted @ 2010-06-06 22:55 豪情 阅读(210) | 评论 (0)编辑 收藏
来自于:http://www.yesky.com/404/1827904.shtml
作为老师,笔者经常要制作一些教育影片,如果采取常规方式抓取(如用SnagIt抓取),生成的文件体积往往过大,不便于传送。而Camtasia Studio不仅能方便地实现视频录制,而且由于采用TSCC的编码算法,录制的视频文件体积小巧,质量也不逊于同类软件,非常适合需要录制游戏视频和制作教学影片的朋友使用。

  Camtasia Studio 档案

  软件信息:23.7MB/共享软件
下载地址:天极网下载频道
软件亮点:可以录制屏幕中的各种动作,并保存为体积较小的视频文件, 而且它的编辑功能也不弱。

  我们以录制教学影片为例来介绍它的使用。

  一、必要的设置

  我们主要使用的是Camtasia Studio中的组件——Camtasia Recorder,在抓取前有必要对Camtasia Recorder设置一番。

  启动Camtasia Studio,点击“Tools→Camtasia Recorder”即可打开录制视频的组件窗口(图1)。


图1

  点击“Tools→Options”,打开设置窗口,选择“Hotkeys”标签,然后将“Record/Pause hotkey”(录制/暂停热键)设置为“Ctrl+Shift+Alt+1”,将“Stop hotkey”(停止热键)设置为“Ctrl+Shift+Alt+2”,这样在制作影片时只要按下相应的热键就可以进行录制、停止等操作。

  热键设置完毕后,再选择“File”标签,选择“Automatic File Nam Prefile”项,在后面的框中输入“教学影片-”,最后再设置“Output”(文件保存位置),例如保存在d:"教学影片中。其它项使用其默认设 置。

  另外,由于抓取的是整个操作界面,最后我们还要选择 “Capture→Input→Screen”,这样在录制时就会录制整个屏幕的内容了,如果还想在录制视频时顺便录制音频、鼠标轨迹,请分别选择菜单 “Effects→Audio→Record Audio”和“Effects→Cursor→Show Cursor”。



posted @ 2010-06-04 21:52 豪情 阅读(637) | 评论 (0)编辑 收藏
     摘要: 来自于:http://hi.baidu.com/universeioi/blog/item/ab2ee5efab85493127979154.html Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->前面我们所定义的属性都是几本的...  阅读全文
posted @ 2010-06-03 21:00 豪情 阅读(684) | 评论 (0)编辑 收藏
http://sarin.javaeye.com/blog/593207
posted @ 2010-06-02 14:29 豪情 阅读(162) | 评论 (0)编辑 收藏

很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!
要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。
那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?还好,SUN提供了Javabean可以把你的JSP中的Java代码封装起来,便于调用也便于重用。接着就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail了。
好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看,这样看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用劳您老大架再亲自把它再输一遍吧,再说直接复制还不用怕出错,何乐而不为呢!还有就是要经常上一些好的Java编程文章,有好的文章要Cut下来,有问题尽管问,只要问题不是太傻,一般高手都会回答你的。下面介绍几个好的Java方面的编程网站:
CSDN论坛http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的,你可以在上面提出问题,马上就有人回答你,如果你觉得好,你可以给那人加分;
Java研究组http://www.javaresearch.org/ 上面有很多原创文章,高手还是挺多的;
Java开发者http://www.chinajavaworld.com/ 那里Java资料比较全;
java.com.cn http://www.java.com.cn/ 看这域名就知道有多牛,注册用户快接近一万了,同时在线人数也在一千左右,人气很旺的;
IBM的开发者网http://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人;

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他还愿意不厌其烦地教你,这样好象有点难哦!
还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,最近《金装四大才子》看多了)。学Java必读的两个开源程序就是Jive和Pet Store.。Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网http://www.jdon.com/ 去下载,或到同济技术论坛的服务器上ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要错过了。
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得我也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是我泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。关于设计模式的资料,还是向大家推荐banq的网http://www.jdon.com/ ,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程,相信你又会上一个台阶。
做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的来了。。。。。。
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
下面介绍两个好的开源项目网站:
湖北省软件公共开发平http://gro.clinux.org/
共创联http://cosoft.org.cn/
哇,好高兴哦,我终于成为高手了!非也,非也。古人云:“识时务者为俊杰”。你知道计算机界现在的发展形势吗?你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来“Web服务将是下一代互联网应用的制高点”,而微软的.NET蓝图和SUN ONE计划的斗争焦点,也就是Web服务。Web服务就是一个崭新的分布式计算模型,它是一系列标准的综合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同语言编写的软件能够轻易的集成起来,使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来,我们就可以在家里点击一下鼠标,就可以完成出门旅游的全部准备工作,包括定飞机票,定旅游线路,定好房间等。请注意,这所有的一切都是Web站点间自动完成的,再也不用象现在一样,表面上是电子商务,实际上很多环节都是人工操作。也许你会觉得这是天方夜谈,不过就近的说,你也很有可能承接一个项目,要集成两个企业的ERP系统。很有可能上游企业的系统是用Dephi编的,而下游企业的系统是用Java编的。你说你是Java高手,大家都看者你怎么做呢。所以啊,你还得学习新技术,如Web服务,而且你Dephi也要懂一点吧(Dephi6现在已经提供Web服务的控件了)。 你编的Java系统,可能要和.NET集成,所以你.NET要懂一点吧?到最后,你可能发现你已经成为Java高手了,但很多时间却在搞别的技术。太极张三丰里说,最厉害的招式就是没有招式,可能就是这个道理吧!
因为刚刚兴起,所以网上Web服务的资料不是很多,我还是给大家推荐几个网站吧:
中国UDDI技术联http://www.uddi-china.org/
CSDN的柴晓路专http://www.csdn.net/develop/author/ColumnAuthor/fennivel/ (注:柴晓路也是互联网上一个有名的人物,他发表过很多关于Web服务的文章,还出了一书,应该称的上是中国Web服务技术的先行者)
IBM的开发者网络的XML&Web Service专栏:
http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服务的力推者
呜…你费劲千心万苦,总算成为Java高手了,怎叫人不由喜极而泣呢!是啊,真不容易,真不简单,真叫人感动啊!那么打个电话告诉我吧,什么?我的电话号码是多少?昏到,你打电话问不就知道了吗,真是的……


如上是在网上考下来的,但个人认为SCJP证书也好,程序员等级证书也好,不要太看重它;关键是你手中有没有技术,能不能拿出活来。我面试时候都是以证书为参考,主要衡量你的手段还是提问技术性问题以及一些编程方面的基础问题。建议不要把证书看的太重。


参考资料:参考高手建议
from:http://zhidao.baidu.com/question/6711485.html
posted @ 2010-05-31 22:13 豪情 阅读(205) | 评论 (0)编辑 收藏
程序执行过程:
1. Load到内存区。
在硬盘上有一块程序代码,要想运行,编译好的东西load到内存。然后操作系统代码找到

main方法,然后执行。

2. 找到main方法开始执行。
3. 执行过程中的内存管理。
一般分为四部分:
a. code segment: 存放代码,代码区
b. data segment: 静态变量,字符串常量
c. stack(栈): 局部变量
d. heap(堆): new出来的东西
posted @ 2010-05-29 22:11 豪情 阅读(1866) | 评论 (2)编辑 收藏
1.6 Zh chm
http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM

1.6 En chm
http://download.csdn.net/source/1277711
posted @ 2010-05-29 21:57 豪情 阅读(640) | 评论 (0)编辑 收藏
from:http://cuihongxin1030.javaeye.com/blog/405487
一、 IoC(Inversion of control): 控制反转
1、IoC:
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean
二、AOP(Aspect-Oriented Programming): 面向方面编程
1、 代理的两种方式:
静态代理:
 针对每个具体类分别编写代理类;
 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
2、 AOP的主要原理:动态代理



Spring工作原理
        Spring 已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,
动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射
反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml  Spring的配置
文件来动态的创建对象,和调用对象里的方法的 。
     Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是
在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过
配置类达到的。
   Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明
管理的(Spring根据这些配置 内部通过反射去动态的组装对象)
   要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)
  Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了
也就基本上掌握了Spring.

sunlightcs (架构师)的说法:
struts是一个MVC框架,当用户浏览网页的时候,呈现给用户的页面就是V,当用户发送请求的时候,就会在struts的配置文件里到处理此请求的 ACTION(这就是C),ACTION调用相应的业务组件,完成相应的业务时(这就是M),又会到struts的配置文件里寻找对应的页面,返回页面给 用户。整个流程就这个样子。
其中M层做的事比较多,所有的业务功能都在这里实现(当然也有一些不规范的写法,把业务写在ACTION里),如果要与数据库交互,M层就要调用 数据库了,通过Hibernate实现,Hibernate主要是跟数据库打交道.
其中,所有的业务功能及ACTION以及DAO都可以交给SPRING管理,SPRING的最常用的功能是IOC、AOP,IOC就是通过依赖注 入把所有的BEAN交给SPRING管理;AOP实现的功能很多,比如:所有的服务层都要有事务,可以通过AOP拦截所有服务层的类,再通过IOC把事务 注入进去了。
SSH整合:
http://www.blogjava.net/action/archive/2007/08/28/140566.html
SSH在项目中的作用及原理
http://blog.csdn.net/dustin_ren/archive/2009/03/31/4038601.aspx
自己动手写spring
http://www.javaeye.com/topic/413449
posted @ 2010-05-27 23:14 豪情 阅读(3607) | 评论 (2)编辑 收藏
二、显示命令
1、显示数据库列表。
show databases;
2、显示库中的数据表:
use mysql;
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名 (字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名
posted @ 2010-05-27 10:08 豪情 阅读(174) | 评论 (0)编辑 收藏
一般添加在tomcat
x:\apache-tomcat-5.5.25\conf\server.xml
host标签内:
<Context path="url-a" docBase="url-b" debug="0"/>
这一个虚拟路径配置,path相当于http://localhost:8080/url-a
docBase是真实的开发目录
debug表示是否调试
posted @ 2010-05-27 10:06 豪情 阅读(166) | 评论 (0)编辑 收藏
ActionContext context = ActionContext.getContext();
Map request 
= (Map)context.get("request");
Map session 
= context.getSession();
Map application 
= context.getApplication();
request.put(
"s", str);
request.put(
"map", map);
request.put(
"greeting""欢迎访问jikey的Blog");

Struts 2深入详解

posted @ 2010-05-24 23:33 豪情 阅读(167) | 评论 (0)编辑 收藏
1.设置整个项目使用el表达式,需要在web.xml中加上 (控制一个项目)
< jsp-config >
< jsp-property-group >
< el-ignored >false < / el-ignored >
< /jsp-property-group >
< / jsp-config >

2.设置某个jsp页面使用el表达式,需要在jsp页面加上(控制单个页面)
<%@ page isELIgnored="false"%>

3.看你的web.xml文件中头的引用应该是 2.4.xsd

${requestScope.hello}
sdf
将JSP页面中的<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>改为<%@ taglib uri=http://java.sun.com/jstl/core_rt prefix="c"%>即可。

发现一个el表达式在JSP2.0中不起作用的问题。反复调试多次,发现是web.xml中出了问题。猜测是版本的问题,但只知道了如何修改,不知道为什么那样修改。

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version
="2.4">
2.4版本默认启用el表达式,如果使用2.5版本,默认el表达式是关闭的

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" version="2.5" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
>
那么对应2.5的web.xml -->  jsp页面里应该增加
<%@ page isELIgnored="false"%>

发现原因:一句话,凡是部署描述文件遵循Servlet2.4规范的WEB应用,EL表达式的计算默认是启用的,而未遵循的,则EL表达式的计算默认是禁用的。

所以解决方案还可以是:将web.xml中的DTD(文档类型定义)改问2.4的版本


posted @ 2010-05-24 15:31 豪情 阅读(1574) | 评论 (0)编辑 收藏
来自于:http://shaxianwei.javaeye.com/blog/650902
<span style="color: rgb(0, 128, 0);"><li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
<hr />
<li>set 设定adminName值(默认为 request 和 ActionContext): <s:set var="adminName" value="username"
/></li>

<li>set 从request取值: <s:property value="#request.adminName" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName" /></li>

<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword"%></li>
--%>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password"
scope
="session"/></li>
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>

<hr />

<%--<li>push:<s:set name="myDog" value="new com.bjsxt.struts2.ognl.Dog('oudy')"></s:set></li>
<li>
push:
<s:push value="#myDog">
    
<s:property value="name"/>
</s:push>
</li>
<li>push: <s:property value="name"/></li>
--%>

<hr />
<li>bean 定义bean,并使用 param来设定新的属性值:
    
<s:bean name="com.bjsxt.struts2.tags.Dog" >
        
<s:param name="name" value="'pp'"></s:param>
        
<s:property value="name"/>
       
    
</s:bean>
   
   
</li>

<li>bean 查看debug情况:
    
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
        
<s:param name="name" value="'oudy'"></s:param>
    
</s:bean>
    拿出值:
    
<s:property value="#myDog.name"/>
   
</li>
<hr />

<li>include _include1.html 包含静态英文文件
    
<s:include value="/_include1.html"></s:include>
</li>

<li>include _include2.html 包含静态中文文件
    
<s:include value="/_include2.html"></s:include>
</li>

<li>include _include1.html 包含静态英文文件,说明%用法
    
<s:set var="incPage" value="%{'/_include1.html'}" />
    
<s:include value="%{#incPage}"></s:include>
</li>


<hr />

<li>if elseif else:
    age = 
<s:property value="#parameters.age[0]" /> <br />
    
<s:set var="age" value="#parameters.age[0]" />
    
<s:if test="#age < 0">wrong age!</s:if>
    
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
    
<s:else>yeah!</s:else><br />
    
<s:if test="#parameters.aaa == null">null</s:if>
</li>

<hr />

<li>遍历集合:<br />
<s:iterator value="{1, 2, 3}" >
    
<s:property/> |
</s:iterator>
</li>
<li>自定义变量:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
    
<s:property value="#x.toUpperCase()"/> |
</s:iterator>
</li>
<li>使用status:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
    
<s:property/> |
    遍历过的元素总数:
<s:property value="#status.count"/> |
    遍历过的元素索引:
<s:property value="#status.index"/> |
    当前是偶数?:
<s:property value="#status.even"/> |
    当前是奇数?:
<s:property value="#status.odd"/> |
    是第一个元素吗?:
<s:property value="#status.first"/> |
    是最后一个元素吗?:
<s:property value="#status.last"/>
    
<br />
</s:iterator>

</li>

<li>
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" >
    
<s:property value="key"/> | <s:property value="value"/> <br />
</s:iterator>
</li>

<li>
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
    
<s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
</s:iterator>
</li>

<li>

<s:fielderror fieldName="fielderror.test" theme="simple"></s:fielderror>

</li></span>

posted @ 2010-05-21 23:51 豪情 阅读(273) | 评论 (0)编辑 收藏
来自于:http://www.blogjava.net/michaellee/archive/2009/07/14/286733.html
struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo:
s:iterator 标签有3个属性:
    value:被迭代的集合
    id   :指定集合里面的元素的id
    status 迭代元素的索引

1:jsp页面定义元素写法 数组或list

   1. 
<s:iterator value="{'1','2','3','4','5'}" id='number'>
   2.     
<s:property value='number'/>A
   3. 
</s:iterator>

打印结果为:  1A2A3A4A5A
上面的方法我在jsp文件里执行没有成功;这是另一种写法:
<%
      List list 
= new ArrayList();
      list.add(
"Max");
      list.add(
"Michael");
      list.add(
"Scott");
      list.add(
"Jeffry");
      list.add(
"Joe");
      request.setAttribute(
"names", list);
   
%>

<h3>Names:</h3>
  
<!--
            1、此处的空property 元素用于获得当前iterator的值
            2、status被设成stuts,在 iterator的里面就可以通过#stuts取得 IteratorStatus的对象。IteratorStatus类包含当前序号信息,
                                        如是否第一个或最后一个,是否为奇数序号。这些信息在我们做格式化的时候,显得非常有用。
   
-->
    
<ol>
        
<s:iterator value="#request.names" status="stuts">
            
<s:if test="#stuts.odd == true">
                
<li>White <s:property/></li>
            
</s:if>
            
<s:else>
                
<li style="background-color:blue"><s:property/></li>
            
</s:else>
        
</s:iterator>
    
</ol>

2: 索引的用法
如果指定了status,每次的迭代数据都有IteratorStatus的实例,它有以下几个方法
int getCount()返回当前迭代了几个元素
int getIndex()返回当前元素索引
boolean isEven()当然的索引是否偶数
boolean isFirst()当前是否第一个元素
boolean isLast()
boolean isOdd() 当前元素索引是否奇数

   1. 
<s:iterator value="{'a','b','c'}" id='char' status='st'>
   2.     
<s:if test="#st.Even">
   3.         现在的索引是奇数为:
<s:property value='#st.index'/>
   4.     
</s:if>
   5.     当前元素值:
<s:property value='char'/>
   6. 
</s:iterator>

3:遍历map
value可以直接定义为:

   1. value="#{"1":"a","2":"b"}"

每个元素以都好隔开。元素之间的key和value 冒号隔开
value 也可以是数据栈里面的java.util.Map对象
遍历写法如下:

   1. 
<s:iterator value="map" id="id" status="st">
   2.      key : 
<s:property value='key'/>
   3.      value:
<s:property vlaue='value'/>
   4. 
</s:iterator>

当然key 和value 都可以使java 的 Object

3:遍历数据栈.简单的List类,
List
<Attr> 
class Attr{String attrName;String getAttrName(){return "123";}}

   1. 
<s:iterator value="label" id="id">
   2.     
<s:property value="#id.attrName" />
   3. 
</s:iterator>

当然 value 还可以写成 value="%{label}" label 可以有.操作
label的属性List 可以写成value="%{label.list}"  相当于:getLabel().getList();

4:遍历2个list;
List
<AttrName> attrN {color,size,style}
List
<AttrValue> attrV {red,20,gay}
这2个 list的元素是一一对应的,一个attrN对应一个attrV

   1. 
<s:iterator value="%{attrN }" id="id"   status="status">
   2.  index    is : 
<s:property value='status.index'/>
   3.  attrName is : 
<s:property value='id'/> or <s:property value='%{id}'/> 
   4.  attrName is : 
<s:property value='%{attrV[#status.index]}'/>
   5. 
</s:iterator>

posted @ 2010-05-21 23:49 豪情 阅读(851) | 评论 (0)编辑 收藏
<filter-mapping>
    
<filter-name>struts2</filter-name>
    
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
   
posted @ 2010-05-21 23:47 豪情 阅读(1175) | 评论 (1)编辑 收藏
<package name="tutorial" extends="struts-default">
        
<action name="HelloWorld" class="tutorial.HelloWorld">
            
<result>HelloWorld.jsp</result>
        
</action>
    
</package>
1、包名:tutorial;
2、该包继承了父包“struts- default”;
3、该包有一个Action类:tutorial.HelloWorld,其名称为“HelloWorld”,其转向的视图为:HelloWorld.jsp
posted @ 2010-05-21 23:43 豪情 阅读(192) | 评论 (0)编辑 收藏
<!-- 指定Web应用的默认编码集,相当于调用 HttpServletRequest的 setCharacterEncoding方法 -->  
<constant name="struts.i18n.encoding" value="UTF-8" />  
<!--   
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。  
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。  
 
-->  
<constant name="struts.action.extension" value="do" />  
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->  
<constant name="struts.serve.static.browserCache " value="false" />  
<!-- 当 struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->  
<constant name="struts.configuration.xml.reload" value="true" />  
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->  
<constant name="struts.devMode" value="true" />  
<!-- 默认的视图主题 -->  
<constant name="struts.ui.theme" value="simple" />  
<!-- 该属性指定Struts 2中的action由Spring容器创建  -->  
<constant name="struts.objectFactory" value="spring" /> 

来自于:http://wing123.javaeye.com/blog/352596

posted @ 2010-05-21 23:35 豪情 阅读(309) | 评论 (0)编辑 收藏

来自于:http://shaxianwei.javaeye.com/blog/650902

<span style="color: rgb(0, 128, 0);"><li>property: <s:property value="username"/> </li>
        
<li>property 取值为字符串: <s:property value="'username'"/> </li>
        
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
        
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
        
<hr />
        
<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username"
/></li>
       
        
<li>set 从request取值: <s:property value="#request.adminName" /></li>
        
<li>set 从ActionContext取值: <s:property value="#adminName" /></li>
       
        
<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
        
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword"%></li>
        
--%>
        
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password"
scope
="session"/></li>
        
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
        
<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
       
        
<hr />
       
        
<%--<li>push:<s:set name="myDog" value="new com.bjsxt.struts2.ognl.Dog('oudy')"></s:set></li>
        
<li>
        push:
<s:push value="#myDog">
            
<s:property value="name"/>
        
</s:push>
        
</li>
        
<li>push: <s:property value="name"/></li>
        
--%>
       
        
<hr />
        
<li>bean 定义bean,并使用param来设定新的属性值:
            
<s:bean name="com.bjsxt.struts2.tags.Dog" >
                
<s:param name="name" value="'pp'"></s:param>
                
<s:property value="name"/>
               
            
</s:bean>
           
           
        
</li>
       
        
<li>bean 查看debug情况:
            
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
                
<s:param name="name" value="'oudy'"></s:param>
            
</s:bean>
            拿出值:
            
<s:property value="#myDog.name"/>
           
        
</li>
        
<hr />
       
        
<li>include _include1.html 包含静态英文文件
            
<s:include value="/_include1.html"></s:include>
        
</li>
       
        
<li>include _include2.html 包含静态中文文件
            
<s:include value="/_include2.html"></s:include>
        
</li>
       
        
<li>include _include1.html 包含静态英文文件,说明%用法
            
<s:set var="incPage" value="%{'/_include1.html'}" />
            
<s:include value="%{#incPage}"></s:include>
        
</li>
       
       
        
<hr />
       
        
<li>if elseif else:
            age 
= <s:property value="#parameters.age[0]" /> <br />
            
<s:set var="age" value="#parameters.age[0]" />
            
<s:if test="#age < 0">wrong age!</s:if>
            
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
            
<s:else>yeah!</s:else><br />
            
<s:if test="#parameters.aaa == null">null</s:if>
        
</li>
       
        
<hr />
       
        
<li>遍历集合:<br />
        
<s:iterator value="{1, 2, 3}" >
            
<s:property/> |
        
</s:iterator>
        
</li>
        
<li>自定义变量:<br />
        
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
            
<s:property value="#x.toUpperCase()"/> |
        
</s:iterator>
        
</li>
        
<li>使用status:<br />
        
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
            
<s:property/> |
            遍历过的元素总数:
<s:property value="#status.count"/> |
            遍历过的元素索引:
<s:property value="#status.index"/> |
            当前是偶数?:
<s:property value="#status.even"/> |
            当前是奇数?:
<s:property value="#status.odd"/> |
            是第一个元素吗?:
<s:property value="#status.first"/> |
            是最后一个元素吗?:
<s:property value="#status.last"/>
            
<br />
        
</s:iterator>
       
        
</li>
       
        
<li>
        
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" >
            
<s:property value="key"/> | <s:property value="value"/> <br />
        
</s:iterator>
        
</li>
       
        
<li>
        
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
            
<s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
        
</s:iterator>
        
</li>
       
        
<li>
       
        
<s:fielderror fieldName="fielderror.test" theme="simple"></s:fielderror>
       
        
</li></span>
posted @ 2010-05-21 22:56 豪情 阅读(243) | 评论 (0)编辑 收藏