由于 Struts 将实现于页面分离,又是以提交驱动的方式,所以不能象 jsp、php 那样直接设置首页为 index.jsp 或 index.php 就可以的。需要访问 struts servlet 并执行后台应用后由后台定向到前台 jsp 文件,所以首页的配置就出现了一点小问题。
大多数人想到的方法是建立 index.jsp (或 html)文件,当访问这个文件时定向到 Struts 后台 action。虽然也能解决问题,不过并不完美。因为地址栏 url 将会变成定向后的 url。如 index.jsp 中定向到 index.do ,那么访问 http://www.mxjava.com 后,url 将变成 http://www.mxjava.com/index.do。
Continue Reading »
在《中小网站静态化目录结构设计》中我们以 Struts2 为例简单地介绍了通过后台解析 url 转向到 html 文件真实地址的方法。由于 Struts2 参数传递方式让 url 看上去不是很友好,那么今天我们还是按照这个思路,打造友好的 url 。
UrlRewrite 功能强大的 url 工具,它可以根据喜好,自由地设计 url 。由其需要说明的是,通过 UrlRewrite 的配置功能,我们可以为网站设计不同的 url 。关于 UrlRewrite 的配置请参见官方网站 http://www.tuckey.org/urlrewrite/(不过最近好像被河蟹了,不要紧大家可以通过 http://www.web4proxy.com/ 来访问)。
继续以《中小网站静态化目录结构设计》中的例子为例,Struts2 解析的 url 格式为:http://www.mxjava.com/blog.do?uid=hiswing&id=20100807100 “?”号后面跟着的是参数,这样的 url 用在企业内部系统中还可以,但在以 seo 为上的互联网世界里,显然不是很友好,我们需要对它进行改进。
Continue Reading »
大型网站每天的访问量是惊人的,比如淘宝网每日独立IP超4000万。对于一些中小型的网站来说,虽然每日独立IP不会如此巨大,但若不对网站程序进行优化,也将会导致访问的速度。
目前很多网站都会进行静态化从而解决服务器的压力,也有一些网站采取了缓存的方式,有实力的企业在这两种基础之上增加服务器集群。我们今天想要探讨的并不是缓存,也不是集群,更不是如何静态化页面,而是如何设计静态化页面的目录结构。
举个例子,比如博客类网站,这种网站每天都会有很多用户注册,也会有很多用户发表日志。一般我们会在用户点击发表日志后对该日志进行静态化,生成 html 文件。这时问题来了,生成的 html 文件放在什么地方?先来回顾一下访问 web 上的 html 文件的方法。比如 mypage.html 这样一个 html 文件,放在 web 的根目录(以 mxjava 为例),访问时要在地址栏中输入 http://www.mxjava.com/mypage.html 。将该文件转移到 blog 目录下后,访问时就要变成 http://www.mxjava.com/blog/mypage.html 。也就是说 url 是按照目录结构进行访问的。回到刚才的博客程序,为了能让访问者能够访问到刚才生成的 html 文件,我们可以把该文件放在网站的根目录,这时访问者只要输入网站 url + html 文件名就可以浏览这个文件了。这样做虽然简单,但有很多问题,比如所有的 html 放在同一个目录下会导致文件“爆炸”,对文件的管理困难,url 中没有用户的博客地址信息可能会让用户离你而去等。问题很多,最直接的解决方案是为每位注册用户建立一个目录,将用户的 html 文件保存到对应的目录中。这时访问时 url 将变成 http://www.mxjava.com/用户名/mypage.html。url 中出现了用户博客信息也解决了文件放在同一目录下的尴尬。这样的解决方案看起来不错,但问题仍然存在,假设该网站每天会注册一百个用户,十天就一千个,一百天就一万个。将这一万个目录都放在网站根目录下看上去也很可怕,况且日子一天一天过,用户还在增加,目录也在增加……由于目录数量的庞大,也许不久后,网站会崩溃,系统也会瘫痪。
Continue Reading »
我不想说如何配置 Struts2 处理的 url 后缀名,因为关于这方面的文章太多了,今天我说一说如何配置 Struts2 不处理的 url 后缀名。
在 struts.xml 或 struts.properties 配置文件中配置 struts.action.extension 项可以设置 Struts2 处理的 url 请求后缀名,
如:struts.action.extension = action, do
这样 url 是这样:http://www.mxjava.com/index.do
很多网站的 url 是没有后缀的,比如利用 ror 开发的网站的 url 类似这样:http://www.mxjava.com/index 。这样的 url 对搜索引擎更加友好。其实利用上面讲的 struts.action.extension 也可以让 Struts2 的 url 变成这样。很简单,只要将 struts.action.extension 设置为空即可。
如:struts.action.extension =
此时 url 是这样:http://www.mxjava.com/index
问题来了,服务器的某个目录下有个 html 文件是希望被访问的,这时在地址栏输入该 html 文件的地址 http://www.mxjava.com/10000.html 后画面上显示的并不是该 html 的内容,而的系统出错信息:
Struts has detected an unhandled exception:
# Messages: There is no Action mapped for namespace / and action name 10000.html.
Continue Reading »
通过《Android 开发环境的安装》我们了解了 Android 的一些基本知识,也介绍了如何安装 Android 开发环境。就从这一篇开始进入 Android 开发的学习过程。
任何一门语言或者框架的第一课都是精典的 Hello World,我们跟随主流,从 Hello World 开始吧。
有了 Eclipse 插件(Android ADT)创建并运行一个工程是十分容易的,只要简单的2个步骤就可以顺利完成 HelloWorld 。
1、单击菜单 File > New > Project 弹出的窗口选择创建一个新的 Android 项目。
2、并在创建 Android 项目的对话框里填写项目的详细信息,确认无误后按下 finish 按钮一个工程就被顺利的创建成功了。
Continue Reading »
Google 的产品天生就拥有着超高的关注度,很多程序员在 Android 手机还没有上市之前就开始学习。相对他们来说我的起步比较晚,今天刚刚开始,但相对于那些还没有开始学习的朋友来说,我的起步还不算太晚。
学习 Android 最主要原因当然是这几年 Android 手机的流行,让我感觉到它的未来不可限量。到目前为止,仅仅三年的时间,各大手制造厂家都陆续推出了自己的 Android 手机,也成为了各国移动通讯服务商争相合作的焦点。另外几个原因是首先它是开放性的,底层核心是 Linux 。再者 Android SDK 使用我常用的开发语言 — JAVA。
Continue Reading »
过去网站的换肤功能比较简单,仅仅局限于 css 的修改上。而 WordPress 的主题功能十分强大,它为制做者公开了大量的 API ,通过调用这些 API 主题制做者可以根据喜好在主题中调用不同的 API 来达到不同的效果。甚至还可以对 API 进行扩展。这样做优点是显而易见的–灵活。不过缺点也是有的,即对主题制做者的要求比较高。不仅要了解 CSS、HTML 等前端知识,更要对 PHP 有一定的了解。看看目前 WordPress 种类繁多的主题就知道这点门槛并不算什么。
我是一名 Java 开发人员,更喜欢用 Java 的方式考虑问题。如何使用 Java 实现类似功能呢?这个问题要是在十年前那并不算什么问题。在 Jsp + Bean 的时代,完全可以参考 WordPress 的实现方式实现该功能。但今天没有人会去那样做,在这个框架横行的时代,想要灵活地实现这个功能似乎有些困难。毕竟框架为开发者设定了条条框框。目前大多数 Java 的 Web 应用会使用 VSSH (Velocity + Struts + Spring + Hibernate) 进行开发,我们假定以 VSSH 框架结构来考虑如何实现这个功能。
Continue Reading »
对于 Java 来说,数据结构不象 C 语言那样需要自行实现,因为 Java 本身已经提供了丰富的数据结构。例如我们经常用来的 List、Map 等。不过自行实现一些数据结构不仅对我们的逻辑思维能力有帮助,并且让我们更加了解数据结构的底层实现。今天我们来说说 Java 中怎么利用数组来实现队列。
首先了解一下什么是队列:队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。这也就是我们平常经常用说到的先进先出原则(FIFO)。Java 中的 List 就可以作为队列来使用,在队列尾部添加元素则使用 list.add 方法,从队列头部删除元素则使用 list.remove 方法。要用数组来实现,就必需定义进和出的下标,实现方法如下:
Continue Reading »
《Java Annotation 基础》中我们简单地介绍了 Java Annotation 的作用以及 Java 标准的 Annotation 。今天我们来了解一下 xml 和 Annotation 各自作为配置项的优缺点。
首先说说 xml 。目前 web 应用中几乎都使用 xml 作为配置项,例如我们常用的框架 Struts、Spring、Hibernate、IBatis 等等都采用 xml 作为配置。xml 之所以这么流行,是因为它的很多优点是其它技术的配置所无法替代的。
1、xml 作为可扩展标记语言最大的优势在于开发者能够为软件量身定制适用的标记,使代码更加通俗易懂。
2、利用 xml 配置能使软件更具扩展性。例如 Spring 将 class 间的依赖配置在 xml 中,最大限度地提升应用的可扩展性。
3、具有成熟的验证机制确保程序正确性。利用 Schema 或 DTD 可以对 xml 的正确性进行验证,避免了非法的配置导致应用程序出错。
4、修改配置而无需变动现有程序。
Continue Reading »
配置文件的好处在于进一步降低耦合,使应用更易于扩展,即使对配置文件进行了修改也不需要对工程进行修改和重新编译。缺点也是显而易见,配置文件读取和解析需要花费一定的时间,配置文件过多时难以管理,IDE 无法对配置的正确性进行校验,给测试增加了难度。基于以上原因,Java 从1.5开始提供了 Annotation (注释,标注),它用来修饰应用程序的元素(类,方法,属性,参数,本地变量,包、元数据),编译器将其与元数据一同存储在 class 文件中,运行期间通过 Java 的反射来处理对其修饰元素的访问。Annotation 仅仅用来修饰元素,而不能影响代码的执行。只有通过其配套的框架或工具才能对其信息进行访问和处理。这一点与 xml 相同,没有 struts api 的 struts.xml 文件对程序不会起来任何作用。
Q:如何使用 Annotation ?
A:首先让我们从 Java 定义的 Annotation 开始。@Override 可能是我们最常用到的 Annotation 之一了,Eclipse 中当子类中的某个方法覆写的父类中的方法时,会亮黄灯提示。若用 @Override 修饰该方法,黄灯熄灭。再让我们来看一个例子,当我们使用 new java.util.Date(2010, 2, 25); 来初始化日期类时,Eclipse 仍然会亮黄灯提示,这是因为该方法被 @Deprecated 修饰了,表示不推荐使用。从这两个例子我们能够了解到,Annotation 是在编译期校验的。这一点最大的好处是在编译期间就可对错误进行处理。若使用 xml 的话,只有在运行期才能得到错误信息。
Continue Reading »