java学习笔记(四)

 

话说2000年之时有一个开源MVC框架吸引了诸多开发者的眼球,接着一系列它的周边开源东西开始出现,一时间其火爆程度不可一世。它就是Struts,我讲了一下它的历史并不是想说它多么的火爆,而是想说它已经是过去的东西了,虽然使用它的人还是很多很多……

我们要向前看,不能居于过去的东西,当然如果你有精神去阅读他的源码,那么大可去读,毕竟可以学习到很多的东西。但是我还是要说,有那个精力你最好去阅读一下Spring的或者google的某些东西,比如guice。当然我没有阅读过Struts的源码,因为我是一个很懒的程序员,使用一个东西没有必要去阅读它的源码,除非你真的需要学习一些东西或者精力过剩觉得自己的头发掉的不够多……

Struts是一个MVC理念的框架,这个在很多很多的面试题中都被问烂了。其实MVC的理念很简单,将显示和后面的数据模型分离,然后用一个控制器来协调他们之间的某些动作。这样理解起来就简单了。当然数据模型可以是任何的东西,甚至是一个包含商业逻辑的东西。但是不要把Struts想得太复杂了,它做的事情很简单它将一个JSP与后台的一个FORM中的数据做了绑定,Action来处理一些需要的动作。

JSP只是在忠实的执行者自己的责任,显示数据,当然你想在里面增加一些AJAX特性也是可以的。FORM记录着这个时候数据模型的状态,而Action就是协调和处理两者变化的纽带。OK,其他MVC的东西你可以不去刻意研究了。


下面我们来看看Struts是通过什么将他们联系在一起的,其实这个东西也很简单一个StrutsConfig.XML文件,当然一个应用可以包含多个这种文件。这个文件中声明的就是一个FORMJSPAction之间的关系。我们来看一下它的一个节点:

<action-mappings>

<action name="AForm" parameter="method" path="/AAction" scope="request" type="com.XXX.action.AAction " validate="false">

<forward contextRelative="true" name="success" path="/A.jsp" />

<forward contextRelative="true" name="index" path="/B.jsp" />

</action>

<action parameter="method" path="/BAction" scope="request" type="com.XXX.action.Cction" />

</action-mappings>


这就是一个最关键的节点,如果你只在别人构建好的结构下做二次开发的话,那么搞明白它就可以应付大部分工作了。path这个属性定义的是访问这个ActionURI,当然它只是一个URI的结尾部分。完整的URI是由服务器的URI加上你的web应用的URI来决定的


scope作用域基本不会有人去改动它,name指定的是我们的Model也就是FORM,这个由form节点来定义,form的定义应该很好读懂,就是一个类的具体位置,我们再给它的实例起一个别名,也就是这个AFormtypeAction的具体类路径,validate声明是否使用Struts的校验框架。接下来是两个forward,这个就是指定了返回不同mapping对象时候跳转的不同页面。


看到它是怎么把三部分绑在一起了吧,其实它很简单,也很死板。这样三个东西就是一根绳子上的吗咋,不允许过多的重用。


XML其实是一种很好阅读的东西,不要被它吓倒,其实它很友好。见到了不管是什么东西的配置文件,第一件要做的事情是弄清他们节点的意义,一旦你明白了这些节点的意义就很容易了解他们。其实很多的框架都是使用XML作为配置方案的,通过阅读它们的配置文件你很快就能熟悉一种框架中各个部分的关系,这是我最短时间熟悉新框架的秘密!


再说一下初学者容易干的一些事情:


1.为每一个页面都定义了一个form,其实很多form的属性是重复的。其实form就是一个pojo一个简单的数据载体,如果页面使用的数据模型一样的话我们大可使用一个form。还有就是form中的数据比页面上多无所谓,但是form中的属性要是比页面少就会有问题。

2.把很多的动作都写到了一个Action中,当然这样的写法没有任何的错误,还可以减少StrutsConfig的文件容量。但是有些公用的东西分开写会给你节省很多时间,因为你只需要在Stringconfig中重新装配一下它就可以在别的页面后面很好的工作。虽然这样做有些不同于主流的写法,但是我希望大家都思考一下,其实一个程序的开发不应该是先有strutsconfig,而是应该先有所有的功能点,每一个按钮的操作都作为独立的Action,然后用strutsconfig把他们组装在一起。这样开发或许我们能节省一些时间并集中一些代码的修改。

3.Action中夹杂太多的业务逻辑,这个是很多人愿意做的事情,但是请你们记住每一个Action实例都是一个唯一的,在他们中柔和大量缓慢的代码是会让你的系统出现性能瓶颈的关键原因。所以我们应该把业务逻辑抽离出来,这样做还能够将修改集中。我说了两次修改集中和代码集中,其实这是一个开发中很容易被忽略的东西,当然在他们项目最后时刻被弄得焦头烂额的一刻或许他们会记得容易修改的模块应该集中起来。

4.要严格遵循谁建立谁销毁的原则,有人喜欢把form当作数据载体传来传去,这是一件很危险的事情,因为你不会预知它在什么时候做了什么样的改变,更不能保证这些改变是你想要的。所以请将它作为一个Struts中的数据载体使用,不要超越了显示的界限。当然Java的编码中还有一个原则就是变量作用域最小化,这个与form的使用有着一样的原则。

5.页面中select标签对应的form中的collection必须要初始化,不然你会无法显示页面。

最后我还有一些建议:

1.不要去背Strutstag,其他的也一样,因为开发中你很容易去找到tld文件查看或者找到其他的页面代码参考。脑袋的容量是有限的,没有必要为了无所谓的东西去记忆,找这样一段代码的时间绝对不会比你找一个异常的来源多什么。

2.如果你没有接触过任何一种开源框架,那么Struts你需要了解的就更多。它可以作为一个学习的基础,因为很多框架的配置方式与它十分类似。

下一篇我会说明一下Struts处理一个请求的的简单工作流程,我没有读过它的源码,但是大体的流程是不会错误的,因为我知道这类型框架处理请求的秘密!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值