在学习日记源代码中:/learndiary/old/web/WEB-INF/ 目录下边有一个目录名叫classes,是程序运行时的class文件,本来不应该进入cvs仓库的。我也在WEB-INF的目录下面加了一个.cvsignore文件,里面过滤了classes目录的提交(即.cvsignore文件里面加了一行为“classes”)。这个.cvsignore在原来在eclipse2.1下一直工作得很好,本地与cvs库同步时也不会把这个classes的目录包括进去。
但是,当我在redhat linux9.0 下使用eclipse3.1时,问题出现了,在进行cvs同步时把classes目录下的所有文件都包括进去了。我也不知道是eclipse3.1和原因还是redhat linux9.0的原因。现在只有把问题摆在这里,然后就是手工取消这个classes目录的同步。
有哪位朋友知道答案的话希望能回复一下。谢谢。
分类:Java
JSP程序员成长之路(转帖)
转自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=56589&start=0&msRange=30
JSP程序员成长之路
striveforever 转贴 (参与分:31014,专家分:1668) 发表:2006-10-11 08:27 版本:1.0 阅读:204次
一:说明
在本文章中使用精通、熟练、熟悉、了解标志你对某技术的掌握程度。
精通:能够掌握此技术的85%技术要点以上,使用此技术时间超过两年,并使用此技术成功实施5个以上的项目。能使用此技术优化性能或代码,做到最大可能的重用。
熟练:能够掌握此技术的60%技术要点以上,使用此技术时间超过一年,并使用此技术成功实施3个以上的项目。能使用此技术实现软件需求并有经验的积累在实现之前能做优化设计尽可能的实现模块或代码的重用。
熟悉:能够掌握此技术的50%技术要点以上,使用此技术时间超过半年上,并使用此技术成功实施1个以上的项目。能使用此技术实现软件需求。
了解:可以在实际需要时参考技术文档或帮助文件满足你的需要,基本知道此项技术在你运用是所起的作用,能够调用或者使用其根据规定提供给你的调用方式。
二:基本要求
1:html掌握程度:熟练。原因:不会html你可能写JSP?
2:javascript/jscript:掌握程度:熟悉。原因:client端的数据校验、一些页面处理需要你使用脚本。
3:css掌握程度:熟悉。原因:实现页面风格的统一通常会使用css去实现。
4:java基础编程掌握程度:熟练。原因:不会java你能写JSP?开玩笑吧。
还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http;javax.mail;等。
5:sql掌握程度:熟练。原因:如果你不使用数据库的话你也许不需要掌握sql。
同时你必须对以下几种数据库中的一种以上的sql比较熟悉。Oracle,DB2,Mysql,Postgresql.
6:xml掌握程度:了解原因:AppServer的配置一般是使用XML来实现的。
7:ejb掌握程度:了解原因:很多项目中商业逻辑是由ejb来实现的,所以呢……
8:以下几种AppServer(engnier)你需要了解一个以上。
a:)Tomcat
b:)WebLogic
c:)WebSphere
d:)JRun
e:)Resin
原因:你的jsp跑在什么上面啊!
三:选择要求(因项目而定)
1:LDAP掌握程度:了解原因:LADP越来越多的运用在权限控制上面。
2:Struts掌握程度:熟练原因:如果符合MVC设计通常会使用Struts实现C。
3:Xsp掌握程度:根据需要而定很多时候是不使用的,但在不需要使用ejb但jsp+servlet+bean实现不了的时候Xsp是一个非常不错的选择。
4:Linux掌握程度:熟悉原因:如果你的运用跑在Linux/Unix上你最少要知道rm,mv,cp,vi,targzip/gunzip是用来做什么的吧。
四:工具的使用
1:UltraEdit(EditPlus)+jakarta-ant+jakarta-log4j;
2:Jubilder4-6
3:VisualAgeForJava
4:VCafe
以上的工具你选择你自己熟悉的吧。不过强烈建议你用log4j做调试工具。
五:成长之路
1:html学习时间,如果你的智商在80以上,15天时间应该够用了。至少你能手写出一个页面来。
2:jacascript/jscript学习时间,这真的不好说,比较深奥的东西,够用的话一个礼拜可以学写皮毛。
3:css学习时间,三天的时间你应该知道如何使用css了,不要求你写,一般是美工来写css。
4:java学习时间,天才也的三个月吧。慢满学吧。如果要精通,那我不知道需要多少时间了。用来写jsp,四个月应该够了。
5:sql学习时间,只需要知道insert,delete,update,select,create/drop table的话一天你应该知道了。
6:xml学习时间,我不知道我还没有学会呢。呵呵。不过我知道DTD是用来做什么的。
7:ejb学习时间,基本的调用看3天你会调用了。不过是建立在你学会java的基础上的。
8:熟悉AppServer,Tomcat四天你可以掌握安装,配置。把jsp跑起来了。如果是WebLogic也够了,但要使用ejb那不关你的事情吧。SA做什么去了。
9:熟悉Linux那可得需要不少时间。慢慢看man吧。
10:Struts如果需要你再学习。
版权声明
本篇文章对您是否有帮助? 投票: 是 否 投票结果: 3 0
作者其它文章:
* 如何用正确的方法写出高质量软件的75条体会
* 敏捷开发的七种武器
* 职场:迈过职业生涯中的5个坎
作者全部文章
评论人:sonyejin 参与分: 12927 专家分: 436 发表时间: 2006-10-11 20:26
6:xml学习时间,我不知道我还没有学会呢。呵呵。...
我晕,作者说了这么多,竟然连xml都不会。。
评论人:happylinyang 参与分: 2673 专家分: 30 发表时间: 2006-10-11 22:13
不错,不错,[good]
评论人:batbat 参与分: 6635 专家分: 440 发表时间: 2006-10-12 21:00
xml有各种开源的工具包可以用,像jdom什么的,还有征对某个特殊应用的包,比如说:rome可以用于rss、atom之类的生成、聚合操作。java就是好,只要你想用的,基本上都有开源的类库供选择。给了像我之类只想搞点简单应用的人很大方便。[good]
分享JAVA学习目标,做成功JAVA程序员。JAVA学习日记
先搞懂什么是MVC再说(转帖一篇)
尽管我现在没有能力去搞一个自己的MVC,但MVC是什么总要知道吧?在网上找到一篇很经典的定义文章。转在这里:
**************************************************************************************************
什么是MVC(收藏)(转自:http://blog.waynedeng.com/article.asp?id=496)
作者:wayne_deng 日期:2005-01-31
字体大小: 小 中 大
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC如何工作
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括 Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.
如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
模型
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
为什么要使用 MVC
大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。
首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。
由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用 Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。
对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
MVC的缺点
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。
你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。
根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。
MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
MVC是一条创建软件的好途径
MVC 设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
ps: 我原以为MVC是什么神秘的东西呢,其实就是Modal View Controler,我个人认为理解这一点就已足够。
文章来自: [转贴]
引用通告地址: http://blog.waynedeng.com/trackback.asp?tbID=496
同意这个说法;先把基础砸扎实;
参见JSP基础
http://www.bc-cn.net/Article/web/jsp/jc/200410/158.html
在Struts的html:select标签中显示默认值(转)
转自:http://www.theserverside.com/discussions/thread.tss?thread_id=35726
Render default value for html:select in STRUTS
Posted by: Jiao Yu on ?? 07, 2005 DIGG
Hello,
I am trying to render the default value for html:select with STRUTS, but can't get it work correctly.
----------------------------------------------------------
Here are the component I have:
The JSP page to render the html:select
<%@ taglib prefix="req" uri="/WEB-INF/taglibs-request.tld" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<head><title>eQuation 2.0</title></head>
<body>
<html:form action="/mappingAction" >
<table>
<c:forEach var="line" items="${mappingForm.map.matchColumnList}" >
<TR>
<TD><c:out value="${line.databaseColumnNameLabel}"/></TD>
<TD><c:out value="${line.excelColumnPosition}"/></TD>
<TD>
<html:select name="line" property="excelColumnPosition"
multiple="false" size="5" value="${line.excelColumnPosition}" >
<html:option value="" >No Match</html:option>
<html:optionsCollection name="mappingForm"
property="excelColumnList"
value="index"
label="columnName"/>
</html:select>
</TD>
</TR>
</c:forEach>
</table>
<html:submit value="Process"/>
</html:form>
</body>
----------------------------------------------------------
Here is the form setction for my STRUTS configuration xml:
<form-bean name="mappingForm" type="org.apache.struts.action.DynaActionForm" >
<form-property name="excelColumnList" type="rawdata.model.ExcelColumnNameBean[]"/>
<form-property name="matchColumnList" type="rawdata.model.ColumnMatchBean[]" />
----------------------------------------------------------
Here are the definitions for the two beans used in the mappingForm:
public class ColumnMatchBean {
private String excelColumnName;
private String recommmendedDatabaseColumnName;
private String databaseColumnNameLabel;
private int excelColumnPosition;
...}
public class ExcelColumnNameBean {
private String columnName;
private int index;
...}
----------------------------------------------------------
Here is the action mapping used to populate the mappingForm and render the form in a JSP:
<action
path="/loadMatchingColumn"
type="rawdata.LoadMatchingColumnAction"
name="mappingForm"
attribute="mappingForm"
scope="session"
>
<forward name="success"
path="/../upload/showExcelColumns.jsp"
redirect="false"/>
</action>
----------------------------------------------
In LoadMatchingColumnAction, I populated both properties of the mappingForm,
For excelColumnList ( Array of ExcelColumnNameBean), I populated a couple of ExcelColumnNameBean ( with both columnName and index populated),
For matchColumnList ( Array of ColumnMatchBean, I populated a couple of ColumnMatchBean, ( with only recommmendedDatabaseColumnName and databaseColumnNameLabel populated),
Then I the showExcelColumns.jsp, I am going to render a couple of select lists with corresponding labels, see the details of the JSP at the beginning of this POST.
Here my questions come,
1)I can render the couple of select lists successfully, but for each of them, I would like to set a default value, I can't make this to work, although I set the value attribute in the select tag:
<html:select name="line" property="excelColumnPosition"
multiple="false" size="5" value="${line.excelColumnPosition}" >
I wrap select tag with C:foreach tags to render a group of select lists, and the problem seems to happen in
value="${line.excelColumnPosition}"
the correct predefined value can't be retrieved,
If I change "${line.excelColumnPosition}" to a specific number, let's say "2", then it works fine.
How can I get the correct value from line.excelColumnPosition?
2)My second question is: the select list rendered in the JSP page doesn't render a drop down list, but a select box, how can I make it a select drop down list?
Hope I have provided enough and clear information to explain my puzzles?
Thanks so much and have a good night,
Jiao
Message #180699 Post reply Post reply Post reply Go to top Go to top Go to top
Check html:optionsCollection
Posted by: Cliff Liang on ?? 08, 2005 in response to Message #180569
I think you check the following and its tag doc first.
<html:optionsCollection name="mappingForm"
property="excelColumnList"
value="index"
label="columnName"/>
I guess each item in excelColumnList is the pair of index and value. You set value="index", so when you change "${line.excelColumnPosition}" to "2", it works fine.
Try to change to value="value", which is the value of excelColumnPosition is from.
Of course, html:select can be used for drop down list.
Hope it can help you.
Cliff Liang
Message #180705 Post reply Post reply Post reply Go to top Go to top Go to top
RE:Render default value for html:select in STRUTS
Posted by: Jiao Yu on ?? 09, 2005 in response to Message #180569
Cliff,
Thanks for your reply. But I don't think that's the problem, since I already identified the issue under the help of a teammate.
The major issue here is that STRUTS doesn't work well with EL, so ${line.excelColumnPosition}" doesn't work well.
He suggests following options to fix the problem:
a)You must use runtime expression in the value parameter. I have not tested following code.
<bean:define id="defaultValue" name="line" property="excelColumnPosition"/>
<html:select name="line" property="excelColumnPosition" value='<%= defaultValue %>' >
b) Use Struts-EL library
c) Tomcat bundled with JBoss 4.0.2 is 5.5.x. It is Servlet 2.4 and JSP 2.0 compliant. You could change the web.xml to specify the 2.4 version of the servlet specification. EL expresions would be interpreted by the servlet container - Tomcat. The version 2.2 in web.xml does not interpret EL expressions for compatibility reasons.
Changing follow code:
“<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">”
To
<?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/web-app_2_4.xsd"
version="2.4">
....
</web-app>
------------------------------------------
To dropdown list issue is also resolved, just omit the multiple attribute for select.
Thanks again and happy programming.
Jiao
Message #180707 Post reply Post reply Post reply Go to top Go to top Go to top
Render default value for html:select in STRUTS
Posted by: Jiao Yu on ?? 09, 2005 in response to Message #180569
Hello,
Another tricky thing is :
The var attribute (mathchColumnList)in C:forEach tag, the property after map. for the items attribute (matchColumnList) in the C:foeEach tag, and the name attribute for the html:select tag should be all the same, otherwise, you can't get the POST data in the following action.
<c:forEach var="matchColumnList" items="${mappingForm.map.matchColumnList}" >
<TR>
<TD><c:out value="${matchColumnList.databaseColumnNameLabel}"/></TD>
<TD><c:out value="${matchColumnList.excelColumnPosition}"/></TD>
<TD>
<html:select name="matchColumnList" property="excelColumnPosition"
multiple="false" size="5" value="${matchColumnList.excelColumnPosition}" >
<html:option value="" >No Match</html:option>
<html:optionsCollection name="mappingForm"
property="excelColumnList"
value="index"
label="columnName"/>
</html:select>
Have a good night,
Jiao
关于tomcat的部署一个让我郁闷了一天的问题
在编写JSP程序的时候,将jsp+servlet发布的服务器选用tomcat,遇到很多问题,网上关于tomcat的文章找了很久才找到一篇讲tomcat动态发布的,觉得不错,贴出来大家看看.
Tomcat4中的部署方式:
1 部署Web应用程序的方法:
1.1 WAR方式
将应用程序包含的jsp、servlet等文件包装成一个单个的、自包含的WAR文件。WAR文件是一个JAR文件,其中包含了特殊的目录和位于他的/Web-INF目录中的web.xml文件。其结构举例如下:
hello.jsp
META-INF/
MANIFEST.MF
Web-INF/
web.xml
classes/
example/helloWorld.class
lib/
xxx.jar
创建WAR文件的最容易的方法就是,首先在开发环境中创建相应于WAR结构的目录结构。然后,创建WAR所要做的工作就是在WAR的根目录中执行下面的命令。注意,其中排除了.java源文件,它是WAR文件中不必要的内容,并且在试图部署WAR时可能会带来问题:
Jar ?cvf hello.war META-INF/MANIFEST.MF Web-INF/classes/example/*.class Web-INF/web.xml *.jsp
将WAR文件拷贝到$CATALINA_HOME/webapps目录中。当Tomcat启动时,它
就会自动对WAR文件进行解包,并且创建这个应用程序,应用程序的名字(和上下文路径Context Path)为WAR文件的名称。在这里不需要对系统或者服务器路径做任何的改动。
注意:如果在Tomcat已经启动好以后,放置WAR文件到webapps目录,则Tomcat无法动态
部署这个Web应用程序,需要重启Tomcat。 如果虚拟主机的liveDeploy属性为true就不用了。
1.2扩展目录方式
此种部署方式的优点是,当对jsp进行了修改时不必重启Tomcat,并且不必在每次修改时都要去重新建立归档文件,而且在准备好进行软件分发时也很容易地创建WAR文件。
在server.xml文件中加入如下代码,该文件位于$CATALINA_HOME/conf目录中。
<Context path=”/hello” docBase=”<path to root of war>” debug=”0”
reloadable="true" crossContext="true" />
<path to root of war>是一个按照使用的操作系统的目录惯例的绝对路径,并且不必是位于Tomcat的目录树下面。作者把这个WAR部署到Windows中,使用的是docBase=”d: lymacy”,而在Unix中,所使用的docBase=”/export/home/macy”。
注意,Tomcat要求对Windows的路径使用单个反斜杠。
______________________________________________________________________________________________
答6:
Tomcat5中的部署方式:
1 应用程序部署器(Deployer)
程序员朋友不要以为这是什么全新的东西,其实以前的版本就已经有了,只不过在Tomcat4中没有提出这个概念,且它的功能被分散在各个组件中,给人的感觉是比较支离破碎的。于是乎,在Tomcat5中对其进行了包装和增强,提出了Deployer这个逻辑概念,用于集中表示应用程序部署和发布功能。Tomcat5对其的主要改进就是进行了一些优化,增强了动态部署的功能,减少了重启Tomcat的次数,增强了服务器的健壮性和可靠性。
Deployer提供的主要功能就是静态(在tomcat启动之前)或者动态(在Tomcat运行以后)进行Web应用程序的部署和删除,在某些情况下Deployer需要和Manager管理工具联合使用。
1.1 Context descriptors
这个也不是新东西了,Tomcat4中的Manager和Admin管理工具其实就是利用它来部署的。在Tomcat5中提出了Context descriptor这个概念,且为其配置了一个专有目录,而不像Tomcat4那样大杂烩一般地放置在$appBase目录下。既然了有了名分,当然要为其单独配置一个目录才能显其身份:)
Context descriptor是一个只包含Context元素的xml格式的部署文件,其中Context元素与server.xml中的Context元素配置相同。对于一个给定的主机,Context descriptor放置在$CATALINA_HOME/conf/[enginename]/[hostname]/目录下面。Tomcat5默认安装时,在$CATALINA_HOMEconfCatalinalocalhost目录中有admin.xml和manager.xml,是两个管理工具的部署描述符文件。而这两个文件在Tomcat4中是放置在$CATALINA_HOME/webapps目录下面的。呵呵。。。果然是换汤不换药啊:)
注意事项:context descriptor的文件名可以与Web应用程序名无关,但是Tomcat在部署这个应用程序的时候所创建的程序运行上下文(Context)的名称是与Web应用程序名称匹配的。
1.2 静态部署
静态部署是指在Tomcat运行之前就把相关的Web应用程序放置到合适的目录,在Tomcat启动的时候自动来部署这些应用程序。
如果"deployOnStartup"属性值为true,那么在Tomcat启动时,在$appBase目录下的web应用程序将被自动部署。部署的过程如下:
? Context元素声明的Web应用程序将被首先部署,这包括server.xml和context descriptor文件中的Context元素所指的应用程序;
? 部署扩展目录形式的Web应用程序;
? 部署WAR形式的Web应用程序;
Tomcat5对于静态方式的部署的增强主要就是:
1、对于context descriptor方式的应用程序的部署。
2、如果扩展目录方式的应用程序对应有一个WAR文件,且WAR是更新过的,扩展目录将被自动删除,Web应用程序将被从WAR文件中重新部署。而在Tomcat4中,即使WAR文件已更新也无法被重新部署,仍然会使用旧的扩展目录方式的Web应用程序,除非你自己手动删除目录,记得还要重启Tomcat哦。这么麻烦?(#@($)#*$),看来还是Tomcat5好啊:)
1.3 动态部署
动态部署是指在Tomcat已经运行以后在不重启服务器的情况下部署应用程序的方式。
如果虚拟主机的"autoDeploy"属性值为true,则主机会在需要的时候试图去部署和更新应用程序。这是由虚拟主机在后台运行的一个负责自动加载的处理线程来完成的,它的工作流程如下:
1、部署新放入$appBase目录的War方式的应用程序。
2、部署新放入$appBase目录的扩展目录方式的应用程序。
3、如果一个扩展目录方式的应用程序对应的War文件更新了,则删除此目录,从War文件中重新解开并部署。如果”unpackWARs”属性值为false,则不解开,从War文件中直接运行。(记住:不用自己删除扩展目录,也不用重启服务器)
4、如果应用程序的/WEB-INF/web.xml文件被改变,则重新部署这个应用。
5、如果应用程序对应的Context元素配置发生了改变,则重新部署这个应用。这包括server.xml或者上下文描述符文件中的Context元素。
6、如果$CATALINA_HOME/conf/[enginename]/[hostname]/目录下增加了上下文描述符文件,则重新部署这个应用。
看来Tomcat5在动态部署上花费了不少功夫,其中的亮点主要就是如果我们修改了web.xml、server.xml配置文件,增加了上下文描述符文件,动态更新了War文件时都可以实现应用程序的自动部署和更新,而不用重新启动Tomcat服务器,在Tomcat4中都是必须重新启动服务器的,这是一个非常喜人的变化。毕竟在对服务器的健壮性和可靠性要求越来越高的今天,重启服务器都是一件令我们非常头疼的一件事情。以后终于可以挺直腰杆对客户说“这回坚决不用重启服务器!”嘿嘿。。。幸福啊!
1.4 用Client Deployer工具包部署
这个才是Tomcat5中名副其实的创新,它是一个全新的部署器。
client deployer是一个集验证、编译、部署功能与一体的工具包。它使用Ant来实现应用程序的自动化验证和编译,使用Manager管理工具来实现应用程序的自动化部署。
这个工具包包含:Catalina Ant工具、Jasper编译器(用于将jsp编译为servlet)、应用程序验证工具(validator task)。默认的验证工具的实现类是org.apache.catalina.ant.ValidatorTask,它只允许以扩展目录的文件路径作为唯一的参数。
此部署工具包使用一个事先写好的Ant脚本,包含如下一些目标(target):
? compile (默认):用于验证和编译Web应用程序。它可以在不启动Tomcat的情况下被单独使用。由于使用的是新的Jasper编译器的缘故,编译后的应用程序将只能在Tomcat 5.X版本上使用。需要提醒的是,不光是jsp文件被编译为servlet, 应用程序的/WEB-INF/classes目录下的Java源文件也将被同时编译为class文件。
? deploy:将Web应用程序部署到Tomcat服务器中。
? undeploy:从服务器中解除部署已经部署的某个应用程序。
? start:启动Web应用程序
? reload:重新加载Web应用程序
? stop:停止Web应用程序
以下是Ant脚本中的一些重要属性:
? build:编译以后的文件默认放置在${build}/webapp${path}。编译目标执行完以后,生成了应用程序的War —— ${build}/webapp${path}.war.
? webapp:放置需要被验证和编译的Web应用程序(扩展目录方式)的文件路径。默认值为”myapp”。
? path:Web应用程序部署后对应的运行上下文的路径默认是”/myapp“。
? url:放置Manager管理工具的绝对路径,它被部署工具包用来部署和解除部署应用程序。默认情况下,部署器将试图使用http://localhost:8080/manager访问本机的Manager管理工具。
? username:可以使用Manager管理工具的超级用户的用户名。
? Password:超级用户的密码。
至此,Tomcat5中神秘的部署器就讲完了,大家是不是已经对它发生了浓厚的兴趣呢?那就动手去试一下吧!尽管朝$appBase目录下扔你心爱的程序吧,Tomcat5会马上让他们欢快地跑起来。速度真的比Tomcat4快多了,一种冲浪的感觉:)
本文章引用通告地址(TrackBack Ping URL)为:
http://blog.zol.com.cn/portal/personShowArticle.do?articleId= 18829
一个无比郁闷的问题
我想使用servlet,安装了j2eesdk1.4.03,但是javax.servlet死活没出来,
不知道哪里没对
还有一个问题,j2eesdk可以代替j2sesdk吗?如果能,那么sun为什要出两个版本,用J2EE不就完了,真是让人费解啊
eclipse 使用心得
昨天捣鼓了一天的eclipse,自我感觉良好,感觉eclipse有点像DELPHI,一切为插件的口号让人激动不已,当然eclipse可以作为C++的IDE,前提是安装c/c++ide插件,具体下载http://www.eclipse.org/downloads/,
ECLIPSE 包括JDT(标准插件)和PDE 插件开发环境,更让人不可思议的是,它居然有完全汉化的版本,就连帮助也是全汉化的,汉化语言包是作为插件安装进入ide的,像我这样外语不好的朋友可以有福了.
不过Language Pack有大约1几个文件,都在http://download.eclipse.org/eclipse/downloads/drops/L-3.1.1_Language_Packs-200510051300/index.php,全都要下载下来,镜像下载点个人感觉台湾的yat-sen大学的快,浙江大学的下载点估计已经关闭了(大陆的就是不行啊),下载后将这些文件解压,每个目录下面都有一个eclipse目录,大家可以之间把它们覆盖到你的eclipse安装目录下.
不过我建议把他们全部复制到一个单独的目录里,然后在eclipse安装目录下建立一个links目录,然后在links目录下建立一个*.link的文本文档,在文档里写入path=C:\\eclipse311\\lag路径(我的语言包是放在C:\eclipse311\lag下的),然后重新打开eclipse,一个几乎全中文的界面就跳出来了.
客户端到服务端,c/s结构,用户验证
java真的很难写啊,用惯了Delphi,C#之类容易调试的编程工具,
没办法一点一点的写吧,
今天又写了个从客户端发送字符串,到服务端验证的代码,刚好把前一次的用户验证类用上,不过做了些修改.
通过这段时间的写代码,渐渐的对java也熟悉些了,速度也慢慢快起来了,自己心中窃喜
附件:talk.rar,3620 bytes
从客户端往服务端发送消息的代码
客户端
public class TalkClient {
public static void main(String[] args) {
// Create application frame.
ClientSend cs = new ClientSend();
TalkClientFrame frame = new TalkClientFrame(cs);
// Show frame
frame.setVisible(true);
}
}
//----------------------------------------------------
import java.net.*;
public class ClientSend {
private DatagramSocket ds_CSend;
private DatagramPacket dp_CSend;
public ClientSend(){
try{
ds_CSend = new DatagramSocket(8080);
}
catch(Exception e){
e.printStackTrace();
}
}
public void Sended(byte[] buf,String sip){
try{
dp_CSend = new DatagramPacket(buf,buf.length,InetAddress.getByName(sip),8888);
ds_CSend.send(dp_CSend);
}
catch(Exception e){
e.printStackTrace();
}
}
}
///----------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class TalkClientFrame extends Frame {
private List lst = new List(6);//存放对话内容
private TextField tf_Data = new TextField(20);//存放发送内容
private TextField tf_ip = new TextField(15);//存放IP和PORT;
private ClientSend cs;
public TalkClientFrame(ClientSend cs) {
this.cs = cs;
tf_ip.setText("127.0.0.1");
Panel p_Data = new Panel();//放置tf_Data,tf_ip的容器
//-----------------------布局-----------------------------------
this.add(lst,"Center");
this.add(p_Data,"South");
p_Data.add(tf_ip,"West");
p_Data.add(tf_Data,"East");
tf_Data.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
//
tf_Dataactionperformed(evt);
}
});
//----------------------------------------------------------------
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
MenuItem menuFileExit = new MenuItem();
menuFile.setLabel("文件(F)");
menuFileExit.setLabel("退出(X)");
// Add action listener.for the menu button
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (tf_Data.getText().length()>0)
TalkClientFrame.this.windowClosed();
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("TalkClient");
setMenuBar(menuBar);
setSize(new Dimension(350, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
TalkClientFrame.this.windowClosed();
}
}
);
}
void tf_Dataactionperformed(ActionEvent e){
byte[] buf = tf_Data.getText().getBytes();
String strIp = tf_ip.getText();
try{
cs.Sended(buf,strIp);
}
catch(Exception ex){
ex.printStackTrace();
}
tf_Data.setText("");
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// TODO: Check if it is safe to close the application
// Exit application.
System.exit(0);
}
}
服务端
public class talkServer {
public static void main(String[] args) {
// TODO: Add your code here
talkRecv tR = new talkRecv();
tR.Recved();
}
}
//------------------------------------------------
import java.net.*;
public class talkRecv {
private DatagramSocket ds_Recv;
private DatagramPacket dp_Recv;
public boolean b_stop=true;
public talkRecv(){
try{
ds_Recv = new DatagramSocket(8888);//将8888端口作为接受端口
byte[] buf = new byte[1024];
dp_Recv = new DatagramPacket(buf,1024);
}
catch(Exception e){
e.printStackTrace();
}
}
public void Recved(){
while(b_stop){
try{
ds_Recv.receive(dp_Recv);
String str_info = new String(dp_Recv.getData(),0,dp_Recv.getLength());
System.out.println(" ip:"+dp_Recv.getAddress().getHostAddress());
System.out.println("port:"+dp_Recv.getPort());
System.out.println("data:"+str_info);
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
//------------------------------------------------
这几个类都没怎么考虑对象的释放问题,这个问题希望那位大大能够关注一下,给小弟一点指点,小弟感激不禁