【IT168 专稿】有很多初学Java朋友都很迷茫,如何才能学好Java,该去学哪种Web框架,,“Struts,Webwork,Tapstry,Spring MVC等哪个才是能到达彼岸的船票?”,俗话说“物之本质、事之根源”,学习Java也一样,要从基础学起,理解Servlet,Jsp,所谓的框架将会迎韧而解。
初学Java,三月不知肉味 刚接触Java时,就被Java迷住了。第一时间从china-pub订了本《Thinking In Java》,收到书时,被吓了一跳;因为它太厚了,我不知道能否坚持把它读完,这本书不是推荐给初学者学Java基础的吗?然后开始从网上下载JDK搭环境,重装系统。因为classpath总是设置不对,不知道重装了多少次系统,现在想起来,自己当时真是十分的蠢笨啊。
当时的编辑工具,就是记事本。既然是初学就要拿出一点态度,听说牛人都是用记事本编程的,于是我就选择了记事本作编辑工具。当年上学时,用Basice在作业本上写了一个上万行代码的工资管理程序,因为上机时间太少,只能把代码写在作业上,然后再去机房录入调试。花了一个月的时间把《Thinking In Java》看完了,书上的代码一个一个敲完了,每章后的习题每道都测试过。
发现自己除了知道什么是继承,封装,多态,抽象类,接口这些外,应用上的就一概不知了。自嘲又会用一种语言写Hello World!外。现在想起来,《Thinking In Java》并不适合初学者,但是《Thinking In Java》是必须精读的。在学习中间还有一个小小的插曲,有一天,一个朋友给了我一份Java经典面试题,我尝试自己去做这份试题,结果我发现,能做出来的没有几个。于是痛下决心,重新再读《Thinking In Java》,这一次读《Think in Java》使我茅塞顿开。这时才真正的发现《Thinking In Java》是一本好书。虽然学了几个月的Java,仍然还不能用Java写一个完整的程序出来,几个月的Java学习中,没有用过Jbuilder,更不知Eclipse,IDEA!为何物,真是三月不知肉味啊!
1
结缘于JSP
提起JSP,不能不说Servlet。开始接触Java觉得Servlet是一个非常深奥的技术。我曾经想学习网页设计,看到HTML哪些松散的标记,我放弃了,最终也没有学会做网页。只知道网页编辑工作有Drameware 或FrontPage。我最多只能用它来画几个表格,打几个字上去,根本就不会什么布局或美观啦。
当接触Serlvet后,发现做网页竟然也可以像写Java程序一样进行编写。完成第一个用Servlet写的WEB版的HelloWorld 程序,足足花费了我半天时间。主要是花费在环境搭配上面。一个小小的HELLO World ,用Drameware可能也就一分钟就能搞定的事。对于一个完全不懂HTML的人来说,要想用Servlet来开发动态WEB应用还是太难了。
很快就接触到了JSP,JSP对于像我这种不懂HTML的人来说就像救星一样。JSP并不需要我在Java程序里写HTML代码,而是变成了在HTML中写Java程序。比起标记语言来说,我还是更习惯于强类型的高级语言,JSP就这样把我迷上了。
初学时,所有的数据库连接,数据库访问,数据显示,业务代码和HTML标记等都写在JSP代码中,感觉JSP真是无所不能。在做一些小应用时,开发速度也非常的快。而当遇到了比较复杂的业务逻辑后,JSP开发就像是一个恶梦,每天大量的工作就是调试页面,当其它页面需要类似的功能时,进行代码拷贝来进行代码的复用,后来才知道这就是典型的Model 1模型。
当把JSP与Servlet相结合后,一切都发生了改变。JSP仅用于数据展示,而Servlet用于进行业务调用和页面流程控制,这就是所谓的Model 2模型。原来JSP并不是Servlet的替代品,JSP更需要与Servlet进行合作。再明白了Servlet与的重要后,才回过头开始去学习Servlet,包括Servlet的生命周期,Servlet的重要接口及方法,自定义标签等。
第一个真正的Web项目是开发一个小型的论坛。论坛的功能十分简单,就是完成用户注册,用户登陆,注销,悄悄话,新闻发布,精华贴,论坛管理等基本功能。从这个论坛的开发才使我终于了解JSP内置对象、JSP动作与JSP指令的不同、对象的作用域、session的使用以及用Servlet读取配置文件等,同时也理解了get和post的不同,理解了为什么要MVC。总之,这个项目的完成是对WEB开发不仅仅是JSP,还深入的学习了HTML和Javascript最好的总结。也是到后来在Spring及appfue等开源项目后,才知道为什么这些优秀的开源框架只能诞生在国外,而这些所谓的大师对HTML,Javascript的理解和运用已都达到炉火纯青的地步。
1
与Struts的亲密接触 由于当时上网看招聘信息,J2EE相关职位的都要求懂Struts。所以才开始学习Struts。学了之后发现Struts的确是当时最优秀的框架,开发人员再也不用对每个方法都写一个Servlet类了。同时,请求成功或失败后的页面跳转不用写死在代码中,而是可以通过Struts-config.xml来进行配置,表单组件可以自动的绑定成actionForm对象和自定义数据校验逻辑。Struts还提供了一个通用的数据校验框架和丰富的显示标签(也是我主要花费时间的学习点)。Struts显示标签比当时的Jsp 表达式的确是进步很大,所以在Jsp页面里使用像HTML那样的标签已经代替了’<% %>’这些表达式语言了。当jstl出现后,jstl的类似c语言似的标记语言要比Struts显示标签优秀得多。Struts显示标签不能自动处理null值问题,Struts显示标签的复杂性也是花较多时间去学习Struts的一大缺点。
综上,虽然我用Jsp+Servlet开发的时间要比用Struts进行开发的时间长得多,但是不得不承认Struts确实是一个非常优秀的框架。
理解Web开发 基于HTML::Web应用是基于HTML的,因为不管是Jsp还是asp,asp.net还是jsf都是在服务器端把相应的代码解释成HTML代码,然后在客户端通过浏览器解析显示出来。
无状态编程:不管采用什么技术,Web开发终究是无状态编程。也就是在客户端并不能保持应用程序的任何状态。相对比下,在swing或VB等桌面开发时,客户程序可以通过变量来保持系统的状态,而基于HTML的Web应用是无法保持状态的。Web应用状态都需要由应用服务器来保持。
请求响应及推/拉模式:在swing或VB等桌面应用程序中,当某一状态发生改变时,后台程序可以触发系统更新前端的UI组件,甚至可以使用观察者模式,当某一状态发生改变时,通知所有需要更新的前端UI组件,加载数据刷新组件。完成UI组件的更新,用户可能没有做任何动作,这就是推模式。而Web应用正好相反,用户从客户端发出一个请求,服务器接到客户端的请求后,读取请求参数,调用业务方法,获得业务数据,用业务数据重新生成新的HTML页面,呈现给客户端,由浏览器进行解析显示,这就是拉模式。请求响应的拉模式是Web应用最大的特点,任何请求的页面在发出请求后,请求页面所有组件的状态都被刷新而无法得以保持。
MVC:MVC即Model模型数据,View 视图,Controller 控制器。MVC模式让每一个组件都有了一个明确的职责,模型数据不含有视图特有的代码,视图不含有控制代码或数据访问代码,主要是显示模型数据。控制器接收请求,获得数据,进行视图转发。
1
模型含有由视图显示的数据,在J2EE Web应用中,模型一般是JavaBean。Web应用中的模型一般表示一个完整的业务操作的结果对象。这个结果对象通常不是一个真实的领域对象,而是一个只getter,setter方法的对象(如值对象),通常称为伪数据对象。模型没有必要进行进一步的操作,如数据访问等,模型也不应该依赖Serlvet或某一WEB应用框架.
视图用于呈现模型数据,负责生成标签或其它内容。视图不需要了解控制器或业务对象。视图不应该直接处理请求参数,而是应该由控制器去做。也不应该进行数据查询,如sql查询,视图不应该处理数据查询异常。显图只需要执行必要的显示逻辑,把模型数据通过一定的逻辑呈现给用户。
控制器是WEB应用中的中枢神经,Web应用控制器的主要职责:校验及获取请数参数,调用业务对象进行业务处理,把从页面获得的请求参数传递给业务对象。通过业务调用获得数据或创建模型数据。在需要保持服务端状态的应用中,创建或操作session状态。创建一个视图,由视图来使用模型数据。
Front Controller前端控制器与命令模式:采用纯Servlet和JSP的Model 1进行Web开发都是非常复杂的。不可能实现Java开发人员与UI开发人员角色的分离。采用纯serlvet这种纯Java对象中配合HTML标记进行Web开发是非常笨拙的,这样将十分难以维护。采用纯JSP来开发Web应用,JSP可能很容易的嵌入HTML代码,并通过Jsp表达式可以很容易的生成HTML内容,JSP还定义了对象的作用域。关键是可以在Jsp中编写任何Java代码,相比纯Servlet来说,用JSP开发要轻松多了。但是把所有业务代码编写在JSP中,仍然不能把Java开发人员与UI开发人员进行分工。业务方法无法进行测试和重用,代码重用只能是简单的代码复制,这样的Web应用仍然难以进行维护。
采用Jsp+Servlet的MVC模式进行开发,Java开发人员负责开发Servlet,而UI开发人员设计HTML和编写JSP,每一个请求对应一个Servlet,由Servlet调用业务对象,获得业务数据,并选择视图进行转发。在这里JSP没有了任何业务代码,仅仅是显示数据。这样通过JSP与Servlet相结合的MVC模式,可以让Java开发人员与UI人员进行分工,也便于了业务代码的测试。但是每一个请求都对应一个单一的Servlet,需要产生大量的Servlet类,把许多方法分散到多个Servlet类中,需要对相似的请求过程编写独立的方法,不能进行方法的重用。从而产生大量的重复代码,大量的Servlet配置将非常烦琐,从而需要对大量的Servlet进行维护。如果有一个控制器来接收所有的请求,根据请求的参数,把请求传递一个委托对象,由委托对象来完成以前控制器完成的工作。这个控制器一般由一个Servlet来完成,这就是前端控制器模式。
这个前端控制器作为一个Web应用的处理中心,用来处理所有相关的请求,对所有请求进行集中控制。前端控制器相当于Web应用的集中处理器,完成所有请求的控制,对所有请求都需要处理的逻辑可以在端控制器中完成。把请求对象传递给委托对象。这个委托对象就像以前的控制器那样工作,也就是命令模式的运用。通过这种方式,一个WEB应用只需要配置一个前端控制器(当然有必要时可以多个),具体的控制逻辑交给委托对象去完成,我把这个委托对象称为控制器,可以很好的实现代码重用,Java开发人员与UI开发人员的真正分离,让开发人员只关心真正的业务实现。而业务对象是真正的POJO对象,可以方便的进行单元测试。
其实,几乎所有WEB框架都是基于前端控制器,命令模式的MVC运用,如Webwork,Spring MVC,Struts。
1
理解WEB层 WEB层应该是一个很干净的层和很薄的层。控制流和业务调用与视图显示必须分离出来。Java类用来控制流程和进行业务调用,不应该在Java类中生成HTML等视图标签。JSP页面等视图仅包含显示标签和简单的显示逻辑。
其一,WEB层应该只含有需要的控制逻辑,而不应该有业务逻辑。因为WEB依赖于Servlet API。Servlet 是很难以进行单元测试的,而WEB层含有业务逻辑,所以业务逻辑依赖于Servlet API,业务逻辑就很难以进行测试。对比之下,如果由一个普通的JAVA对象来实现业务逻辑,则十分容易进行单元测试。
其二,降低了代码的可重用性。Servlet的代码是很难以进行重用的,即使是使用委托对象进行流程控制的WEB层,如果一个普通Java对象的业务对象去调用一个依赖于Servlet 的控制类,就对原本干净的业务对象深度侵入而破坏业务接口。
其三,WEB层的变化是频繁的,而业务层的则是相对稳定的。通常业务对象是面向接口的。可能WEB层的修改而导致业务逻辑的错误。
其四,无法进行统一的事务处理。如果业务对象是普通的JAVA对象,则可以通过AOP等来进行声明式事务管理,从而进行统一的事务处理。
以上就是我的WEB学习经历,也是最重要的一段经历。可在这里为什么不提 SPRING MVC,WEBWORK和将会流行的JSF呢?其实它们都是基于JSP及Servlet的运用,相信有扎实的JAVA基础,深入的理解JSP,Servlet,HTML比学习任何框架都要重要。我在这里并不是反对学习WEB框架或者是反对运用框架进行开发,而是说这些基础的学习可以让你能够更快的掌握一个新的WEB框架。理解WEB 开发及WEB层的特点,可以让你更好的进行WEB开发。
就算是像ASP.NET和JSF号称的事件驱动模型,最终它也没有脱离开WEB应用的特点,它们仍然是请求响应模式。它们只是通过提供丰富的WEB组件及可视化的IDE使得WEB开发像桌面应用开发一样。总之,掌握Web开发的关键是掌握Web应用的特点及Web应用的关键技术,而不是掌握一两个框架。所以花费些力气去学习Java基础,学习Jsp,Servlet,甚于学习HTML,Javascript对进行Web开发都是十分必要的,因为磨刀不误砍柴功。
|