??xml version="1.0" encoding="utf-8" standalone="yes"?>
命o接口Q?br />
public interface Command {
public void execute();
}
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.off();
}
}
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
public class Light {
public Light() {
}
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
public void setCommand(Command command) {
slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
public class RemoteControlTest {
public static void main(String[] args) {
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
1?分布登记l一执行Q?br />
在作E序Ӟl常到一些需求,先注册一些操作,q不马上执行Q等最l确定后l一执行。如一个具体的例子:用户定制自己的报表,可以订阅|柱,折线Q曲U图Q客户选择相应的报表组合,q样对应一个命令集合,在没定之前用户可以增删q些报表Q命令)Q等最l确定统一交给调用者根据命令执行,生成l合报表。实C命o分布提出Q确定后l一执行的功能?br />
2》Ş如流水线操作Q还是出书的例子
//先是一本空白的书:
Book book = new Book();
//扑և个作?br />
Author author1 Q?new Author();
Author author2 Q?new Author();
//把写1Q?章的名类分别l这两个作?br />
Command writeCommand = new Write1Command (author1Qbook);
Command writeCommand = new Write2Command (author2Qbook);
List commands Q?new List ();
Commands.add(writeCommand);
//调用?br />
Invoker invoker = new invoker();
Invoker.setCommands(commands);
//水写书
invoker.action()
实际上在acitonq一Ҏ中,invoker按照命oQ让两个作者流水写作这本书。(cM一个书的流水线加工工厂Q?br />
q样我们的书p水加工成功Q当然这本书只有两章Q?br />
q样q了我们一U系l设计的框架Q?br />
模型Q工P命o
客户端生命令,命o调用工具操作模型?br />
Book 相当于模?br />
Author 相当于和多工L中的一?br />
Command 命o
3》系l需要支持命令的撤消(undo)。提供redo()Ҏ【容易扩展?br />
我们可以和容易的加入undo和redoQ这个不隄?br />
4》在Invoker中我们可以实现跟t,和日志?br />
5》当pȝ需要ؓ某项复制增加形的功能的时候,命o模式使新的功能(表现ZU命令)很容易地被加入到服务U里?br />
命o联系了工Lx行类和系l逻辑Q?br />
?变化的命令模式:
命o模式的角色比较多Q在实际应用U我们可以根据所需要的功能和不需要的功能加以化?br />
1》去?调用?br />
产生命o集合后,我们可以直接在client中P代执行执行操?br />
2?变化 调用?成ؓ 跟踪?br />
//调用?br />
public class Invoker{
List commands; //已经执行完毕的命令集?br />
public void addCommand (Command command,int i){
commands.add(i,command);
}
public void action(Command command){
//执行操作
command. execute();
//
commands.add(command);
}
}
……………
//q可以有丰富的redo和undo操作Q?当然一些都l基于命令类提供的相应方?
}
q样q个cd记录了所有执行过的操作?br />
3》去?命o 用map替代
我们完全可以用map代替命oQ这h需定义各种命oc?br />
我们改进例子
Author author Q?new Author();
Publisher publisher Q?new Publisher ();
Map m = new HashMap;
m.put(author, write);
m.put(author, publisherBook);
在Invoker的actionҎQ?br />
得代map
q用java反射来调用方法;
4》去掉执行者:
直接在命令中QexecuteҎU)加业务逻辑。这样只适合于简单的的pȝ.
其他要说的内?br />
1?某些参Cl某个方发的方式很多Q除了当作方法的参数外还可以当作cȝ成员便俩变量传入Q?br />
q就为命令的抽象带来了极大的方便
abstract class Command
{
abstract public void execute();
}
当我们已l有了执行者(cTestQ方法executeQargs1Qargs2 ….argsnQ?br />
我们不必向Command加入executeQargs1Qargs2 ….argsnQ抽象方法,在说即加了Q在我们q代的时候也无法判断或十分不Ҏ判断哪个命o调用哪个executeҎ?br />
那么我们可以q样
class ConcreteCommand : Command
{
Test test;
args1
args2
…..
argsn
public override void Execute()
{
test. execute (args1Qargs2 ….argsn);
}
}
2?在想跟踪操作的时候,一般ؓ每一个操作对象分配一个调用者,操作对象在调用者中讄。(可以抽象Z个ȝ调用者,来协调调用每一个具体的调用者)
3?命o的抽象粒度我觉得是要注意的?br />
4?理解思想Q不要机械的照搬。消化成自己的,加以灉|的运用和创造在是根本出路?br />
所谓命令模式的Ҏ思想是?先Ş成命令,在根据命令执行?br />
参考:http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx
]]>
1.public class CarFactory{
public static Car getCar(int type){
if(type == 1){
return new Car1();
} else {
return new Car2();
}
}
}
2. public class CarFactory{
public static Car getCar(String carClass){
String className = carClass;
Class c = Class.forName(className);
Car car = (Car)c.newInstance();
return car;
}
}
3. public class CarFactory{
public static Car getCar(String carJNDIName){
InitialContext ic = new InitialContext();
String className = ic.lookUp(carJNDIName);
Car car = (Car)Class.forName(className).newInstance();
return car;
}
}
方式1?适合于工厂所产生的对象都是属于同一个父cd的,而从方式1?来看Q方?无疑是最单的Q也是最Ҏ理解和接受的Q而方?和方?则相Ҏ说要高一炏V高U在哪里呢?我们可以看到Q方?中对对象的创建是使用Hardcode的Ş式,也即是程序员需要事先知道系l里面存在多个cd的对象及其对应的~号Q一旦增加或删除、修改了对象的类型,则必然引起if-else块的改变Q造成了维护的困难?br />
而方?则采用了动态类加蝲的方式,方式3在方?的基上用了JNDIQ更q了一步,其好处是不用出现HardCode的方式,即便你后面的应用增加、删除了对象的类型,我的E序q是保持现在的样子,跟进一步来_可以L那些讨厌的if-else语句?br />
2. 工厂Ҏ模式L了简单工厂模式中工厂Ҏ的静态属性,使得它可以被子类l承。这样在单工厂模式里集中在工厂方法上的压力可以由工厂Ҏ模式里不同的工厂子类来分担。?font style="background-color: #c7edcc">实质上它是让工厂实现了抽象的工厂接口Q它把具体怎么生一U东西,攑֜具体的工厂去实现了,所?#8221;延迟到子cM实现“?/span>
CZ一Q?br />
public interface Driver{
public Car driverCar();
}
public class BenzDriver implements Driver{
public Car driverCar(){
return new Benz();
}
}
public class BmwDriver implements Driver{
public Car driverCar() {
return new Bmw();
}
}
// 应该和具体品Ş成对应关p?/span> ...
// 有请暴发户先?/span>
public class Magnate
{
public static void main(String[] args)
{
try{
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
}
……
}
CZ二:
public interface Creator
{
public Prouct factory();
}
public SubCreator1 implent Creator
{
public Prouct factory()
{
return new ConcreteProduct1();
}
}
public SubCreator2 implent Creator
{
public Prouct factory()
{
return new ConcreteProduct2();
}
}
h意:q回cd是Product型的Q!
q样客户端调用是直接new 一个具体工厂的实例Q然后命令它ȝ产,而对于具体工厂的父类Q既工厂接口Q接口完全可以改成子cȝ承父cL实现Q只是这样不好,不符合OO的原则)Q它完全不知道什么品被生了,甚至它连那个具体工厂被实例化它都不知道!
3. 抽象工厂
public abstract class AbstractFactory{
public abstract Car getCar(String carClass);
public abstract Plane getPlane(String planeClass);
}
public class Factory1 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1?
return car1;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1?
return plane1;
}
}
public class Factory2 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1?
return car2;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1?
return plane2;
}
}
执行环境Q可以在SQLPLUS.EXE或者DOSQ命令行Q中执行Q?br /> DOS中可以执行时׃ 在oracle 8i 中?安装目录\ora81\BIN被设|ؓ全局路径Q?br /> 该目录下有EXP.EXE与IMP.EXE文g被用来执行导入导出?br /> oracle用java~写Q我想SQLPLUS.EXE、EXP.EXE、IMP.EXEq俩个文件是被包装后的类文g?br /> SQLPLUS.EXE调用EXP.EXE、IMP.EXE他们所包裹的类Q完成导入导出功能?
下面介绍的是导入导出的实例,向导入导出看实例基本上就可以完成Q因为导入导出很单?br /> 数据导出Q?br /> 1 数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp?br /> exp system/manager@TEST file=d:\daochu.dmp full=y
2 数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3 数据库中的表table1 、table2导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4 数据库中的表table1中的字段filed1?00"打头的数据导?br /> exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
上面是常用的导出Q对于压~我不太在意Q用winzip把dmp文g可以很好的压~?br /> 不过在上面命令后?加上 compress=y 可以了
数据的导?br /> 1 D:\daochu.dmp 中的数据导入 TEST数据库中?br /> imp system/manager@TEST file=d:\daochu.dmp
上面可能有点问题Q因为有的表已经存在Q然后它报错,对该表就不进行导入?br /> 在后面加?ignore=y 可以了?br /> 2 d:\daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
导入
基本上上面的导入导出够用了。不情冉|是将表彻底删除,然后导入?
Oracle数据库有三种标准的备份方法,它们分别是导出/导入QEXP/IMPQ、热备䆾和冷备䆾。导出备件是一U逻辑备䆾Q冷备䆾和热备䆾是物理备份?
一?导出Q导入(ExportQImportQ?
利用Export可将数据从数据库中提取出来,利用Import则可提取出来的数据送回到Oracle数据库中厅R?
Q?单导出数据(ExportQ和导入数据QImportQ?
Oracle支持三种方式cd的输出:
Q1Q、表方式QT方式Q,指定表的数据导出?
Q2Q、用h式(U方式Q,指定用L所有对象及数据导出?
Q3Q、全库方式(Full方式Q,瘉|据库中的所有对象导出?
数据导入QImportQ的q程是数据导出(ExportQ的逆过E,分别数据文件导入数据库和将数据库数据导出到数据文g?
Q?增量导出Q导?
增量导出是一U常用的数据备䆾ҎQ它只能Ҏ个数据库来实施,q且必须作ؓSYSTEM来导出。在q行此种导出Ӟpȝ不要求回{Q何问题。导出文件名~省为export.dmpQ如果不希望自己的输出文件定名ؓexport.dmpQ必d命o行中指出要用的文件名?
增量导出包括三种cdQ?
Q1Q、“完全”增量导出(CompleteQ?
卛_份三个数据库Q比如:
|
Q2Q、“增量型”增量导?
备䆾上一ơ备份后改变的数据,比如Q?
|
Q3Q、“篏U型”增量导?
累计型导出方式是导出自上ơ“完全”导Z后数据库中变化了的信息。比如:
|
数据库管理员可以排定一个备份日E表Q用数据导出的三个不同方式合理高效的完成?
比如数据库的被封d可以做如下安排:
星期一Q完全备份(AQ?
星期二:增量导出QBQ?
星期三:增量导出QCQ?
星期四:增量导出QDQ?
星期五:累计导出QEQ?
星期六:增量导出QFQ?
星期日:增量导出QGQ?
如果在星期日Q数据库遭到意外破坏Q数据库理员可按一下步骤来回复数据库:
W一步:用命令CREATE DATABASE重新生成数据库结构;
W二步:创徏一个够大的附加回滚?
W三步:完全增量导入AQ?
|
W四步:累计增量导入EQ?
|
W五步:最q增量导入FQ?
|
二?冷备?
冷备份发生在数据库已l正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备䆾时将关键性文件拷贝到另外的位|的一U说法。对于备份Oracle信息而言Q冷备䆾时最快和最安全的方法。冷备䆾的优ҎQ?
Q?是非常快速的备䆾ҎQ只需hӞ
Q?Ҏ归档Q简单拷贝即可)
Q?Ҏ恢复到某个时间点上(只需文件再拯回去Q?
Q?能与归档Ҏ相结合,做数据库“最佳状态”的恢复?
Q?低度l护Q高度安全?
但冷备䆾也有如下不Q?
Q?单独使用Ӟ只能提供到“某一旉点上”的恢复?
Q?再实施备份的全过E中Q数据库必须要作备䆾而不能作其他工作。也是_在冷备䆾q程中,数据库必L关闭状态?
Q?若磁盘空间有限,只能拯到磁带等其他外部存储讑֤上,速度会很慢?
Q?不能按表或按用户恢复?
如果可能的话Q主要看效率Q,应将信息备䆾到磁盘上Q然后启动数据库Q用户可以工作Qƈ备份的信息拯到磁带上Q拷贝的同时Q数据库也可以工作)。冷备䆾中必L贝的文g包括Q?
Q?所有数据文?
Q?所有控制文?
Q?所有联机REDO LOG文g
Q?Init.ora文gQ可选)
值得注意的冷备份必d数据库关闭的情况下进行,当数据库处于打开状态时Q执行数据库文gpȝ备䆾是无效的?
下面是作冷备份的完整例子?
Q?Q?关闭数据?
|
Q?Q?用拷贝命令备份全部的旉文g、重做日志文件、控制文件、初始化参数文g
|
Q?Q?重启Oracle数据?
|
三?热备?
热备份是在数据库q行的情况下Q采用archivelog mode方式备䆾数据库的Ҏ。所以,如果你有昨天夜里的一个冷备䆾而且又有今天的热备䆾文gQ在发生问题Ӟ可以利用这些资料恢复更多的信息。热备䆾要求数据库在Archivelog方式下操作,q要大量的档案I间。一旦数据库q行在archivelog状态下Q就可以做备份了。热备䆾的命令文件由三部分组成:
1Q?数据文g一个表I间一个表I间的备份?
Q?Q?讄表空间ؓ备䆾状?
Q?Q?备䆾表空间的数据文g
Q?Q?回复表空间ؓ正常状?
2Q?备䆾归档log文g
Q?Q?临时停止归档q程
Q?Q?log下那些在archive rede log目标目录中的文g
Q?Q?重新启动archiveq程
Q?Q?备䆾归档的redo log文g
3Q?用alter database bachup controlfile命o来备份控制文?
热备份的优点是:
1Q?可在表空间或数据库文件备䆾Q备份的旉短?
2Q?备䆾时数据库仍可使用?
3Q?可达到秒U恢复(恢复到某一旉点上Q?
4Q?可对几乎所有数据库实体做恢?
5Q?恢复是快速的Q在大多数情况下爱数据库仍工作时恢复?
热备份的不是:
1Q?不能出错Q否则后果严?
2Q?若热备䆾不成功,所得结果不可用于时间点的恢?
3Q?因难于维护,所以要特别仔细心Q不允许“以p|告终”?/p>
参考资料:http://publish.it168.com/2006/0601/20060601045701.shtml?positioncode=1545
http://bbs.zol.com.cn/index20061024/index_124_11079.html
http://community.csdn.net/Expert/TopicView3.asp?id=5276764
http://bbs.gdei.edu.cn/faster.php?id=t-55261
http://www.dvbbs.net/tech/data/2006031819272.asp
http://study.feloo.com/computer/data/Oracle/200509/121026.html
window.unonload=PageSetup_Reset();
׃注册表位|跟操作pȝ有关Q不推荐使用?/p>
解决Ҏ二:
使用控gQ?br />Q-Q-Q-Q-Q-Q-Q?a >http://www.7say.com/article.asp?id=112Q-Q-Q-Q-Q-
利用ScriptX.cab控gq行WEB打印Q可以控?U|"?横打”和“页面的边距。打C码如下:
<object id=factory viewastext style="display:none"
classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
codebase="</object>
<script defer>
function window.onload() {
// -- advanced features
factory.printing.SetMarginMeasure(2); // measure margins in inches
factory.printing.printer = "HP DeskJet 870C";
factory.printing.paperSize = "A4";
factory.printing.paperSource = "Manual feed";
factory.printing.collate = true;
factory.printing.copies = 2;
factory.printing.SetPageRange(false, 1, 3); // need pages from 1 to 3
// -- basic features
factory.printing.header = "This is MeadCo";
factory.printing.footer = "Advanced Printing by ScriptX";
factory.printing.portrait = false;
factory.printing.leftMargin = 1.0;
factory.printing.topMargin = 1.0;
factory.printing.rightMargin = 1.0;
factory.printing.bottomMargin = 1.0;
}
function Print(frame) {
factory.printing.Print(true, frame) // print with prompt
</script>
<script language="javascript">
function printTure() //打印函数
{
document.all("dayinDiv").style.display="none";//隐藏按钮
factory.printing.Print(false); //调用控g打印
document.all("dayinDiv").style.display="";//昄
}
</script>
<DIV align="center" id="dayinDiv" name="dayinDiv">
<input type=button value="打印本页" onclick="printTure()">
<input type=button value="面讄" onclick="factory.printing.PageSetup()">
<input type=button value="打印预览" onclick="factory.printing.Preview()"><br>
</DIV>
关于ScriptX的下载和该控件的使用ҎL?http://www.meadroid.com/scriptx/index.asp 查看.
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />具体应用Q?br /> <object id=factory style="display:none"
classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
codebase="<c:url value="/editor/ScriptX.cab#version=5,60,0,375"/>" viewastext>
</object>
<OBJECT id=WB classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0></OBJECT>
function printit()
{
factory.printing.header = "";
factory.printing.footer = "";
factory.printing.portrait = false;
WB.ExecWB(6,6)
}
function setPrint()
{
factory.printing.header = "";
factory.printing.footer = "";
factory.printing.portrait = false;
WB.ExecWB(8,1);
}
function previewPrint()
{
factory.printing.header = "";
factory.printing.footer = "";
factory.printing.portrait = false;
WB.ExecWB(7,1)
}
function reset() {
factory.printing.header = "&w&b늠,&p/&P";
factory.printing.footer = "&u&b&d";
factory.printing.portrait = true;
}
window.unonload=reset();
<DIV align="center" id="dayinDiv" name="dayinDiv">
<input type=button value="打印本页" onclick="printit()">
<input type=button value="面讄" onclick="setPrint()">
<input type=button value="打印预览" onclick="previewPrint()"><br>
</DIV>
separator 不作ZQ何数l元素的部分q回?/p>
Q? * 不是有效的模式匹配规则表辑ּQ用"\\*" "\\+"转义后即可得到正的l果?br />"|" 分隔串时虽然能够执行Q但是却不是预期的目的,"\\|"转义后即可得到正的l果?br />q有如果惛_串中使用"\"字符Q则也需要{?首先要表?aaaa\bbbb"q个串就应该?aaaa\\bbbb",如果要分隔就应该q样才能得到正确l果Q?br /> String[] aa = "aaa\\bbb\\bccc".split(\\\\);
\\也可用[]代替Q如Q[|] [*]
CREATE OR REPLACE FUNCTION GET_NUM(IN_TXT in VARCHAR2) RETURN NUMBER IS
RETRUN_VALUE NUMBER;
BEGIN
select to_number(IN_TXT) into RETRUN_VALUE from dual;
RETURN RETRUN_VALUE;
EXCEPTION
WHEN others
THEN
RETURN null;
END GET_NUM;
/
q样无效数字全{换成 Null,U错Ҏ多了?/p>
写个存储q程试一下:
CREATE OR REPLACE PROCEDURE TestFun IS
v_name varchar2(10);/***** 存放cursor_para中的name *****/
CURSOR cursor_name IS select name from test;
cursor cursor_para(p_num number) is select name from test where num = p_num;
begin
/******* t_name为@环的临时变量******/
FOR t_name IN cursor_name LOOP
if (get_num(t_name.name) is not null) then
open cursor_para(get_num(t_name.name));
fetch cursor_para into v_name;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_name);
close cursor_para;
end if;
END LOOP;
END TestFun;
/
存储q程也用C带参数的游标和游标For循环,E后介绍.
其中试表的创徏Q?br />create table test
(
name varchar2(10),
num number
)
试数据:
insert into test(name) values ('12_');
insert into test(name) values ('123');
2.带参数的游标
与存储过E和函数怼Q可以将参数传递给游标q在查询中用。这对于处理在某U条件下打开游标的情况非常有用。它的语法如下:
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
定义参数的语法如下:
Parameter_name [IN] data_type[{:=|DEFAULT} value]
与存储过E不同的是,游标只能接受传递的|而不能返回倹{参数只定义数据cdQ没有大?
另外可以l参数设定一个缺省|当没有参数g递给游标Ӟ׃用缺省倹{游标中定义的参数只是一个占位符Q在别处引用该参C
一定可靠?/p>
在打开游标时给参数赋|语法如下Q?/p>
OPEN cursor_name[value[,value]....];
3.游标FOR循环
在大多数时候我们在设计E序的时候都遵@下面的步骤:
1、打开游标
2、开始@?/p>
3、从游标中取?/p>
4、检查那一行被q回
5、处?/p>
6、关闭@?/p>
7、关闭游?/p>
可以单的把这一cM码称为游标用于@环。但q有一U@环与q种cd不相同,q就是FOR循环Q用于FOR循环的游标按照正常的声明?/p>
式声明,它的优点在于不需要显式的打开、关闭、取数据Q测试数据的存在、定义存放数据的变量{等。游标FOR 循环的语法如下:
FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;
上面的这两个用法也在例子中提CQ?/p>
同理cLQ也可以TO_DATE()函数改进?br />
下面的例子自http://www.nikicn.com/bbs/dispbbs.asp?boardid=23&id=908
没有试Q留作备份之用:
4. Oracle 的Last_Day()函数改写到DB2上:
DROP SPECIFIC FUNCTION LAST_DAYDATE
;
CREATE FUNCTION LAST_DAY(D DATE)
RETURNS DATE
SPECIFIC LAST_DAYDATE
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
CALLED ON NULL INPUT
NO EXTERNAL ACTION
RETURN
D + 1 month - day(D + 1 month) day
;
同理QDB2下的first day:
DROP SPECIFIC FUNCTION FIRST_DAYDATE
;
CREATE FUNCTION FIRST_DAY(D DATE)
RETURNS DATE
SPECIFIC FIRST_DAYDATE
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
CALLED ON NULL INPUT
NO EXTERNAL ACTION
RETURN
D - day(D) day + 1 day
<!-- Tomcat Root Context -->
<!--
<Context path="" docBase="ROOT" debug="0"/>
-->
其中<!-- Tomcat Root Context -->是说明部分,没Q何作用,我们不理它?br />docBase="ROOT"是指定我们目的物理地址Q如果用上面所建的目htdocsQ那是docBase=" E:/Tomcat41/htdocs"?/p>
path=""是指定在URL的相对\径,如设|ؓpath="TEST",那么在URL中输?a >http://127.0.0.1:80/TEST Q它能dE:/Tomcat41/htdocs下的文g?br />但一般我们设|ؓpath=""Q而且在安装Tomcat时端口设|ؓ80Q那?br />在URL中输?a >http://127.0.0.1/可以读到E:/Tomcat41/htdocs下的文g了?/p>
Z每次|页h能有效的d最新的文gQ在此我们增加了一个设|,
reloadable=”true”?br />最后的l果是:
<!-- Tomcat Root Context -->
<Context path="" docBase="E:/Tomcat41/htdocs" reloadable="true" debug="0"/>
web.xml -----在Tomcat中配|不同的关系环境
跟server.xml同一目录下还有一个web.xmlQ打开该文件的源码,我们看看一些常用的配置Ҏ
A.隐藏跟目录下的文件夹
Z安全的考虑Qؓ了不让客L能看到服务器端跟目录下的文gQ必Llistings从true改ؓfalse,具体如下Q?br /><servlet>
………?br /> <init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
…………?br /> </servlet>
B.开放servlet和jsp
׃在应用程序中会用到servlet和jsp,Z在URL中检索ƈ处理servlet和jspQ必Lservlet和jsp开攑և来,是L ?lt;!—“和?-->?具体如下Q?br /><!-- The mapping for the invoker servlet -->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!-- The mapping for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
C.讄默认文g
׃客户通常只知道网站的名称Q而不该知道网站的入口文g名称。ؓ了客户在输入|址时能够找到默认的入口文gQ必L文g名加入到<welcome-file-list>中,如:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
q时如果输入http://127.0.0.1q于输?a >http://127.0.0.1/index.html