??xml version="1.0" encoding="utf-8" standalone="yes"?>
q个设计很通用Q经q作者的多次重构Q现在extremeTable的架构非常漂亮。这个标{在缺Ҏ有些参数对mvc控制器屏蔽了Q应提供一致的对外接口。不q整体上设计q是很精致的Q面向对象来处理 html元素Q与spring非常的默?/span>Q非怾于开发和试?/span>
TableLimitFactoryQ?/span>AbstractLimitFactoryQ?/span>LimitFactory
TableLimitFactory是最l实现的工厂Q它extends?/span>AbstractLimitFactory抽象c,AbstractLimitFactory c?/span>implements?/span>LimitFactory接口?/span>
TableLimitFactory主要是用来实例化Q通过构造函C入参数。同时创?/span>Registry来完?/span>jsp面参数传入Registry。当然还有一个功能就是从web.xml的配|文件读取一些全局参数。首先读取配|文件参敎ͼ然后Ҏ参数创徏LimitRegistry对象?/span>
this.registry = new LimitRegistry(context, tableId, prefixWithTableId, state, stateAttr);
AbstractLimitFactory主要是用来获?/span>jsp面上设|的参数Q比如分늚信息Q第几页Qv始行Q结束行Q每|C敎ͼ查询条gQ排序条件等Q,当然他是通过工具c?/span>Registry来实现?/span>
TableLimitQ?/span>Limit。其主要作用是一个参数参数器Q就是把Registry对象的参C?/span>TableLimitQ考虑到分层吧Q?/span>TableLimit是该标签?/span>action通信的桥梁。就像我们的j2ee目vo?/span>dao?/span>struts{?/span>view{数据传输工兗?/span>
TablePropertiesQ?/span>Properties 主要是来实现?/span>web.xml配置的文件中d配置的一些全局参数?/span>
InputStream input = this.getClass().getResourceAsStream(preferencesLocation);
if (input != null) {
properties.load(input);
}
其中preferencesLocation是\径,?/span>TableLimitFactory初始化时候,通过工具c?/span>TableModelUtils.getPreferencesLocation(context)获取?/span>
q个设计也是大多数需要配|文件的pȝ常用的方法?/span>
LimitRegistryQ?/span>AbstractRegistryQ?/span>Registry
q个体系l构和上面的工厂模式一P是LimitRegistry主要是用来实例化Q通过构造函C入参数?/span>AbstractRegistry是实际实现类Q获?/span>jsp表单提交的参敎ͼq提?/span>getterҎ?/span>Limit来用?/span>Registry是一个接口?/span>
所以这设计模式Q我们可以来学习Q?/span>
l典表述Q?span style="color: red">c?/span>?/span>抽象c?/span>?/span>接口
l c:初始化,定义构造函敎ͼ传入参数?/span>
l 抽象c:定义业务Ҏ在此?/span>
l 接口Q定义接口方法,q个不用多说?/span>
Q作者:asktalk 来自 http://www.tkk7.com/askltak 原创文章Q{载请注明出处Q?/p>
下面是从struts的角度来谈谈spring自带?/span>web框架的用?/span>
当然Q我们在配置web框架前,需要把spring配置好,q里׃多说了?/span>
如果没有配置config.xml文gQ那么其默认的配|文件ؓ[ servlet-name ]-servlet.xml 。也是我们q个配置的默认配|文件是Dispatcher-servlet.xml
spring web框架?/span>struts最大的不同是spring web框架Ҏ分工Q把每一U功能都定义ZU组Ӟ所以在开发过E中需要配|的东西非常多Q?/span>Spring中分为几个角Ԍ
l 核心控制器,是web框架的主 servletQ?/span>
l 业务控制器,也就?/span>struts中的action对象Q?/span>
l 映射处理器,定义了访问\径如何与web?/span>xml中的bean相匹配,是定义了一U策略;
l 视图和视图解析器Q视囑ְ?/span>jstl,velocity,xslt{,视图解析器定义了action最l导航页面的{略Q?/span>
l 模型Q就?/span>struts MVCl构中的modelQ?/span>
l Command对象Q类gstruts中的formBeanQ?/span>
下面列出了一些。例如,
n Web框架要拦?/span>*.do路径Q那?/span>*.do如何与我们下面的bean匚wQ就需要一个映控制器。在struts中就是名字相同的匚wQ不需要配|?/span>
n action最后要导向C同的面Q在struts中我们用的是默认的不需要在xml文g中配|,?/span>spring中就需要配|视图解析器?/span>
n 下面代码中,Action?/span>commandClass配置的就是类gstruts中的formBean对象?br />
Action不外乎承一些现成的c,来实现我?/span>view部分的业务?br /> 作者:http://www.tkk7.com/asktalk
解压后的目录l构如下图,通过执行build.bat可以~译出完整的Eclipse-sdk-3.3.1.1q行包,和我们网上下载的一栗但是这个过E可能需要一个小时左右的旉Q要有耐性哦。所有的插g工程目录在plugins中,我们只需要导入现有工E即可把plugins下所有工E导入?br />
EclipseRCPEclipse RCP
Source InsightProject
EclipseEclipse1exeeclipse.exeEclipsestartup.jarEclipseeclipse-sourceBuild-srcIncluded-3.3.1.1"plugins"org.eclipse.platform"launchersrc.zipwin32win32build.batC2javaEclipse 3.3.1.1eclipsestartup.jarorg.eclipse.equinox.launcher.Main.maineclipsestartup.jarEclipse 3.3.1.1javajava -jar startup.jarEclipseorg.eclipse.core.launcher.Mainorg.eclipse.equinox.launcher.Main.mainorg.eclipse.equinox.launcherMain.javaeclipse-sourceBuild-srcIncluded-3.3.1.1"plugins"org.eclipse.platform"launchersrc.zipeclipse.c我们?/span>mainbasicRun
protectedvoid basicRun(String[] args) throws Exception { System.getProperties().put("eclipse.startTime", Long.toString(System.currentTimeMillis())); //$NON-NLS-1$ commands = args; String[] passThruArgs = processCommandLine(args); if (!debug) // debug can be specified as system property as well debug = System.getProperty(PROP_DEBUG) != null; setupVMProperties(); //VM processConfiguration(); //configuration/config.ini // need to ensure that getInstallLocation is called at least once to initialize the value. // Do this AFTER processing the configuration to allow the configuration to set // the install location. getInstallLocation(); // locate boot plugin (may return -dev mode variations) URL[] bootPath = getBootPath(bootLocation); //Set up the JNI bridge. We need to know the install location to find the shared library setupJNI(bootPath); //ensure minimum Java version, do this after JNI is set up so that we can write an error message //with exitdata if we fail. if (!checkVersion(System.getProperty("java.version"), System.getProperty(PROP_REQUIRED_JAVA_VERSION))) //$NON-NLS-1$ return; setSecurityPolicy(bootPath); // // splash handling is done here, because the default case needs to know // the location of the boot plugin we are going to use handleSplash(bootPath); beforeFwkInvocation(); invokeFramework(passThruArgs, bootPath); //Eclipse }
格式Q?mysql -hL地址 -u用户?Qp用户密码
1、例1Q连接到本机上的MYSQL?
首先在打开DOSH口Q然后进入目?mysqlbinQ再键入命omysql -uroot -pQ回车后提示你输密码Q如果刚安装好MYSQLQ超U用户root是没有密码的Q故直接回R卛_q入到MYSQL中了QMYSQL的提C符是:mysql>
2、例2Q连接到q程L上的MYSQL。假设远E主机的IP为:110.110.110.110Q用户名为root,密码为abcd123。则键入以下命oQ?
mysql -h110.110.110.110 -uroot -pabcd123
Q注:u与root可以不用加空|其它也一P
3、退出MYSQL命oQ?exit Q回车)
二、修改密码?/strong>
格式Qmysqladmin -u用户?-p旧密?password 新密?
1、例1Q给root加个密码ab12。首先在DOS下进入目录mysqlbinQ然后键入以下命?
mysqladmin -uroot -password ab12
注:因ؓ开始时root没有密码Q所?p旧密码一就可以省略了?
2、例2Q再root的密码改为djg345?
mysqladmin -uroot -pab12 password djg345
三、增加新用户?br />
Q注意:和上面不同,下面的因为是MYSQL环境中的命oQ所以后面都带一个分号作为命令结束符Q?
格式Qgrant select on 数据?* to 用户名@dL identified by \"密码\"
?、增加一个用户test1密码为abcQ让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入MYSQLQ然后键入以下命令:
grant select,insert,update,delete on *.* to test1@\"%\" Identified by \"abc\";
但例1增加的用h十分危险的,你想如某个h知道test1的密码,那么他就可以在internet上的M一台电脑上d你的mysql数据库ƈ对你的数据可以ؓ所Ʋؓ了,解决办法见例2?
?、增加一个用户test2密码为abc,让他只可以在localhost上登录,q可以对数据库mydbq行查询、插入、修攏V删除的操作Qlocalhost指本C机,即MYSQL数据库所在的那台LQ,q样用户即用知道test2的密码,他也无法从internet上直接访问数据库Q只能通过MYSQLL上的web|讉K了?
grant select,insert,update,delete on mydb.* to test2@localhost identified by \"abc\";
如果你不想test2有密码,可以再打一个命令将密码消掉?
grant select,insert,update,delete on mydb.* to test2@localhost identified by \"\";
在上我们讲了登录、增加用戗密码更改等问题。下我们来看看MYSQL中有x据库斚w的操作。注意:你必首先登录到MYSQL中,以下操作都是在MYSQL的提C符下进行的Q而且每个命o以分L束?
一、操作技?/strong>
1、如果你打命令时Q回车后发现忘记加分P你无重打一遍命令,只要打个分号回R可以了。也是说你可以把一个完整的命o分成几行来打Q完后用分号作结束标志就OK?
2、你可以使用光标上下键调Z前的命o。但以前我用q的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win?br />
二、显C命?/strong>
1、显C数据库列表?
show databases;
刚开始时才两个数据库Qmysql和test。mysql库很重要它里面有MYSQL的系l信息,我们改密码和新增用户Q实际上是用这个库q行操作?
2、显C库中的数据表:
use mysqlQ?/span> Q/打开库,学过FOXBASE的一定不会陌生吧
show tables;
3、显C数据表的结构:
describe 表名;
4、徏库:
create database 库名;
5、徏表:
use 库名Q?
create table 表名 (字段讑֮列表)Q?/span>
6、删库和删表:
drop database 库名;
drop table 表名Q?/span>
7、将表中记录清空Q?
delete from 表名;
8、显C中的记录Q?
select * from 表名;
从文本文件执行SQL语句
三、一个徏库和以及插入数据的实?
|
注:在徏表中Q?Q将ID设ؓ长度?的数字字D?int(3)q让它每个记录自动加一:auto_incrementq不能ؓI?not null而且让他成ؓdDprimary keyQ?Q将NAME设ؓ长度?0的字W字D(3Q将ADDRESS设ؓ长度50的字W字D,而且~省gؓ深圳。varchar和char有什么区别呢Q只有等以后的文章再说了。(4Q将YEAR设ؓ日期字段?
如果你在mysql提示W键入上面的命o也可以,但不方便调试。你可以以上命令原样写入一个文本文件中假设为school.sqlQ然后复制到c:\\下,q在DOS状态进入目录\\mysql\\binQ然后键入以下命令:
mysql -uroot -p密码 < c:\\school.sql
如果成功Q空Z行无M昄Q如有错误,会有提示。(以上命o已经调试Q你只要?/的注释去掉即可用)?br />
四、将文本数据转到数据库中
1、文本数据应W合的格式:字段数据之间用tab键隔开Qnull值用\\n来代?
例:
3 rose 深圳二中 1976-10-10
4 mike 深圳一?1975-12-23
2、数据传入命?load data local infile \"文g名\" into table 表名;
注意Q你最好将文g复制到\\mysql\\bin目录下,q且要先用use命o打表所在的库?
五、备份数据库Q(命o在DOS的\\mysql\\bin目录下执行)
mysqldump --opt school>school.bbb
注释:数据库school备䆾到school.bbb文gQschool.bbb是一个文本文Ӟ文g名Q取,打开看看你会有新发现?
后记Q其实MYSQL的对数据库的操作与其它的SQLcL据库大同异Q您最好找本将SQL的书看看。我在这里只介绍一些基本的Q其实我也就只懂q些了,呵呵。最好的MYSQL教程q是"晏子"译的"MYSQL中文参考手?不仅免费每个相关|站都有下蝲Q而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式,在查扑և数命令的时候不太方ѝ?
innodb
InnoDB l?MySQL 提供了具有事?commit)、回?rollback)和崩溃修复能?crash recovery capabilities)的事务安?transaction-safe (ACID compliant))型表。InnoDB 提供了行?locking on row level)Q提供与 Oracle cd一致的不加锁读?non-locking read in SELECTs)。这些特性均提高了多用户q发操作的性能表现。在InnoDB表中不需要扩大锁?lock escalation)Q因?InnoDB 的列锁定(row level locks)适宜非常的I间。InnoDB ?MySQL 上第一个提供外键约?FOREIGN KEY constraints)的表引擎?/p>
InnoDB 的设计目标是处理大容量数据库pȝQ它?CPU 利用率是其它Z盘的关pL据库引擎所不能比的。在技术上QInnoDB 是一套放?MySQL 后台的完整数据库pȝQInnoDB 在主内存中徏立其专用的缓冲池用于高速缓冲数据和索引?InnoDB 把数据和索引存放在表I间里,可能包含多个文gQ这与其它的不一P举例来说Q在 MyISAM 中,表被存放在单独的文g中。InnoDB 表的大小只受限于操作pȝ的文件大,一般ؓ 2 GB?/p>
?http://www.innodb.com/ 上可以找?InnoDB 最新的信息。InnoDB 手册的最新版本L被放|在那里Qƈ且在那里可以得到 InnoDB 的商业许?order commercial licenses)以及支持?/p>
InnoDB 现在(2001q十?在一些大的需高性能的数据库站点上被使用。著名的 Internet 新闻站点 Slashdot.org 是使用?InnoDB?Mytrix, Inc. ?InnoDB 表上存储了超q?1 TB 的数据,而且另外的一个站点在 InnoDB 表上处理着q_每秒 800 ơ的插入/更新的负载?
MyISAM
MyISAM 是MySQL~省存贮引擎 .
每张MyISAM 桌被存放在盘在三个文?。frm 文g存放表格定义?数据文g是MYD (MYData) ?索引文g是MYI (MYIndex) 引?/p>
以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXTcd的烦引?br /> 2.InnoDB 中不保存表的具体行数Q也是_执行select count(*) from tableӞInnoDB要扫描一遍整个表来计有多少行,但是MyISAM只要单的d保存好的行数卛_。注意的是,当count(*)语句包含 where条gӞ两种表的操作是一L?br /> 3.对于AUTO_INCREMENTcd的字D,InnoDB中必d含只有该字段的烦引,但是在MyISAM表中Q可以和其他字段一起徏立联合烦引?br /> 4.DELETE FROM tableӞInnoDB不会重新建立表,而是一行一行的删除?br /> 5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的Q解x法是首先把InnoDB表改成MyISAM表,导入数据后再ҎInnoDB表,但是对于使用的额外的InnoDBҎ(例如外键Q的表不适用?/p>
另外QInnoDB表的行锁也不是绝对的Q如果在执行一个SQL语句时MySQL不能定要扫描的范围QInnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
M一U表都不是万能的Q只用恰当的针对业务cd来选择合适的表类型,才能最大的发挥MySQL的性能优势?/p>
1, 下蝲
?a >https://glassfish.dev.java.net/downloads/v2-b33.html选择下蝲版本,q里下蝲的是windows?
Solaris SPARC Platform
glassfish-installer-v2-b33.jar, size 70M
Solaris x86 Platform
glassfish-installer-v2-b33-sunos_x86.jar size 67M
Windows Platform
glassfish-installer-v2-b33-winnt.jar size 63M
Linux Platform
glassfish-installer-v2-b33-linux.jar size 64M
MacOS Platform
glassfish-installer-v2-b33-darwin.jar size 67M
2,讄Java和Ant环境变量
pȝ需要安装J2SE 5.0
3,执行安装
java -Xmx256m -jar glassfish-installer-v2-b33.jar
直接点击q行glassfish-installer-v2-b33.jar无法安装,必须在cmd命o环境下执行上q命?
执行完毕后在glassfish-installer-v2-b33.jar的同U目录会出现一个glassfish文g?所有文仉已经解压到这个目录了,记着,只是解压q没有安装哪!
下面cd glassfish ,切换到glassfish目录?q行ant脚本setup.xml,执行真正的安装过E?
q行 ant -f setup.xml
4,q行domain.
大家都用qIBM Websphere 和BEA Weblogic,domain相当于服务器的一个具体实?所有配|参数都在这里面.在步?中已lؓ我们生成了一个domain,在glassfish\domains\domain1目录?
切换到cd glassfish/bin目录?
执行asadmin start -domain domain1 ,q行domain1.l果如下
5,览控制?
打开览器,输入 http://192.168.1.3:8080/ 看到如下?
控制台首? http://192.168.1.3:4848/
user name: admin
password: adminadmin
控制台首如?
pȝ架构设计师角色是技术上的领导和pȝ开发创新远景的来源?br /> 随着现在技术的q步Q特别师银行Q电信都在搞省集中,那么集中意味q什么,数据量增大,q发增大Q特别是现在在银行,电信目中ؓ了达到^C业化Q都是在向SOA靠拢。这意味q什么?接口增多了,而且都是ZȝQ那么在q种情况下,软g的管理和规划设计和原来的都不一样了Q就需要更高的架构师?br /> q一q我一直在做电信的目Q以前一?7目Q包|万象,什么都有。所以到了今q中国电信提出^C业化Q都在向省集中靠拢,那么以前的一个项目就搞定了,现在变成?0几个厂商都在Q由于SOAq不成熟Q基于ȝQ接口非怹多,数据Q模型等都需要一个技术专家组Q也是所谓的架构师去换一U思\设计整体的架构。特别是SOA有很多没有一个很成熟的方案,所以架构是在这个时候就需要具有透视未来的能力,以后压力增大Q系l可以承受吗Q很多都需要重新思考。需要一个正规的程显的特别重要!Q下面说说理想中的架构师。应该向q方面靠拢!
pȝ架构设计师徏立ƈ改进pȝ逻辑l构和物理结构ƈ参与优化q些l构Q优化结构要Ҏ主要的系l元素及其接口,q要权衡各种竞争因素和约束(如,性能、h格和环境影响Q,评估生成所需行ؓ的可能方案。系l架构设计师的视野跨整个系l以及内部和外部可能影响到开发的所有因素。考虑到要l持该广阔的视野Q系l分析员很少深入地参与系l的详细工程Q而們于把它们留给各个工程专业的其他专业h员?
pȝ架构设计师角色要求精通促成系l工E的多个规程Qƈ在分析和解决Ҏ合成斚w技术娴熟。系l架构设计师q必d于启发式和归U_推理Q大部分pȝ体系l构所依赖的)Q以及对其他工程规程的演l推理。系l架构设计师不只是地考虑解决Ҏ的技术,q考虑许多其他问题Q比如系l操作、性能、经可行性、可l护性和后勤支持Q以及有兌些问题的政治、技术、社会、胦务和环境因素Q及其他因素Q?#160;
pȝ架构设计师必L熟有l验Q其能够完成对象分析和贸易研究以从多个解决Ҏ中选择最优解x案,能够在信息不完整或不明确时作出好的判断,q能够认识到“最?#8221;通常是由政治、经以及工E考虑支配的?
在处理由人员、硬件和软gl合的系l时Q系l架构设计师需要对M解决Ҏ中由人员和硬件组件施加的物理限制和约束有很强的判断力。除了在pȝ工程斚w的经验(以及对联合规E方面的知识Q如操作调查和工E经)之外Q系l架构设计师在Y件工E(׃它在Cpȝ中普遍存在)斚w也要有坚实的基础以及以下素质Q?
pȝ架构设计师角色具有系l设计h员的技能,但前者的技能重Ҏ战略性的Qƈ不详l?
pȝ架构设计师与软g设计人员的关p?/strong>
q两个角色有很多怼点;实际上对于那些因规模或复杂程度而被看作“pȝ”开发、但仍是大型的或完整的Y仉目来_q两个角色是合ؓ一体的?然而,通常情况下,pȝ架构设计师比软g设计人员的支持范围大?pȝ架构设计师必d付物理上强加的约束,q些U束在Y件更易适应的领域中不存在。但是,正是软g的灵zL得体pȝ构演q具有可能的道\Q这在以前是无法设想的。因此,软g设计人员和系l架构设计师之间q不是严格的从属关系Q从软g体系l构上考虑的反馈可能对pȝ的体pȝ构有p的媄响;否认q一点将要承担潜在的ơ最?i>pȝ体系l构的风险,q些体系l构Z软g体系l构可从需求的分配Q由pȝ架构设计师完成)z到计^台这一单的概念。但是以下说法也是正的Q在pȝ架构设计师和软g设计人员的团队中Q系l架构设计师角色的职责要求系l架构设计师?i>团队中的g?/i>Q因为系l是最l品?
本文用到名词说明:
内部c:Inner Class
嵌套c:Static Nested Class Q与标题上的嵌套的类不同Q此处是专有名词Q?/SPAN>
静态内部类Q同嵌套cM个意思,一物两个名字而已?/SPAN>
在下面,我们看到对于BcL说他的嵌套层ơ是Q?/SPAN>AcessMethod-
?/SPAN>
A-
?/SPAN>
B
Q?/SPAN>
那么讉KҎ如下Q?/SPAN>
class
B {
void h() {
System.out.println("h()");
g();
f();
}
AcessMethod
?/SPAN>
A
来说对Q都是透明的,直接调用?/SPAN>
嵌套cd例化的顺序:有外到里Q?/SPAN>
AcessMethod-
?/SPAN>
A-
?/SPAN>
B
调用代码如下Q?/SPAN>
AcessMethod am =
new
AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
q里很有意思的一点,
?new?/SPAN>
语法产生了正的作用域?/SPAN>
疑问Q?/SPAN>下面我们来看一下在
B.h()
中怎样调用
A1.g()
ҎQ?/SPAN>
下面我们来看是否可以?/SPAN>
B
中调?/SPAN>
A1.g()
ҎQ在
B.h()
Ҏ中原则上可以q样调用
A1.g()
但是
A1
没有实例化,所以这h错误的,也就是在
B
中无法调?/SPAN>
A1
中的非静态方法了?/SPAN>
假设Q?/SPAN>如果
A1.g()
?/SPAN>
static
cdQ那么在
B
中可以这栯?/SPAN>
A1
U的ҎQ?/SPAN>
A1.this.g()
Q?/SPAN>
但是q是不可能的Q因为在
A1.g()
不可能定义ؓ
static
cdQ详l看下面的问?/SPAN>
1
Q?/SPAN>
问题1:在什么情况下可以定义static ҎQ,q是一个缺点吧Q但是可以用嵌套类来解决了?/SPAN>
/**
*
从多层嵌套类中访问外部类的成?/SPAN>
.
?/SPAN>
.new
“语法生了正确的作用域
*/
public class AcessMethod {
private void f() {
System.out.println("f()");
}
class A1 {
private void g() {
System.out.println("A
}
}
class A {
private void g() {
System.out.println("g()");
}
class B {
void h() {
System.out.println("h()");
g();
f();
}
}
}
public static void main(String[] args) {
AcessMethod am = new AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
}
}
q行l果Q?/SPAN>
h()
g()
f()
问题1:在什么情况下可以定义static ҎQ?/SPAN>
只有在顶层类中定义,或者在静态内部类中定义,看下面的例子
public class
Test {
static void t(){}
class T2{
//!
错误Q?/SPAN>
The method a cannot be declared static;
//static methods can only be declared in a static or top level type
//static void a(){}
}
static
class
T3{
static void a(){}
}
}
CSDN|址Q?/FONT>http://blog.csdn.net/fasttalk
刚从CSDN搬到q里Q先发表一!
?SPAN lang=EN-US>web应用中,寚w面的讉K控制通常通过E序来控Ӟ程为:
d -> 讄session -> 讉K受限面时检?SPAN lang=EN-US>session是否存在Q如果不存在Q禁止访?SPAN lang=EN-US>
对于较小型的web应用Q可以通过tomcat内置的访问控制机制来实现权限控制。采用这U机制的好处是,E序中无需q行权限控制Q完全通过?SPAN lang=EN-US>tomcat的配|即可完成访问控制?SPAN lang=EN-US>
Z?SPAN lang=EN-US>tomcat面讄讉K权限控制Q在目?SPAN lang=EN-US>WEB-INFO/web.xml文g中,q行如下讄Q?SPAN lang=EN-US>
其中Q?SPAN lang=EN-US><url-pattern>中指定受限的urlQ可以用通配W?SPAN lang=EN-US>*Q通常Ҏ个目录进行访问权限控制?/FONT>
<auth-constraint>中指定哪些角色可以访?SPAN lang=EN-US><url-pattern>指定?SPAN lang=EN-US>urlQ在<role-name>中可以设|一个或多个角色名?SPAN lang=EN-US>
使用的角色名来自tomcat的配|文?SPAN lang=EN-US>${CATALINA_HOME}/conf/tomcat-users.xml?SPAN lang=EN-US>
<login-config>中设|登录方式,<auth-method>的取gؓBASIC?SPAN lang=EN-US>FORM。如果ؓBASICQ浏览器在需要登录时弹出一个登录窗口。如果ؓFORM方式Q需要指定登录页面和dp|时的提示信息昄面?SPAN lang=EN-US>
使用FORM方式的配|样例如下:
其中?SPAN lang=EN-US><form-login-page>指定d面urlQ?SPAN lang=EN-US><form-error-page>指定dp|时的提示面url?/FONT>
d面中,form?SPAN lang=EN-US>actionQ以及其中的用户名和密码两个参数的名Uͼ都应取固定的倹{登录的后台处理E序?SPAN lang=EN-US>j_security_checkQ用户名和密码的参数名称分别为:j_username?SPAN lang=EN-US>j_password?/FONT>
如下是登录页面(如:login.jspQ的一D늤例代码: