2007年12月4日
Filter是Strusts2中非常重要的机制,而Filter的配置就放在Web.xml文件中,如下:
<?xml version="1.0" encoding="GBK"?>
<web-app version="2.4" 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">
<!-- 定义Struts2的FilterDispathcer的Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
posted @
2008-04-05 16:52 怡众科技 阅读(4195) |
评论 (1) |
编辑 收藏
随着阿里巴巴在香港的上市,今年冬天,马云注定将成为最引人瞩目的中国企业家。在《阿里巴巴:天下没有难做的生意》一书的序言写道:“如果说杨致远是互联网领域里第一个世界级的华人企业家,那么马云就可能是下一个。杨致远是商业的天才,他发现了互联网搜索的价值,而马云则是天才的商人,他把一团让人手足无措的乱麻织成了一匹锦绣。”今天,很多人坚持这样的判断。
要总结马云的成功秘诀,应该可以罗列出20条以上,其中包括他的奇异长相和一口流利的英语。不过,在众多答案中,第一条更为专注。
1999年的春天,马云从北京铩羽回到杭州,在城郊的湖畔花园的家里创办阿里巴巴网站。公司成立的那一天,家里的墙壁突然渗水了,他对大家说,我出去找点材料。过一会儿,他抱了一大卷旧报纸回来,然后大家一起把它们贴在墙上,就这样开始了公司的第一天。
阿里巴巴当时总共18个人,马云对全体员工发表开业演讲:“我们要办的是一家电子商务公司,我们的目标有三个。”马云的演讲很能煽动人,“第一,我们要建立一家生存80年的公司。”
大家一边鼓掌,一边想:“反正能不能活到80年,我们可能谁也看不到。”
“第二,我们要建设一家为中国中小企业服务的电子商务公司。”大家鼓掌,在这一点上谁也没有疑问。
“第三,我们要建成世界上最大的电子商务公司,要进入全球网站排名前十位。”大家你看我,我看你,每个人的心里都在犯嘀咕,“这个目标太具体化了,就凭我们这几杆枪?”
后来马云告诉我,他搞电子商务,从那一天起就铁了心。
2001年,全球互联网遭遇大寒流,那年冬天,他飞赴日本向投资阿里巴巴的软银总裁孙正义汇报公司情况,那些日子,孙正义投资的上百家互联网公司乱成了一团,大家都不知道未来的出路在哪里。那天,前来汇报的各国CEO一个接一个地进去出来,轮到马云了,当他简短地讲完阿里巴巴的境况后,孙正义幽幽地说:“今天前来汇报的CEO,所说的话都与我当年投资他们时说的不一样了,只有你还在说当年说过的话。”当时,曾经当过一天世界首富的孙正义的资产已缩水95%,很多投资项目早已面目全非,只有阿里巴巴还是那间他当初投资的电子商务公司,也是软银最成功的投资项目之一。
时间又转到了2002年底,互联网世界开始回暖。中国著名的网络公司如新浪、搜狐等相继实现盈利,而一些颇有市场前景的互联网项目也初露端倪,当时阿里巴巴的网商用户已经超过400万家,马云面临新的诱惑。
“阿里巴巴拥有那么多有价值的注册客户,具备了开拓任何领域的最佳条件。”几乎所有的人都这么认为。当时,摆在马云面前的道路有三条。
第一条道路,是发展短信业务,以搜狐、网易为代表的中国门户网站均在这个聚宝盆里淘到了大金块,短信市场已非常成熟,阿里巴巴完全有抢夺蛋糕的能力。
第二条道路,是投身网络游戏领域,当时全中国还没有一家大型网络游戏公司,陈天桥的盛大才刚刚起步,如果阿里巴巴转投此领域,应当会有大作为。
第三条道路,是继续在尚未成熟的电子商务的“老路”上走下来。
马云的抉择是,不改初衷,一条道走到黑。今天,阿里巴巴没有成为另一家网易,马云也失去了成为“中国首富”的机遇。但是,在电子商务领域,阿里巴巴一路狂奔,无人可追。
所有的成功都是抵抗诱惑的结果。马云的专注包括三个词,一是电子商务,二是中国市场,三是中小经营者。目前,阿里巴巴旗下的所有业务,包括淘宝网、支付宝莫不如此,甚至在我看来,他两年前出手收购的雅虎如果要获得复苏,其战略起点也还是要从自己的专注优势中去寻找。阿里巴巴上市后,马云手握重金,又有了一次讨伐四野的机遇,不过,“钱多了,犯错误的机会也就多了”,不知道马云还记得当年在旧报纸糊成的墙下说过的那席话吗?1947年6月6日,亨利 · 福特去世的时候,《纽约时报》撰文说:“当他来到人世时,这个世界还是马车的时代,当他离开人世时,这个世界已经成了汽车世界。”汽车其实不是福特发明的,不过他让它成为了一个改变美国的工具。今天的马云其实也有这样的机会,电子商务不是他发明的,不过阿里巴巴可能成为改变中国商品和“中国制造”命运的重要推力之一。
posted @
2007-12-07 16:44 怡众科技 阅读(443) |
评论 (1) |
编辑 收藏
Struts 2内嵌了Dojo工具包,实现对Ajax的支持。下面是一个用户名和密码都是Admin的Login应用。
1、在struts.xml中加入一个Action mapping
xml 代码
- <action name="showAjaxLoginForm">
- <result>/pages/ajaxlogin.jspresult>
- action>
-
- <action name="ajaxLogin" class="net.roseindia.Login">
- <result name="input">/pages/ajaxlogin.jspresult>
- <result name="error">/pages/ajaxlogin.jspresult>
- <result>/pages/ajaxloginsuccess.jspresult>
- >
2、用Ajax编写一个Login页面ajaxlogin.jsp
这个页面使用了 标签, 这个标签能通过Ajax tags载入页面内容。jsp页面还使用了标签,这个标签可以利用Ajax来更形页面元素和提交一个form。当出现错误是,和标签执行并显示错误信息。
xml 代码
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <html>
- <head>
- <s:head theme="ajax" debug="true"/>
- head>
- <body>
- <s:div id="loginDiv" theme="ajax">
- <div style="width: 300px;border-style: solid">
- <s:form action="ajaxLogin" validate="true">
- <tr>
- <td colspan="2">
- Login
- td>
- tr>
- <tr>
- <td colspan="2">
- <s:actionerror />
- <s:fielderror />
- td>
- tr>
- <s:textfield name="username" label="Login name"/>
- <s:password name="password" label="Password"/>
- <s:submit theme="ajax" targets="loginDiv" notifyTopics="/ajaxLogin"/>
- s:form>
- div>
- s:div>
- body>
- html>
3、编写一个验证用户名和密码的Action类Login.java
如果验证成功返回SUCCESS,失败就返回ERROR
java 代码
- package net.roseindia;
-
- import com.opensymphony.xwork2.ActionSupport;
- import java.util.Date;
-
-
-
-
- public class Login extends ActionSupport {
-
- public String execute() throws Exception {
- System.out.println("Validating login ... ...");
- System.out.println("User = " + getUsername());
- if (!getUsername().equals("Admin") || !getPassword().equals("Admin")) {
- System.out.println("Validating error ! User = " + getUsername());
- addActionError("Invalid user name or password! Please try again!");
- return ERROR;
- } else {
- System.out.println("Validating success !");
- return SUCCESS;
- }
- }
-
-
-
-
-
-
- private String username = null;
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String value) {
- username = value;
- }
-
-
-
-
-
-
- private String password = null;
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String value) {
- password = value;
- }
-
- }
4、编写一个登录成功页面ajaxloginsuccess.jsp
xml 代码
- <html>
- <head>
- <title>Login Successtitle>
- head>
- <body>
- <p align="center"><font color="#000080" size="5">Login Successful !font>p>
- <h1> Welcome to <%=request.getParameter("username")%> h1>
- body>
- html>
5、访问下面连接 http://localhost:8080/s2ajax/showAjaxLoginForm.action
posted @
2007-12-05 00:01 怡众科技 阅读(982) |
评论 (0) |
编辑 收藏
http://www.theserverside.com
权威的的J2EE站点,有最新的消息发布和很多技术文章以及很好的论坛,进行J2EE相关技术
的全方位的讨论,也有电子书可以下载。
http://www.javaworld.com
很著名的国外的java技术站点。有一段时间由于一些原因停止了更新,不过不久前有开始了
更新的工作。
http://www-900.ibm.com/developerWorks/cn/java/index.shtml
IBM公司的developerWorks Java技术专区,有很多关于J2EE的技术文章,并且文章的质量很
高。
http://www.jdon.com
国内不错的J2EE技术站点,有很多技术文章和源代码。以前推出过汉化的JIVE版本,现在有
了自己的J2EE框架产品。
http://www.huihoo.com
专注于中间件技术的站点和论坛,国内开源软件做的相当不错的组织,推出了自己的J2EE服
发信人: petbear (雨中的人), 信区: J2EE
标 题: J2EE学习经验和流程
发信人: oosky (天天), 信区: J2EE
标 题: J2EE站点资源
发信站: BBS 水木清华站 (Wed Mar 31 17:23:27 2004), 转信
Java Ftp
ftp://java:java@219.224.190.248:4021 (欢迎大家使用)
很多JAVA资源,感谢前辈的工作:)
务器产品JFox以及相关的
OpenSource 产品。
http://gceclub.sun.com.cn
SUN的中文技术社区,有SUN 的技术人员的支持维护,很多不错的文章,在线讲堂栏目办的
很有特色。推出了新
版的技术论坛,但是人气一直不是很旺。
http://www.cnjsp.org
以前做过JSP的论坛,现在定位于Java技术服务,提供一些J2EE的技术文章,还不错。
http://www.chinajavaworld.net
应该是国内最著名和热门的java技术站点了,有很j2ee的信息和技术文章和很好的论坛。
http://www.csdn.net
程序员都知道的网站:)也把它列进来。有最新的java业界动态和技术文章可以查找。
http://cwiki.apache.org/S2WIKI/projects-using-webwork-or-struts2.html
自己喜欢的地方,收藏
http://sourceforge.net
很不错的开源社区
posted @
2007-12-04 23:15 怡众科技 阅读(241) |
评论 (0) |
编辑 收藏
作者:lgx522 发表时间:2007年04月19日 18:04 回复
原贴网址: http://www.jdon.com/jivejdon/thread/31553.html
经过数年的“框架大战”,Java界的各种框架找到了自己应有的位置。
Spring+Hibernate+Struts已成为Java开发的主流体系。在这个体系中,Spring+Hibernate的地位应该说短期内是难以撼动了。除了新兴的Jboss Seam作为挑战者之外,几乎难有劲敌。有趣的是当初Spring、Hibernate作为挑战者,将官方的EJB成功挑落马下;这次反倒是官方的EBJ3成了挑战者,不知结局如何。
Java B/S编程中历来战火最激烈的其实还在Web层,框架的数量最多,争议最大。
一切由Struts而起,而Struts最终也坐稳了第一个时代的王座。在技术层面,Struts 1.x已经被无数人抱怨过、批评过,但终于还是稳坐王位,这充分说明了习惯的力量。“稳定压倒一切”,这句话在IT技术领域仍旧适用。
其实IT应用技术,什么新鲜玩意并不难学。难的是标准化和规范化。每个程序员都有自己的思路和习惯,写出来的代码自然是五花八门。Java何以成为编程界的老大,很重要的一点在于Java的规范化。这种规范化很高的语言适用于多人合作的大型项目,便于沟通和理解,也就便于集成和维护。Java世界为什么会框架横飞,说到底还是规范化的需要。纯JSP和Struts写Web谁快,摆明了是JSP。那撑饱了用Struts?原因在于100个人写出来的JSP,有100种写法;而100个人写出来的Struts,基本相似。Struts之成功,正缘于其在Java Web层的规范化方面所做出的贡献。
然而长江后浪推前浪,Struts 1.x的技术缺陷毕竟是隐患。
Sun力推JSF,打算一雪Web层框架缺失之耻。可惜JSF既要沿用Swing的技术路线,又要学ASP.NET,还要照顾产商的IDE,结果搞了个四不象,弄得里外不是人。当然Sun的技术实力毕竟是超强的,只要别重蹈EJB的覆辙,拿出点专断的精神(像这两年的NetBeans),做出像Swing那样水准的东西,JSF当大有作为。JSF现在比较有优势的是对Ajax的集成,这一点走在了其他框架的前面。
而Struts就更没有志气了,把WebWork换了个标签,凑出个Struts2,Bug多多。说实在话,根本不如原版的WebWork。如果不是靠了原先的fans捧场,根本就没得混。不过Struts原本就不是以技术取胜的,靠的是抢占先机带来的习惯优势。如果原先的fans们在这两年内都能转到Struts2,那么Struts二世仍将雄霸天下。
综上所述,未来两年,JSF与Struts将展开Java Web框架的最终战争。
以笔者愚见,结局有二:一是不论Struts还是JSF获胜,Java Web层都将结束混战的局面,这对Java Web开发的标准化是非常有利的,并有助于巩固Java在B/S界的地位;二是Struts1.x、Struts2、JSF三分天下,必然从整体上削弱Java在B/S界的竞争力,并将进一步被RoR、ASP.NET、PHP所蚕食。
posted @
2007-12-04 23:05 怡众科技 阅读(196) |
评论 (0) |
编辑 收藏
Design Pattern Practice
1.序
本文从一个简单的多列排序的例子入手,由浅入深地讲解Design Pattern(设计模式)的目的、分析和实践。
文中的例子用到Compositor Pattern和Decorator Pattern。
同时,文中的例子也提供了一类问题(条件组合问题)的解决方案。
2.问题的引入
Design Pattern(设计模式)的目标是,把共通问题中的不变部分和变化部分分离出来。不变的部分,就构成了Design Pattern(设计模式)。这一点和Framework(框架)有些象。
下面举个排序的例子,说明如何抽取问题中的不变部分。
假设一个Java类Record有field1,field2,field3等字段。
public class Record{
public int field1;
public long field2;
public double filed3;
};
我们还有一个Record对象的数组Record[] records。我们需要对这个数组按照不同的条件排序。
首先,按照field1的大小从小到大进行升序排序。
排序函数如下:
void sort(Record[] records){
for(int i =…){
for(int j=…){
if(records[ i ].field1 > records[ j ].field1)
// swap records[ i ] and records[ j ]
}
}
}
其次,按照field2的大小从小到大进行升序排序。
void sort(Record[] records){
for(int i =…){
for(int j=…){
if(records[ i ].field2 > records[ j ].field2)
// swap records[ i ] and records[ j ]
}
}
}
再次,按照field3的大小从小到大进行升序排序。
...
这种要求太多了,我们写了太多的重复代码。我们可以看到,问题的变化部分,只有判断条件部分(黑体的if条件判断语句)。
我们可以引入一个Comparator接口,把这个变化的部分抽取出来。
public interface Comparator(){
public boolean greaterThan(Record a, Record b);
};
sort函数就可以这样写(把判断条件作为参数):
void sort(Record[] records, Comparator compare){
for(int i =….){
for(int j=….){
if(compare.greaterThen(records[ i ], records[ j ]))
// swap records[ i ] and records[ j ]
}
}
}
这样,对应第一个要求――对records数组按照field1的大小排序。
我们可以做一个实现Comparator接口的CompareByField1类。
public class CompareByField1 implements Comparator{
public boolean greaterThan(Record a, Record b){
if(a.filed1 > b.filed1){
return ture;
}
return false;
}
}
sort函数的调用为:
sort(records, new CompareByField1());
这样,对应第一个要求――对records数组按照field2的大小排序。
我们可以做一个实现Comparator接口的CompareByField2类。
public class CompareByField2 implements Comparator{
public boolean greaterThan(Record a, Record b){
if(a.filed2 > b.filed2){
return ture;
}
return false;
}
}
[code]
sort函数的调用为:
[code]
sort(records, new CompareByField2());
按照C++ STL的叫法,这里的sort称为算法(Algorithm),records称为容器(集合),Comparator称为函数对象(Function Object)。
JDK的java.util.Collections类的sort方法和java.util.Comparator接口就是按照这样的思路设计的。下面我们来看看如何应用sort和Comparator解决多列排序问题。
|
|
Re: 这么多设计模式,我的看法和理解 |
发表: 2004年07月09日 18:37 |
回复 |
|
3.多列排序问题
3.1排序条件的数量
我们知道,SQL语句能够实现强大的排序功能,能够按照不同字段的排列进行排序,也能够按照升序,降序排序。比如下面的语句。
order by field1 asc, field2 asc, field3 desc。
这个排序条件按照field1的升序,field2的升序,field3的降序排序。
注意,排在前面的字段具有较高的优先级。
比如,两条纪录A和B,满足如下条件:
(1)A.field1 > B.field1,(2)A.field2 < B.field2。
这时如果按照order by field1, field2语句排序,那么 A > B。
如果上述条件中的(1)A.field1 > B.field1变化为A.field1 == B.field1。这时,条件(2)就会起作用。这时,A < B。
我们来看看在Java中如何实现这种灵活而强大的排序。
我们还是以上一节的Record类为例。Record类有3个字段,我们来看一看,有多少种可能的排序条件。
(1)按field1排序。(2)按field2排序。(3)按field3排序。(4)按field1,field2排序。(5)按field1升序,按field2降序排序…...
各种排序条件的排列组合,大概共有30种。而且,随着字段个数的增长,排序条件的个数呈幂级数的增长。
按照上一节的sort和Comparator方法,如果我们需要达到按照任意条件进行排序的目的,那么我们需要为每一个排序条件提供一个Comparator,我们需要30个Comparator类。:-)
当然,我们不会这么做,我们能够进一步提取这个问题中的相同重复部分,优化我们的解决方案。
3.2 问题分析
我们来分析这个问题中变化的部分和不变的部分。
上面所有的排序条件中,不变的部分有3部分:
(1)A.field1和B.field1的比较,
(2)A.field2和B.field2的比较,
(3)A.field3和B.field3的比较;
变化的部分有两部分,
(1)这三种比较条件的任意组合排列,
(2)升序和降序。
根据这段分析,我们引入两个类,ReverseComparator类和CompositeComparator类。
CompositeComparator类用来解决字段的组合排列问题。
ReverseComparator类用来解决字段的升序、降序问题。
3.3 ReverseComparator类的代码
import java.util.Comparator;
public class ReverseComparator implements Comparator{
/** the original comparator*/
private Comparator originalComparator = null;
/** constructor takes a comparator as parameter */
public ReverseComparator(Comparator comparator){
originalComparator = comparator;
}
/** reverse the result of the original comparator */
public int compare(Object o1, Object o2){
return - originalComparator.compare(o1, o2);
}
}
3.4 CompositeComparator类的代码
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
public class CompositeComparator implements Comparator{
/** in the condition list, comparators' priority decrease from head to tail */
private List comparators = new LinkedList();
/** get the comparators, you can manipulate it as need.*/
public List getComparators(){
return comparators;
}
/** add a batch of comparators to the condition list */
public void addComparators(Comparator[] comparatorArray){
if(comparatorArray == null){
return;
}
for(int i = 0; i < comparatorArray.length; i++){
comparators.add(comparatorArray[i]);
}
}
/** compare by the priority */
public int compare(Object o1, Object o2){
for(Iterator iterator = comparators.iterator(); iterator.hasNext();){
Comparator comparator = (Comparator)iterator.next();
int result = comparator.compare(o1, o2);
if(result != 0){
return result;
}
}
return 0;
}
}
3.5 Comparator的组合应用
这一节讲述上面两个类的用法。
对应前面的排序问题,我们只需要3个Comparator类:
(1)Field1Comaprator;
(2)Field2Comaprator;
(3)Field3Comaprator。
下面举例说明,如何组合这些Comparator实现不同的排序条件。
(1)order by field1, field2
CompoiComparator myComparator = new CompoiComparator();
myComparator. addComparators(
new Comparator[]{
new Field1Comaprator (), new Field2Comaprator ()};
);
// records is a list of Record
Collections.sort(records, myComparator);
(1)order by field1 desc, field2
CompoiComparator myComparator = new CompoiComparator();
myComparator. addComparators(
new Comparator[]{
new ReverseComparator(new Field1Comaprator ()),
new Field2Comaprator ()};
);
// records is a list of Record
Collections.sort(records, myComparator);
这里提供的ReverseComparator类和CompositeComparator类都采用了Decorator Pattern。
CompositeComparator类同时也是Composite Pattern。
4.过滤条件的排列组合
过滤条件问题也属于条件组合问题的范畴。比如JDK提供的java.io.File类提供了一个文件过滤方法listFile(FileFilter),用户可以定制不同的FileFilter,实现不同的过滤条件,比如文件时间在某个范围内;文件后缀名,文件名符合某种模式;是目录,还是文件,等等。
同样,我们可以应用上述的解决方法,实现灵活的过滤条件组合――用一个CompositeFilter类任意组合过滤条件,用一个ReverseFilter类作为排除条件。
4.1 CompositeFilter类的代码
import java.io.FileFilter;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
public class CompositeFilter implements FileFilter {
/** in the filter list, every condition should be met. */
private List filters = new LinkedList();
/** get the filters, you can manipulate it as need.*/
public List getFilters(){
return filters;
}
/** add a batch of filters to the condition list */
public void addComparators(FileFilter[] filterArray){
if(filterArray == null){
return;
}
for(int i = 0; i < filterArray.length; i++){
filters.add(filterArray[i]);
}
}
/** must meet all the filter condition */
public boolean accept(File pathname) {
for(Iterator iterator = filters.iterator(); iterator.hasNext();){
FileFilter filter = (FileFilter)iterator.next();
boolean result = filter.accept(pathname);
// if any condition can not be met, return false.
if(result == false){
return false;
}
}
// all conditions are met, return true.
return true;
}
}
4.2 ReverseFilter类的代码
import java.util.Comparator;
public class ReverseComparator implements Comparator{
/** the original comparator*/
private Comparator originalComparator = null;
/** constructor takes a comparator as parameter */
public ReverseComparator(Comparator comparator){
originalComparator = comparator;
}
/** reverse the result of the original comparator */
public int compare(Object o1, Object o2){
return - originalComparator.compare(o1, o2);
}
}
|
|
|
posted @
2007-12-04 22:48 怡众科技 阅读(1306) |
评论 (1) |
编辑 收藏