加拿大家园论坛

和我一起刷新J2EE,做个新IT

原文链接:https://forum.iask.ca/threads/34607/

uvov : 2005-11-24#1
接受前辈大虾的指点,我要刷新我的IT技术,有兴趣的筒子们和我一起来啊.

刷新内容大纲:
HTML/CSS/Struts Tag/JSF Tag/Applet/WEB Basic/Servlet/Jsp
/WEB File Structure/Web.xml/MVC/Struts framework/Jsf framework
/WebService/Spring framework/Ejb Architecture/Message Quene
/JMail/Jasper/Jdbc/Database/Hibernate/JDom/eclipse/wsad/jbuilder
/Linux/Tomcat/Websphere/WebLogic/JBoss/Ant/JUnit/CVS
/ClareCase/Design Pattern

uvov : 2005-11-24#2
J2EE应用最基本的是开发工具,现在比较Popular的是Eclipse,这个我已经用多年了,不算什么问题了.

luhui : 2005-11-24#3
不懂IT,不过帮你顶一下。实现零的突破。

admin : 2005-11-24#4
这几年,俺也在用Eclipse,很高兴和你交流:)

wyman : 2005-11-24#5
不懂过来瞧瞧~~~

uvov : 2005-11-25#6
首先开始先学习CVS,选择这个开始是因为我对Eclipse已经很熟练,但一直没有使用CVS来管理,原因很简单,所有代码都自己维护和使用,没有团队。我是一个独立软件人。

下载cvsnt很简单,按网上提供的资料很快就安好了。我收藏了。
http://download.uvov.com/cvsnt-2.5.03.2151.msi

首先配置了Repository,用Eclipse得“小组-共享”就能完成发布,倒也简单。

我犯了个错误:我直接用原来存在的用户访问,不能正常工作。后来重新增加了个用户,用新用户就ok了。

cvsnt中Server Settings中有Encryption和Compression两个参数,应该是加密和压缩。设置加密方式后,提示此协议(PServer)不支持。先不试验了。

uvov : 2005-11-25#7
CVS和Delphi

在我的程序开发经历中,最喜欢的C/S工具就是Delphi了,学习CVS后,我要把我的Delphi应用都转到了CVS管理了。在我的Java WEB应用中,也有Delphi的影子,是用来开发ActiveX,实现HTML页做不到的东西。

能否找到一个在Delphi7中CVS插件,让我把Delphi变成和Eclipse一样地使用CVS.

Google了一下,发现了BorCVS, 下载未果,看日期也有多年没有维护了,放弃!

看来只能用通用的WinCVS了。

收藏WinCVS: http://download.uvov.com/WinCvs2_0_2-4.zip

运行时还需要python,收藏为: http://download.uvov.com/python-2.4.2.msi

还找到一个说明文件,收藏为:http://download.uvov.com/WinCvsGuide.zip

gangnet : 2005-11-25#8
怎么个刷新法?
我和你一起刷!

uvov : 2005-11-25#9
我在针对高人指点的内容,对如下内容进行复习和学习:
HTML/CSS/Struts Tag/JSF Tag/Applet/WEB Basic/Servlet/Jsp
/WEB File Structure/Web.xml/MVC/Struts framework/Jsf framework
/WebService/Spring framework/Ejb Architecture/Message Quene
/JMail/Jasper/Jdbc/Database/Hibernate/JDom/eclipse/wsad/jbuilder
/Linux/Tomcat/Websphere/WebLogic/JBoss/Ant/JUnit/CVS
/ClareCase/Design Pattern
现在在巩固CVS呢,之后是hibernate,一点一点来

uvov : 2005-11-25#10
WinCVS

安装WinCVS没问题. 第一次运行,提示我需要Python 2.1,还有地址,很快就下载安装了。

运行之,看着菜单也蛮复杂的。好在我用eclipse连接成功有了经验,我不怀疑我的服务器安装有问题,看说明书吧。

当然第1件事是和我的cvs服务器连接上。和说明书不同的是,连接服务器的界面说是was removed. 好象是说只要在import或extract时指定CVSROOT即可。

于是我在工作目录中先来来几个Delphi的包,准备测试。CVSROOT串是关键了,可这个串怎么个写法?参考一下我的Eclipse吧,记得在Eclipse中见过这个串。查到了server:user@host:reposity. 再试验一下login. 格式总算对了,可我没找到如何share a module啊,原来叫import module啊,以为是从服务器下来叫import呢。

一口气把我用到的几个公用包都导进去了,包括EHLIB26\ENVISION\DREAM\IP4000\CURRENCY和我自己的COMMON7. import时WinCVS先把所有的扩展类型的处理动作让你选择,我只把.dcu改为ignore。

我重复import时,信息窗口提示已经存在了。

先用了Eclipse,再用这个WinCVS感觉不直观的很。但也没有办法。但WinCVS更通用啊.

使WinCVS倒没有什么大问题,Login后,Import就可发布一个Module,CheckOut就可获得服务器的Module. 只Import是看不到文件的版本号,很奇怪,因为说明书的图片上有啊,后来checkout下来一个Module才看到版本号。

发布时不希望把没有用的东西也送服务器,每个Module都需要指定什么能上什么不能上,好麻烦的。反复操作后发现工作目录下的.cvsignore文件,把我需要忽略的*.~*/*.dcu加入进去,解决了不少问题。

好,估计我应该可无障碍使用了。继续把所有相关的东东都发布到CVS中去。

uvov : 2005-11-25#11
理解Hibernate

早听说Hibernate了,但看了看工作原理,就Pass了。理由不外乎是大数据量得低效率。我理解的Hibernate是,Hibernate自己解析SQL(称为HQL),相当于实现了数据库的SQL语言解释层。当然,最后最后应该还是翻译成数据库SQL语句,把结果集封装到对应得Object对象中。所以返回的结果是个List。如果查询的结果对象肯定要被使用到,则很有效率,如果只为了分页,肯定不怎么样。

不过,仔细理解地看,Hibernate在处理业务对象角度还是很有创意的,把对象化的东西简化了很多,更便于思考了。我想到的是让Hibernate和JDBC访问配合使用。问题是,这样的话,Hibernate的缓冲机制会不会导致Hibernate的数据是过期的?

不解1: Hibernate的对象数据什么时候过期呢?
不解2: 如果有100万数据,From Cat as cat语句是否肯定有100万个实体对象产生?当然如果真这样,差不多死定了,至少效率回极其慢。但是否必须回避这样的用法?
不解3: 几个Hibernate访问1个数据库,能否导致其中一个Hibernate的数据是过期的?

但是,抛弃常规的JDBC考虑惯性,Hibernate是不错的。我们要努力理解之。

首先,Hibernate非常适合于手工专用编程。常规的JDBC或ODBC应用, 我们不会为每个表结构建立一个实际对象, 至多只是一个通用的集合. 而手工编程,或者是EJB模式,每个表行就是一个实体。一个应用就是多个实体连同他们的方法,所以从后台角度来看,业务部分就是实体的方法扩展,逻辑关系也是对象的相互调用。Hibernate做到的就是实体间的SQL,并透明处理了对数据库的存储。因为hibernate要自动实现数据的存储,所以你必须很好地定义出表的关系,以便让hibernate知道什么数据变化后如何产生SQL语句。hibernate让你不再使用insert/update/delete了,而且便于今后的系统扩充,因为对某个对象的增强只是与这个对象和操作这个对象的对象们有关,改动很小。其实,即使在分页技术中,我们需要的只是其中一组数据,仍然采用跳过前面若干,定位到指定记录上,也许效率也不错。Hibernate继承jdbc,并统一了JDBC规范。这样说应该是合理的。Hibernate实现的是面向对象的SQL,其查询和用JDBC查询一样,但更通用。效率高低应该在自己的处理手段了。但对通用模块的开发可能不是很好的。

参考 http://forum.javaeye.com/viewtopic.php?t=10403&postdays=0&postorder=asc&start=0 的 “为Hibernate做大数据量测试的一些感受”一文,摘录如下,以便日后参考:
1) 在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session. Evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象。
2) 对大数据量查询时,慎用list()或者iterator()返回查询结果,
1. 使用List()返回结果时,Hibernate会所有查询结果初始化为持久化对象,结果集较大时,会占用很多的处理时间。
2. 而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花费较多的时间。当结果集较大,但是含有较大量相同的数据,或者结果集不是全部都会使用时,使用iterator()才有优势。
3. 对于大数据量,使用qry.scroll()可以得到较好的处理速度以及性能。而且直接对结果集向前向后滚动。
3) 对于关联操作,Hibernate虽然可以表达复杂的数据关系,但请慎用,使数据关系较为简单时会得到较好的效率,特别是较深层次的关联时,性能会很差。
4) 对含有关联的PO(持久化对象)时,若default-cascade="all"或者 “save-update”,新增PO时,请注意对PO中的集合的赋值操作,因为有可能使得多执行一次update操作。
5) 在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时方会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。
6) 对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。
7) Hibernate是以JDBC为基础,但是Hibernate是对JDBC的优化,其中使用Hibernate的缓冲机制会使性能提升,如使用二级缓存以及查询缓存,若命中率较高明,性能会是到大幅提升。
Hibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。

uvov : 2005-11-25#12
Hibernate会用到cglib...

Hibernate要用到CGLIB库,http://cglib.sourceforge.net/, cglib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。

import net.sf.cglib.*; 是常用的格式,在hibernate 3.0包含的是cglib-2.1.jar. 看来cglib也是个了不起的家伙,我先知道hibernate需要就是了.

点点 : 2005-11-25#13
晕,LZ厉害,PFPF。

uvov : 2005-11-25#14
也算督促我自己学习了.

uvov : 2005-11-25#15
Hibernate需要dom4j包

dom4j-1.5.2.jar是hibernate需要的另外一个包,主要用于解析xml. 解析XML当然需要必要的包了, 能不能不用xml也能使用hibernate? 比如我可以通过java代码建立. 这肯定是个大问题.

点点 : 2005-11-25#16
感觉象看天书~~~~~~~~倒倒倒。

uvov : 2005-11-25#17
Hibernate的基本用法

虽然XML已经大行其道,但我就是不喜欢。虽然通过修改XML配置文件是先进的,可太灵活导致太复杂,看的人晕晕的。相比而言,x.properties文件我还是欢迎的,所以我的配置文件多为此。而动态设置配置参数一直是我的一大喜好,我可不喜欢那么多文件.

Configuration cfg=new Configuration();
cfg.setProperty("show_sql","true");
cfg.setProperty("dialect","org.hibernate.dialect.MysqlDialect");
cfg.setProperty("connection.driver_class","com.mysql.jdbc.Driver");
cfg.setProperty("connection.url","jdbc:mysql://localhost/HibernateTest");
cfg.setProperty("connection.username","caterpillar");
cfg.setProperty("connection.password","123456");
SessionFactory sf=cfg.buildSessionFactory();
Session ss=sf.openSession();
Transaction tx= ss.beginTransaction();
ss.save(obj);
tx.commit();
ss.close();

这是基本的访问hibernate的方法,把factory全局化,而Session局部话,就可实现用Hibernate对数据库进行访问了。

设置cfg的connection.datasource可使用dbcp配置的连接池
cfg.setPropeties("connection.datasource","java:comp/env/jdbc/dbname");

cfg.addXML可以把MappingXML作为一个字符串来动态定义,查了半天就是要这个方法。

好了,有了这些基本手段,Hibernate得应用只是时间问题。

uvov : 2005-11-25#18
Spring是什么?

我还没有一点概念。

哈哈,Spring竟然是和EJB3.0可比较的东西。
下面的文章给了Spring一个基本的介绍:
http://forum.hibernate.org.cn/viewtopic.php?t=4505&postdays=0&postorder=asc&start=0

要确实理解Spring肯定得看Spring的包和相关的Demo了.

Spring首先负责管理Bean,好象还有Bean之间的关系?其次SpringMVC. org.springframework.web.servlet.* 和 org.springframework.web.servlet.mvc.* 是主要的包空间
Spring通过修改web.xml文件配置,把Spring在WEB启动时加入。

最简单的方式是建立一个Servlet
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
以上应用需要包spring.jar commons-logging.jar支持

另外的补充方式是让Spring读入/WEB-INF/applicationContext.xml配置文件
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

applicationContext.xml就是Spring规范的Bean组装清单。

下面是为Log4j提供的参数
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>petstore.root</param-value>
</context-param>

需要Struts动作时,需要如下配置,对应struts-config.xml,但和Spring不重复使用:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>

需要Remoting时,需要如下配置,对应remoting-servlet.xml:
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>

需要Web-Service时,需要如下配置,对应server-config.wsdd:
<servlet>
<servlet-name>axis</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>

初步只能了解这些了。

uvov : 2005-11-25#19

gangnet : 2005-11-25#20

uvov : 2005-11-25#21

gangnet : 2005-11-25#22
uvov 说:

页面提示:

HTTP Status 404 - /pring-framework-1.2.5-with-dependencies.zip

type Status report
message /pring-framework-1.2.5-with-dependencies.zip
description The requested resource (/pring-framework-1.2.5-with-dependencies.zip) is not available.
Apache Tomcat/5.0.28

uvov : 2005-11-25#23
了解Struts

几年前我了解过Struts,出于个人编程习惯的限制,对这样一个必须手工一点一点做(印象是这样)的规范,没有很好去理解。昨天了解了些Hibernate和Spring,尤其Spring也提供了MVC模式,所以,研究Struts也有助于理解Spring吧。

下面是介绍mvc机理的文章:
http://www-128.ibm.com/developerworks/cn/java/l-struts-mvc/index.html

在Struts中Controller功能由图中ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。

MVC系统中的Model部分从概念上可以分为两类--系统的内部状态,和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用像Entity EJB 和 Session EJB等组件来实现系统状态。Struts建议在实现时把"做什么"(Action)和"如何做"(业务逻辑)分离。这样可以实现业务逻辑的重用。

Struts应用中的View部分是通过JSP技术实现的。Struts提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。

uvov : 2005-11-26#24
新Struts---shale

Struts的站点上推出了2个FrameWork,原来的Struts和新的基于Components的Shale框架,看来直接研究shale得了,顺便可以开始接触JSF。阅读http://struts.apache.org/

点点 : 2005-11-26#25
还是看不懂~~~~~~~~~

uvov : 2005-11-26#26
看来只能自言自语了..., 其实研究这些东西也得读英语啊,就算我在学英语吧

uvov : 2005-11-26#27
JSF 和 shale

通过简单访问struts,知道它依赖了另外一个包包JSF(Java Server Faces). 简单Google一下JSF的介绍,介绍说的不是很清楚,感觉是类似ms.net的后台对象交互的事件机制。而shale却要依赖此对象发展出新的Struts机制。shale是如此的弱小,看下载文件都是本月发布的,无Release存在。迷茫。

31415926 : 2005-11-26#28
为什么不用jbuilder作为开发工具呢

uvov : 2005-11-26#29
JBuilder虽然很好,但是需要Money的,不象国内D版可随便用,而Eclipse是Free的,一旦会用也是爱不释手。

uvov : 2005-11-26#30
观察范例学习Spring

先学习最简单的。samples下有个webapp-minimal的应该是最小的Spring了。复制到Tomcat的Webapps下,开始工作吧。

没那么简单啊。异常。提示说Servlet example is currently unavailable。看来Web-inf下的example-servlet.xml不是随便的名字啊,改。还不对。不得不看内容了。index.jsp直接跳转到example\test,example是servlet的名字。对了,XXX-servlet.xml的文件名是和web.xml中定义的servlet有关,每个servlet都对应一个此servlet对应的xxx-servlet.xml作为此servlet的配置文件。

再看servlet,通过<Beans>定义每个<bean name=/sub>,这个/sub就是此servlet下对应的一个动词,范例指定一个class="example.ExampleController" 这个Control肯定是MVC中的C了。本例中只指定了example这个servlet下的一个动作/test.

可我没看到example.ExampleController的定义啊,虽然xml中的注释说很简单就可实现,但我是菜鸟啊。

readme.txt中说我需要 spring.jar commons-logging.jar servlet-api.jar,我就把他们放在Tomcat/Common/lib下吧。

看commons-logging.jar的Package说明,是包含了log4j的东西,以后我也用它作为Log规范。

找到example.ExampleController了,只提供了src,没有形成jar保存到lib下,自己来吧。

启动eclipse创建个的Project,I named mytest. 增加编译路径包含spring.jar,创建个对象SpringTest.java. 对了,必须吧servlet-api.jar加入路径,否则编译不正确。

最后的代码是:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.servlet.*;
import org.springframework.web.servlet.mvc.*;

public class SpringTestControl implements Controller
{
public ModelAndView handleRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{

return new ModelAndView("/test.jsp");
}
}
我没有用包,改名字也是为了后面更改配置参数,免得被误导。

倒出为一个jar,保存到web-inf\lib\下

下面继续修改配置文件:只修改example-servlet对应的Class名称,应该没问题了吧。

这次看样子正确了,因为Tomcat提示了很多信息:
FrameworkServlet 'example': initialization started.
//Servlet开始初始化

org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Loading XML bean definitions from ServletContext resource [/WEB-INF/example-servlet.xml]
//根据Servlet名称读入BeanDefinitions

Bean factory for application context [WebApplicationContext for namespace 'example-servlet']: org.springframework.beans.factory.support.DefaultListableBean Factory defining beans [/test]; root of BeanFactory hierarchy
org.springframework.context.support.AbstractApplicationContext refresh
1 beans defined in application context [WebApplicationContext for namespace 'example-servlet']
//通过Servlet读入Bean

org.springframework.core.CollectionFactory <clinit>
JDK 1.4+ collections available
org.springframework.core.CollectionFactory <clinit>
Commons Collections 3.x available
org.springframework.context.support.AbstractApplicationContext initMessageSource
//象是检测容器

Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@1cb7a1]
//看来messageSource是一个可选得参数,是语言集?

org.springframework.context.support.AbstractApplicationContext initApplicationEventMulticaster
Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@b20352]
//applicationEventMulticaster肯定是一个标记来指定Application事件监听?

org.springframework.ui.context.support.UiApplicationContextUtils initThemeSource
Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.ResourceBundleThemeSource@1cfb802]
//themeSource是表示皮肤风格吗?

org.springframework.beans.factory.support.DefaultListableBeanFactory
Pre-instantiating singletons in factory [org.springframework.beans.factory .support.DefaultListableBeanFactory defining beans [/test]; root of BeanFactory hierarchy]
org.springframework.web.servlet.FrameworkServlet initWebApplicationContext
Using context class [org.springframework.web.context.support.XmlWebApplicationContext] for servlet 'example'
org.springframework.web.servlet.DispatcherServlet initMultipartResolver
//初始化上下文

Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided
//需要指定multipartResolver才能处理multi-part? 看来文件上传也是问题啊

org.springframework.web.servlet.DispatcherServlet initLocale Resolver
Unable to locate LocaleResolver with name 'localeResolver': using default [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@b51c29]
//localeResover才是本地语言的指定吧,那上文的messageSource是指定位置吗?

org.springframework.web.servlet.DispatcherServlet initThemeResolver
Unable to locate ThemeResolver with name 'themeResolver': using default [org.springframework.web.servlet.theme.FixedThemeResolver@354749]
//解决ThemeResover

org.springframework.web.servlet.DispatcherServlet initHandlerMappings
No HandlerMappings found in servlet 'example': using default
//HandleMappings是个什么映射吧,估计也得在Servlet.xml中定义

org.springframework.web.servlet.DispatcherServlet initHandlerAdapters
No HandlerAdapters found in servlet 'example': using default
//Adapter是又一个概念,还需要理解. 是MVC中的M?

org.springframework.web.servlet.DispatcherServlet initViewResolvers
No ViewResolvers found in servlet 'example': using default
//ViewSolver是V了吧

org.springframework.web.servlet.FrameworkServlet initServletBean
FrameworkServlet 'example': initialization completed in 718 ms
//才完成一个Servlet的配置过程

org.springframework.web.servlet.HttpServletBean init
Servlet 'example' configured successfully
//Servlet能工作了。

看看是否有预期的结果。还好,没有错误。但是编译jsp也消耗不少时间哦。

总结:剖析此Demo掌握了基本的Spring流程,就是通过Web.xml定义Servlet,通过servlet.xml定义Servlet中的Bean,现在知道的是实现Control接口的Bean. Control接口中只有handleRequest方法,返回一个ModalAndView对象,ModalAndView对象,顾名思义应该是转移到一个Modal或View的对象。这样,MVC都出现了。

uvov : 2005-11-27#31
观察范例学习Spring-II

学习了minimal后,选择了tiles例子。看这里的servlet配置复杂多了。bean不算复杂但继承了标准的对象实现。按我的方式,先剖析和猜测文件的定义,然后再运行,这样比较主动,否则就蒙了。

web.xml没有新鲜的,只是映射了所有的*.html对应tiles这个Servlet.

tiles-servlet.xml定义了很多bean. classes目录下有个messages.properties的文件,defs下有个definations.xml,jsp下有5个jsp文件,src中有3个对象NewsFeedConfiguar/NewsFeedController/NewsItem.

再看tiles-servlet,如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
//这就是学习minimal时发现的问题,messageSource定义,原来是提供全局变量的。该范例提供了news.from等变量,后面我得留意怎么使用这些变量。
//class肯定是解决此类对象的解决方案提供者,而basename参数就是提供参数文件的名称了。此文件是ASC编码的,如何能支持UTF8格式呢,以后需要考证。
//进一步Google了一下messageSource,说Spring中提供了两个MessageSource接口的实现,即ResourceBundleMessageSource和ReloadableResourceBundleMessageSource,后者提供了无需重启即可重新加载配置信息的特性
//还说,我们指定了一个配置名messages,那么我们定义的资源文件命名为: messages_zh_CN.properties messages_en_US.properties 就实现国际化的资源定义。
//顺便也获得访问messages的方法,但不是很爽,难道我需要多次指定messages.properties文件?:
//ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");
//String msg = ctx.getMessage("userinfo", arg, Locale.US);

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles.TilesJstlView"/>
</bean>
//viewResolver是提供Spring向用户提供展示自己风格的View的对象
//默认的viewResolver就是org.springframework.web.servlet.view.InternalResourceViewResolve
//另外下面2参数表示目录前缀和文件后缀:
//<property name="prefix"><value>/WEB-INF/jsp/</value></property>
//<property name="suffix"><value>.jsp</value></property>
//另外的viewResolver是org.springframework.web.servlet.view.ResourceBundleViewResolver,有basement和defaultParentView参数
//参数viewClass肯定就是具体的view对象了,应该是表现手段吧:
//org.springframework.web.servlet.view.document.AbstractExcelView提供了一个缺省的Excel格式的View
//org.springframework.web.servlet.view.document.AbstractPdfView提供了一个缺省的pdf格式的View
//org.springframework.web.servlet.view.JstlView是缺省的吧
//本范例中的org.springframework.web.servlet.view.tiles.TilesJstlView肯定是实现平铺的View

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/defs/definitions.xml</value>
</list>
</property>
</bean>
//tilesCongiurer肯定是针对上述tiles类别的View而提供的,上述提供的也是标准的Tile模式。definitions.xml肯定是设置平铺布局的内容分布和每个窗口的意义的。

<bean id="feedConfigurer" class="org.springframework.samples.tiles.NewsFeedConfigurer">
<property name="feeds">
<props>
<prop key="theserverside">http://www.theserverside.com/rss/theserverside-1.0.rdf</prop>
<prop key="slashdot">http://slashdot.org/slashdot.rss</prop>
<prop key="javablogs">http://www.javablogs.com/ViewDaysBlogs.action?view=rss</prop>
</props>
</property>
</bean>
//是src中定义的普通类别。对比代码,没有上述的3个prop啊。原来是feeds直接对应一个Properties对象啊,Spring这样用倒挺有意思的。看来这个就是Spring的组件组装模式了!

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*.html">viewController</prop>
</props>
</property>
</bean>
//urlMapping肯定又是一个约定,看来是设定url或Controller的对应关系了。但web.xml不是定义了url映射了吗?
//看样子是servlet内的匹配模式,viewController就在下面。

<bean id="viewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
//一个很好的Blog参考:http://blog.itpub.net/post/1476/34839

uvov : 2005-11-27#32
关于设计模式的一本好书

正好在刷新目录里有Design Pattern的要求,又在阅读"天堂的阶梯"的Blog文章"评 Head First Design Pattern "对此书评价极好(http://blog.itpub.net/post/1476/37429),忍不住先下载收藏,容日后慢慢消化. http://download.uvov.com/Head First Design Patterns.pdf

uvov : 2005-11-27#33
观察范例学习Spring-II(2)

进一步理解Tiles范例,我必须得继续转换为自己的东西。想在前面的例子基础上把tiles加入,以增强理解。

把原来的samples.NewsFeedConfigurer改为了SpringTilesConfigurer. 这是个基本的JavaBean. 有一个feeds属性,对应一个setFeeds方法,这就是再servlet配置中指定的那个对象吧。

原来的samples.NewsFeedController改为了StringTilesController. 发现此对象继承的对象ComponentControllerSupport. 而此对象是Struts的对象,查找Spring提供的Struts包加入到类路径。

发现还需要org.dom4j包,再把dom4j-1.5.jar加入路径。好了,其它错误是我改名字造成的,好排除。调试通过。回头再理解内容。

ComponentControllerSupport顾名思义是基于组件技术的Controller父级实现。先前看Struts-shale时提到过是基于Component技术,那么Struts已经用到了?姑且如此理解吧。

Component的接口方法doPerform(ComponentContext,HttpServletRequest, HttpServletResponse)引出一个组件上下文对象ComponentContext.

getApplicationContext是ComponentControllerSupport的方法获得当前应用的上下文,应该就是当前Control所在的Servlet提供的XML环境。通过getApplicationContext().getBean("bean")获得当前的bean对象,这大概就是Spring访问配置对象的手段吧。

没明白的是ComponentContext.getAttribute获得的属性是从哪里来的?难道是Servlet的参数?看上下问应该是。但怎么送过去的,需要下文分解。

NewsReader是什么东西?也是标准对象?哦,下问有定义。ComponentContext功能很强大啊,可以存储很多东西,getAttribute和putAttribute方法可存储任何事情。

private static class的用法, 还可以这样用啊,直接定义局部Class. 以后一定用上!

后面的内容是一个处理News的具体url访问,和本范例无什么关系了。

但前面关于组件上下文的参数传递,还没有懂.看看运行起来是否有助于理解吧.

jqhuang : 2005-11-27#34
我在辞职前用了不到三个月的struts+hibernate+spring,建议楼主下载一个appfuse,是一个开源的项目,可以看看代码,会有一些收获.

uvov : 2005-11-27#35
jqhuang 说:
我在辞职前用了不到三个月的struts+hibernate+spring,建议楼主下载一个appfuse,是一个开源的项目,可以看看代码,会有一些收获.
非常感谢.

uvov : 2005-11-27#36
观察范例学习Spring-II(3)

复制到我的webapps空间,修改参数适应我的修改。tiles-servlet.xml和三个目录defs/classes/jsp复制过来即可。修改web.xml,加入对tiles的Servlet支持:复制servlet定义和servlet-maping定义,这里影射的是*.html。另外入口也修改为访问index.html,我就不修改了,测试时加上访问的servlet路径也就是了,应该一样的。

好了,看看运行吧。

修改了tiles-servlet.xml中修改过的对象名称。提示org/apache/commons/degister/Degister没有找到。看来缺少一个负责签名的commons包. 加入commons-digester包,根本就起不来了。解决了,把Jarkata-commons下的所有包都加近来就没错误了。

但运行有问题,访问index.html总是提示找不到mapping,看web.xml指定了url-pattern,tiles-servlet.xml也指定了/*.html对应tiles,why? 把tiles-servlet.xml映射修改为/tiles/*.html,这时候提示变了,说javax/servlet/jsp/jstl/fmt/LocalizationContext没定义,也不知道这个家伙在哪个包里,干脆把spring-*.jar都加入吧,没有任何作用。找吧,从lib/readme.txt中看到j2ee目录下有jstl.jar,加入。still failed!

goo了论坛查找可能的解释。终于发现说需要standard.jar, 再看readme.txt确实说需要此包,加入。To my god, Pass! 但还有问题,是我修改了对象的名字,好象在jsp中有引用。又发现还需要jaxen-1.1-beta-4.jar,jaxen是一个用Java开发的XPath引擎,没办法,加入吧。

感谢上帝,正确转起来了。但不能容忍的是,就算第一次需要编译jsp,可重新访问为什么还怎么慢?可能是其中访问了远程的news吧,但愿不是需要这么慢。

小结:
1、为了顺利运转tiles,加入了很多包:Spring/struts/commons/jstl/dom4j/jaxen。可见开源组织用到的东西真的很杂。
2、范例不正确,首先web.xml中,servlet-maping指出的*.html匹配不能正常工作,而写为/tiles/*.html也不工作,说XML异常,最后改为/tiles/*,采用和minimal范例相同的方式,才正常。
3、main.jsp中的styles.css应该是/styles.css才能工作,否则被tiles捕获。

uvov : 2005-11-28#37
观察范例学习Spring-II(4)--理解tiles中的Definations

tiles转起来了,看起来不错。jsp文件也都不复杂,但definitions.xml的语义还不好理解。

Goo出一个Tiles组件的基本使用方法,http://tech.ccidnet.com/art/1110/20041125/181701_1.html。看了看,说的也不清楚(我还理解不了)。

仔细观察definations.xml,发现index/about/contact三个菜单都继承template,template通过page参数指向main.jsp,而main.jsp是个整体框架页。这就是为什么三个菜单的动作都能把菜单和新闻带出来的原因吧。

type=definition,大概是说这个项目依赖另外的difination定义吧。

news作为另外一个根级的defination,还指定了ControllerClass参数。

这里的put是设置变量吧,extends肯定是继承了;type=page表示这个东西是个jsp页

SourceName在这里作为一个参数被传递给componentContext中了。

另外的Tiles说明文件,http://www.chinaitpower.com/A/2004-08-20/144901.html

理解和使用都还算不复杂,用时照猫画虎即可。

uvov : 2005-11-29#38
剖析范例学习Spring-III(1)--进入PetStore

没有太多选择,实际还是选择了最简单的两个。剩下的几个范例好象都很复杂,没有办法,学习总得涉及复杂的内容啊----开始进入PetStore吧。

PetStore据说是J2EE的几乎是标准的范例,为网络客户提供宠物信息浏览、网上订单和管理等功能的网上宠物店。看配置文件组成很复杂啊。所以,打算先转起来,然后再细研究。

所有Spring范例都没有提供可直接转起来的得程序组成,所以,首先第一步把Src编译成jar。我把PetStore送入mytest项目中和前面2个范例的代码合在一起了。按我的习惯把长长的名字只保留PetStore后面的部分。所以改名字是主要工作。排除错误也是个工夫。最后我把axis.jar/common-logging.jar/jaxrpc.jar/saaj.jar/wsdl4j.jar加入后,编译总算通过。

下面就继续吧站点复制到我的test站点中了。

help.html/index.html/images都复制过来,和原来的文件基本不冲突。

WEB-inf下的jsp目录也不冲突,因为该demo用了2个子目录Spring和Struts.

除了web.xml外,其它配置文件也不重复,复制过来即可。

只剩下web.xml了:前面2个Demo直用到基本的Servlet定义和servlet-mapping. 这里增加了很多的context-param,大概是设置全局变量吧,称为system property。

<context-param>
<param-name>webAppRootKey</param-name>
<param-value>petstore.root</param-value>
</context-param>
说是为WebAppRootListener和Log4jConfigListener设置根路径,可为什么需要个.root,是什么目的?还有什么其它意义吗,应该是petstore不就可以了吗?不明白。

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
说是为Log4jConfigListener指定配置参数文件,进而获得需要的参数。

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/dataAccessContext-local.xml /WEB-INF/applicationContext.xml
</param-value>
<!--
<param-value>
/WEB-INF/dataAccessContext-jta.xml /WEB-INF/applicationContext.xml
</param-value>
-->
</context-param>
说是定义Application上下文的根级上下文。特别强调不能再单数据库上下文包含local和不能再双数据库上下文包含jta. 不明白。

<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
说用JBoss时要加入此段,我不是,免。

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这段是为了让WEB启动时就能读入applicationContext.xml. 以方便再任何时候通过WebApplicationContextUtils.getWebApplicationContext (servletContext)获得此上下文。

<servlet>
<servlet-name>petstore</servlet-name>
<servlet-

class>org.springframework.web.servlet.DispatcherServle

t</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
这是加入petstore这个servlet

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
这个是加入一个用于Struts动作的servlet

<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
说是提供远程访问,可通过Hessian, Burlap和Http来远程访问。对应的配置文件remoting-servlet.xml

<servlet>
<servlet-name>axis</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
说是提供Web-Service访问服务的,通过Apache Axis。对应的配置文件server-config.wsdd

<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
说是对Spring,则用petstore,对Struts则用action.那么如何切换到Struts呢?不知道。

<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
远程映射

<servlet-mapping>
<servlet-name>axis</servlet-name>
<url-pattern>/axis/*</url-pattern>
</servlet-mapping>
Web-Service隐射喽

<resource-ref>
<res-ref-name>jdbc/jpetstore</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<res-ref-name>jdbc/jpetstore-order</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
说是为jta提供resouce的,但都注释了。到底什么是jta? Goo了一下,原来是Java Transaction API,是进行事务划分,是否可以理解成是否支持事务?

好了,看能工作吗?怎么没看见数据库?当然有错误了,我忘了修改这些xml了。

先改struts-config.xml,这个文件应该是在定义action时读入。其中的form-beans肯定是定义所有的Form了,这里的Form和Delphi的Form相当吗?type指定Form-bean的对象名称了。

global-forwards顾名思义定义全局的转向了。failer/unknown-error/global-signon分别对应一个jsp文件。

action-mappings当然是定义动作映射了。一些action还定义了input参数是表示动作的输入?包含几个forward是转向了?

修改了ApplicationContext.xml,具体意义以后再看,否则我怕转晕了。

修改DataAccessContext-local.xml等所有xml. 提示缺少ibatis, 这是什么东西?又是个O/R Mapping解决方案,看来是等效于Hibernate的东东。这是一个Blog的描述:http://blogger.org.cn/blog/more.asp?name=sixsun&id=2395也放放吧。找到jar再说。ibatis-common-2.jar和ibatis-sqlmap-2.jar。

另外的错误竟然来自jar,其中的domain下的xml中竟然也指定Class. XML编辑器还不错。所有的ResultMap都需要修改。虽然还不理解其中的内容。

又提示找不到包,com.caucho.hessian.server.HessianSkeleton, 加入hessian-2.1.12.jar,实现了一种remote机制的包吧。少加了一个,还有一个机制burlap-2.1.12.jar。

终于没有编译错误了。但数据库呢?肯定会运行错。果然转起来了,果然数据库肯定错。

一篇介绍dbcp的文章:http://www.javaworld.com.tw/jute/post/view?bid=21&id=44045&sty=1&tpg=1&age=0

我采用hsql库,把jdbc.properties中的jdbc.url,改为jdbc:hsqldb:file:c:/jpetstore把库也复制到c:/jpetstore下,又采用了Spring提供的hsql-db.jar文件。终于彻底转起来了,每个jsp都成功了。

palmer : 2005-11-29#39
小熊笨笨 说:
这几年,俺也在用Eclipse,很高兴和你交流:)


我用IDEA 感觉不错.Eclipse 是很不错!还有些不习惯.不过支持开源!!

palmer : 2005-11-29#40
gangnet 说:
打不开!
学会用Google,搜索一下不就来了!:wdb18: :wdb25:

palmer : 2005-11-29#41
LZ 你可是够疯的,这里不是JAVA视线 http://forum.hibernate.org.cn/ ,也不是csdn啊.哈哈
给你扔的臭鸡蛋.

uvov : 2005-11-29#42
测一下我的签名吧

uvov : 2005-11-29#43
palmer 说:
LZ 你可是够疯的,这里不是JAVA视线 http://forum.hibernate.org.cn/ ,也不是csdn啊.哈哈
给你扔的臭鸡蛋.
俺都不好意思了。俺只想和这里的人交流啊,谁让我要去这么个地方啊。或许我是该搬个地方。好象这里也真的不适合啊。

palmer : 2005-11-29#44
uvov 说:
俺都不好意思了。俺只想和这里的人交流啊,谁让我要去这么个地方啊。或许我是该搬个地方。好象这里也真的不适合啊。

对不起,有点伤你的心了.其实只是我个人的看法,我只是觉得在这个坛子里应该发一些对大多数人有用的东西,,嘻嘻,不过灌水多了可以加声望.我也很想要这个东西.所以我也常常灌水. 但是不能太急功近利啊.呵呵我这个人啊,到哪里都常常说一些别人不喜欢听的话,不要生我的气哦.给你加SW了,安慰一下.呵呵.

luhui : 2005-11-30#45
哈哈,这个版块来的人比较少,所以和LZ交流的不多。建议LZ也常到坛子里的其他版面去转转,准能找到与你志同道合的朋友。

当然,也不要忘了常来这里呀。

gangnet : 2005-11-30#46
我本有心向明月,奈何明月照沟渠。
本想和楼主靠个近乎,不想楼主只顾他的实验结果,不理俺这崇拜者。
咳,……

uvov : 2005-11-30#47
我做会员才几天!正在学习通过灌水和大家交流,我感觉通过灌水表露自己还真的很上瘾的,感觉一下子多了好多朋友.而通过灌水督促自己学习,我人为也是个好方法,否则我怎么能有耐心去做呢. 在学习过程中我就记录每个步骤,为的就是尽可能说清楚, 这也确实提高了自己学习的效率.

学会表露自己可能更有利于在加拿大生存吧.(估计国内也是这样,只是没这么做). 感谢鼓励和鞭策.

JoyDivision : 2005-11-30#48
楼住,在struts中怎么实现分页显示?急问谢了

uvov : 2005-11-30#49
JoyDivision 说:
楼住,在struts中怎么实现分页显示?急问谢了
汗啊, Struts is not familiar to me still. In my understanding, 分页和Struts没什么关系. Struts只负责了MVC的组织,确定了流程的走向. 具体的输入可能是Form,输入的处理是Action. 你说的分页应该是View的内部吧.

分页也看数据库的访问方式,如Hibernate或JDBC,我对JDBC还算熟悉,Hibernate正在学习,还没有实践很多.

不管哪种方式,分页实际上都是对SQL/HQL的结果集进行过滤,把不需要的内容滤掉,把需要的内容输出. 我用JDBC就是对ResultSet忽略前(Page-1)*PageRows个记录,然后取PageRows个记录,然后再忽略后面的所有记录,但在忽略中处理记录的个数. 所有记录处理完后,就知道这个数据集合有多少记录了. 如果实际取出的数据数为0,而总记录数>0,那么自动重新计算出最后页,重新获得最后页.

你可能觉得用计数的方法获得记录个数很笨,但如果采用SCROLL_FORWAR_ONLY的访问模式,效率是最高的,JDBC2.0/3.0支持双向滚动,但服务器开销太大,效率很低,特别是大数据集合会把服务器崩溃(我的测试).

通过对HQL的了解,对Hibernate也可这样,不是有个方法可以不产生数据就可Skip到下一个记录的方法吗?!

JoyDivision : 2005-12-02#50
uvov 说:
汗啊, Struts is not familiar to me still. In my understanding, 分页和Struts没什么关系. Struts只负责了MVC的组织,确定了流程的走向. 具体的输入可能是Form,输入的处理是Action. 你说的分页应该是View的内部吧.

分页也看数据库的访问方式,如Hibernate或JDBC,我对JDBC还算熟悉,Hibernate正在学习,还没有实践很多.

不管哪种方式,分页实际上都是对SQL/HQL的结果集进行过滤,把不需要的内容滤掉,把需要的内容输出. 我用JDBC就是对ResultSet忽略前(Page-1)*PageRows个记录,然后取PageRows个记录,然后再忽略后面的所有记录,但在忽略中处理记录的个数. 所有记录处理完后,就知道这个数据集合有多少记录了. 如果实际取出的数据数为0,而总记录数>0,那么自动重新计算出最后页,重新获得最后页.

你可能觉得用计数的方法获得记录个数很笨,但如果采用SCROLL_FORWAR_ONLY的访问模式,效率是最高的,JDBC2.0/3.0支持双向滚动,但服务器开销太大,效率很低,特别是大数据集合会把服务器崩溃(我的测试).

通过对HQL的了解,对Hibernate也可这样,不是有个方法可以不产生数据就可Skip到下一个记录的方法吗?!

楼主的的意思是每次执行完SQL,把结果集从数据库返回,然后再根据每页显示的数量,从结果集中取出数据?举个例子,假设我有10000条符合条件的记录,我每次显示100条,那么当我每次点击“下一页”时,都会进行数据库查询,返回这10000条记录,然后从这些记录中取出100条。也就是说我也进行10000/100次查询???还是把10000条结果集放在某个地方??(比如说Session里?但是Session会过期的啊)。P.S: JSP页面能否向Servlet传送几个name相同的parameter?比如<input type=hidden value="1" name="aaa">,<input type=hidden value="2" name="aaa">,<input type=hidden value="3" name="aaa"> <action=abc > ,那么abc得到aaa的value是什么?

uvov : 2005-12-02#51
JoyDivision 说:
楼主的的意思是每次执行完SQL,把结果集从数据库返回,然后再根据每页显示的数量,从结果集中取出数据?举个例子,假设我有10000条符合条件的记录,我每次显示100条,那么当我每次点击“下一页”时,都会进行数据库查询,返回这10000条记录,然后从这些记录中取出100条。也就是说我也进行10000/100次查询???还是把10000条结果集放在某个地方??(比如说Session里?但是Session会过期的啊)。P.S: JSP页面能否向Servlet传送几个name相同的parameter?比如<input type=hidden value="1" name="aaa">,<input type=hidden value="2" name="aaa">,<input type=hidden value="3" name="aaa"> <action=abc > ,那么abc得到aaa的value是什么?
Servlet接收相同名称的参数只返回第一个参数,除非你自己解析输入串。
存入Session的方法会导致服务器内存耗尽而亡。虽然每页查询都需要处理所有数据,但用户一般不会立即要求处理下一页,所以服务器可迅速返回,提高性能。其它任何方法,并发效率都不高。另外处理结果集的过滤时可采用一些提高技巧的方法,反正尽可能减少服务器开销就能提高并发性能。

uvov : 2005-12-03#52
用eclipse替代WinCVS

之前研究了一下WinCVS,作为对非Java项目的CVS客户端,但WinCVS感觉没有Eclipse清晰和方便。今天就试图把WinCVS的功能全部用Eclipse替代,感觉不错。

在Eclipse中创建Simple/Project,用来保存和Java无关的项目,比如我把Tomcat 5.0的运行包设置为我的tomcat 5.0项目,其中Common/lib有我的很多包。将来也用来维护我的运行包的版本了。很好的。

何况WinCVS还需要另外一个rython什么的tcl脚本执行程序。我觉得可以彻底不用wincvs了。

只不知道如何在eclipse中能执行一个批命令,有知道的铜子告诉我一下。

也关注Eclipse Plugin for Delphi 和 Eclipse plugin for Flash.

JoyDivision : 2005-12-06#53
uvov 说:
之前研究了一下WinCVS,作为对非Java项目的CVS客户端,但WinCVS感觉没有Eclipse清晰和方便。今天就试图把WinCVS的功能全部用Eclipse替代,感觉不错。

在Eclipse中创建Simple/Project,用来保存和Java无关的项目,比如我把Tomcat 5.0的运行包设置为我的tomcat 5.0项目,其中Common/lib有我的很多包。将来也用来维护我的运行包的版本了。很好的。

何况WinCVS还需要另外一个rython什么的tcl脚本执行程序。我觉得可以彻底不用wincvs了。

只不知道如何在eclipse中能执行一个批命令,有知道的铜子告诉我一下。

也关注Eclipse Plugin for Delphi 和 Eclipse plugin for Flash.
楼住是说以后可以用eclipse来开发Delphi,C++甚至Flash了??除了eclipse之外还有什么好的java IDE(除了JBuilder!那个太占内存!而且好像只支持BEA公司的东东)。NetBean之类的楼住用过吗?我觉得eclipse 在写JSP 页面时实在不怎么样!很多错误都不报!且写javascript的时候也没有提示。P.S Lomboz插件我已装。

gdpingping : 2005-12-06#54
晕,专家.....

紫雾 : 2005-12-08#55
:wdb18: :wdb2: :wdb24: :wdb10: :wdb20: :wdb17: ~~~~~~:wdb9: 加纷纷:wdb6:

JoyDivision : 2005-12-12#56
搂住能否介绍一下JFC?