RoyJohnson

生命不息,奋斗不止!
posts - 4, comments - 9, trackbacks - 0, articles - 0

2007年6月17日

                                            Struts框架详解
struts-config.xml    Struts配置文件
ActionServlet  控制器
Action Class  包含事务逻辑
ActionForm  显示模块数据
ActionMapping  帮助控制器将请求映射到操作
ActionForward  用来指示操作转移的对象
ActionError  用来存储和回收错误
Struts标记库  可以减轻开发显示层次的工作

struts框架的优势
1.良好的架构和设计
2.可重用,模块化,扩展性好
3.Open source

struts-config.xml

Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握Struts-config.xml是掌握Struts的关键所在。

FormBean部分

<struts-config>
  <!--  Form Bean Definitions -->
  <form-beans>
    <form-bean name=“testform" type="com.cjea.test.TestForm" />
  </form-beans> 

全局转发部分

<!-- Global Forward Definitions -->
  <global-forwards>
    <forward   name="failure"     path="bad.jsp"/>
    <forward   name="success"     path="/good.jsp" />
  </global-forwards>

action部分

<action-mappings>
   <action path=“/test/test.jsp" type=“com.cjea.test.testAction" name="testform" scope="request">
        <forward name="success" path="/test/good.jsp" />
   </action>
<action-mappings> 
</struts-config>

 ActionServlet

ActionServlet 是struts框架 MVC 实现的 controller 部分,它是这一框架的核心。
ActionServlet 创建并使用 Action、ActionForm 和 ActionForward。

ActionServlet的基本功能

截获用户的Http请求
把这个请求映射到相应的Action类。
创建一个ActionForm bean实例,将form请求放入formbean的实例中
调用Action实例的perform()方法
将ActioForm bean,Action Mapping对象,request和response对象传给Action的perform()方法
perform返回一个ActionForword对象,根据方法执行情况转到相应的jsp页面.

 

Action Classes


Action 类是业务逻辑的一个包装。Action 类的用途是将 HttpServletRequest 转换为业务逻辑。

ActionForm

ActionForm 维护 Web 应用程序的会话状态。
ActionForm 是一个抽象类,必须为每个输入表单模型创建该类的子类。


ActionForm的使用

假定有一个由 HTML 表单设置的 TestActionForm。Struts 框架将执行以下操作:
检查 TestActionForm是否存在;如果不存在,它将创建该类的一个实例。
Struts 将使用 HttpServletRequest 中相应的域设置 TestActionForm的状态。
Struts 框架在将 TestActionForm传递给TestAction 之前将更新它的状态。
struts-config.xml 文件控制 HTML 表单请求与 ActionForm 之间的映射关系。
可将多个请求映射到 TestActionForm 。

Struts标记库
Struts框架包括自定义标签库,它可以用 在很多方面。尽管这些库并不要求用框 架,但使用它们会有助于程序的开发。

Struts标记库
struts-bean taglib:包含在访问bean和bean属性时使用的tag,也包含一些消息显示的tag。
struts-html taglib:包含用来生成动态HTML用户界面和窗体的tag。
struts-logic taglib :包含的tag用来管理根据条件生成输出文本,和其它一些用来控制的信息。
struts-template taglib包含的tag用来定义模板机制。

Bean Taglib
用于定义新bean、访问bean及其属性的标记
在struts-bean.tld中定义了它的标记库描述器
Bean Taglib主要功能
创建和复制bean的标记
脚本变量定义标记
bean翻译标记
消息国际化标记
Bean复制标记 (<bean:define>)
可定义新bean,可复制现有bean,还可从现有bean复制属性。
定义新字符串常数
将现有的bean复制到新定义的bean对象
复制现有bean的属性来创建新的bean
<bean:define>标记属性:
Id 新定义的bean脚本变量名称,必须设置
Type 定义引入脚本变量的类
Value 为id属性定义的脚本变量分配一个新的对象
<bean:define>标记属性:
Name 目标bean的名称。若value属性没有设置,这个属性就必须设置
property Name属性定义的bean的属性名称,用来定义新的bean
Scope 源bean的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域
toScope 目标bean的作用域。若没有设置,默认值是页作用域
举例
定义一个bean:
<bean:define id="test" value="this is a test"/>
源bean在页作用域中被拷贝到请求作用域中的另一个bean:
<bean:define id="targetBean" name="sourceBean"
scope="page" toScope="request"/>
脚本变量的标记
从多种资源中定义和生成脚本变量,这些资源包括cookie,请求参数,HTTP标头等等。
脚本变量的标记属性:
Id        脚本变量和要定义的页作用域                 属性的名称
Name    cookie/标头/参数的名称
Value    如果没有匹配的cookie或    数值,就返回这个属性指    定的默认值

脚本变量的标记属性:
multiple 如果这个属性设置了任意一个数值,所有匹配的cookie都会被积累并存储到一个Cookie[](一个数组)类型的bean里           若无设置,指定cookie的第一个值将作为Cookie类型的值
举例
<bean:cookie id="myCookie" name="userName"/>
脚本变量名称是myCookie,用来创建这个属性的cookie的名称是userName。
<bean:header id="myHeader" name="Accept-Language"/>
脚本变量名称是myHeader,请求标头的名称是Accept-Language.

举例
<bean:parameter id="myParameter" name="myParameter">
脚本变量名称是myPatameter,它保存的请求参数的名称也是myParameter
逻辑标记
Struts逻辑标签库包含的标记能够有条件地产生输出文本
在对象集合中循环从而重复地产生输出文本,以及应用程序流程控制
它也提供了一组在JSP页中处理流程控制的标记
逻辑标记封装在文件名为struts-logic.tld的标记包中
逻辑标记库的功能
条件逻辑
重复
转发/重定向响应
条件逻辑标记
第一类可以比较下列实体与一个常数的大小
第二类在计算标记体之前判断特定的项目是否存在
第三类根据模板匹配的结果检查标记体的内容
第一类条件逻辑标记
<equal>  如果常数与被定义的实体相等,返回true
<notEqual> 如果常数与被定义的实体不相等,返回true
<greaterEqual> 如果常数大于等于被定义的实体,返回true
第一类条件逻辑标记
<lessEqual> 如果常数小于等于被定义的实体,返回true
<lessThan> 如果常数小于被定义的实体,返回true
<greaterThan> 如果常数大于被定义的实体,返回true
举例
判断名为"name"的请求参数的值是否是"SomeName"。
<logic:equal parameter="name" value="SomeName">
        The entered name is SomeName
</logic:equal>
举例
判断在页的作用域中是否有一个名为"bean"的bean,它有一个prop属性,这个属性的值是否大于7。
如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。
<logic:greaterThan name="bean" property="prop" scope="page" value="7">
The value of bean.Prop is greater than 7
</logic:greaterThan>
第二类条件逻辑标记
<logic:present>
<logic:notPresent>
第三类条件逻辑标记
<logic:match>
<logic:notMatch>
重复标记<logic:iterate>
它能够根据特定集合中元素的数目对标记体的内容进行重复的检查
集合的类型
java.util.Iterator
java.util.Collection
java.util.Map
java.util.List
数组
举例
Strlst是一个包含字符串的List,现在要将他内部的字符串全都显示在浏览器里
<logic:iterate id="element" name="strlst"  indexId="index">
<%=(String)element)%>
</logic:iterate>
转发标记
<logic:forward>标记能够将响应转发给重定向到特定的全局ActionForward上
ActionForward的类型决定了是使用PageContext转发响应,还是使用sendRedirect将响应进行重定向
此标记只有一个"name"属性,用来指定全局ActionForward的名称,例如:
<logic:forward name="myGlobalForward"/>
重定向标记
<logic:redirect>标记是一个能够执行HTTP重定向的强大工具。
根据指定的不同属性,它能够通过不同的方式实现重定向。
它还允许开发人员指定重定向URL的查询参数。
HTML标记
Struts HTML标记可以大致地分为以下几个功能:
显示表单元素和输入控件
显示错误信息
显示其他HTML元素
模板标记
Struts模板标记可以大致地分为以下几个功能:
插入标记<template:insert>
放置标记<template:put>
获得标记<template:get>

posted @ 2007-06-17 18:07 roy_johnson 阅读(1414) | 评论 (2)编辑 收藏

2007年6月16日

                                                        Struts 初始化处理流程
   根据在web.xml中配置的初始化参数,Servlet容器将决定在在容器的第一次启动,或第一次客户请求ActionServlet 的时机加载ActionServlet ,不管哪种方式加载,和其它Servlet一样,ActionServlet 的init( )方法将被调用,开始初始化过程。让我们来看看在初始化过程中将发生些什么,理解了这些,对于我们debug和扩展自己的应用更加得心应手。
   1   初始化框架的内部消息绑定,这些消息用来输出提示,警告,和错误信息到日志文件中。
       org.apache.struts.action.ActionResources用来获取内部消息;
   2   加载web.xml中定义的不同参数,用以控制ActionServlet 的不同行为,这些参数包括 config, debug, detail, and convertNull ;
   3   加载并初始化web.xml中定义的servlet 名称和servlet映射信息。通过初始化,框架的各种DTD被注册,DTD用来在下一步校验配置文件的有效性;
   4、为默认应用加载并初始化Struts配置文件,配置文件即初始化参数config指定的文件。默认配置文件被解析, 产生一个ApplicationConfig对象存于ServletContext 中。可以通过关键字 org.apache.struts.action.APPLICATION 从ServletContext 中获取ApplicationConfig;
   5   Struts配置文件中指定的每一个消息资源都被加载,初始化,并存在ServletContext 的合适区域(基于每个message-resources元素的key 属性),如果key 属性没有设置,则为org.apache.struts.action.MESSAGE;
   6   Struts配置文件中声明的每一个数据源被加载并且初始化,如果没有配置数据源,这一步跳过;
   7   加载并初始化Struts配置文件中指定的插件。每一个插件的init()方法被调用;
  8   当默认应用加载完成,init()方法判断是否有应用模块需要加载,如果有,重复4—7完成应用模块的加载。

posted @ 2007-06-16 17:56 roy_johnson 阅读(982) | 评论 (1)编辑 收藏

 

                                                论J2EE程序员的武功修为(转)
 EasyJF开源团队(www.easyjf.com) 大峡

  经常会跟一些朋友讨论怎么样才能学好Java,学到什么程度才算撑握了Java的问题。其中有一个J2EE程序员层次及武功修为的问题,有点意思。这里就把讨论的内容大致整理一下发出来,大家继续讨论。

  纵观国内的软件行业,靠Java吃饭的程序员还真不是少,而且Java程序员是有很大优越感的,毕竟对于很多用b/s搞开发的业内朋友来说,Java技术意味着难度大、门槛高,因此相对来说Java程序员比其它的程序员(如php、.net)收入高就理所当然。然而J2EE所涉及到的范畴是很广的,不能一个Java程序员就概括了事,而应该具有层次及水平之分,很多时候经常需要进行分类或评级,有时他评、有时自评。

  谈到国内J2EE领域的程序员层次水平,当前流行的称谓及评级不外乎就下面几种:
  第一种是精通掌握记事本、Dreamweaver等工具来写JSP+JavaBean数据库应用的是J2EE程序员;
  第二种是用JBuilder、Eclipse等专用Java开发工具写着一堆一堆过程式Java Bean,而且还能精通Struts+Spring+Hibernate等应用框架的高级J2EE程序员;
  第三种是用Together建模,然后生成一堆Java接口或代码,开口闭口都是设计模式的资深Java程序同及高级系统分析、构架师;
  最后还有一种是整天在BlogJava或JavaEye上谈经论道的大师们,这些大师技术水平难以触摸,武功门派也各具特色,不好归类,有时不好称为程序员(因为有的时候他们甚至不写或者写不出程序),但又做着与J2EE程序员密切相关的事情,我们暂且就归为“牛牛”或“大师”。

  称谓毕竟只是称谓,带有点主观或者功利色彩,有时很难鉴定一个人应该属于什么,因此,我们再从纯技术的角度,也即武功修为的角度,作了一个简单的分析及归类,把2EE领域程序员大致分成以下几个层次,可以作为大家自评的一个参考标准:

  第一个层次:精通掌握Java语法、能调试基本的程序错误,精通掌握JSP+Java Bean写一些N年前ASP、PHP翻版的Java Web应用程序(如论坛、网站新闻发布系统、OA、网上商城等),精通JDBC使用、精通SQL语句、精通XML等。

  第二个层次:掌握设计模式原理及应用,掌握基于OO的分析及设计方法,并能精通熟练使用几种Java专业设计及开发工具,精通掌握流行的J2EE框架如Hibernate、EJB、Webwork、Spring的原理及应用,精通J2EE中一两个组成部分(如Servlet、EJB等)的工作原理及细节。

  第三个层次:少林的高僧有两种,禅僧及武僧。J2EE程序员的第三个层次也同样有禅、武两个分支,这里我们重点分析一下:

  第一个分支属于走的禅僧线路。在练完第二个层次中的各种武功基础上,结合实际项目中的千奇百怪的用户需求,游刃有余的选择适合的技术方案为客户解决问题,并形成自己的一套解决方案。达到这一个层次的J2EE程序员已经不在乎使用任何工具、任何框架了,而是根据不同的对手,使用不同的武器或招式来应对。好比小李飞刀一样,只有达到了“手中无刀、心中有刀”的境界,才能达到“出手一刀,例不虚发”的效果。这一层次的武功属于一个熟练度问题,刀练得多了、遇到的对手多了,再加上前面的武功修为,就算做不到例不虚发,也可达到十发九中。

  第二个分支属于走的武僧线路,在撑握熟悉第一二个层次中涉及到的内容后,进一步专研并撑握J2EE底层开发,J2EE规范制订、规范实现、Java虚拟机的工作原理、各种常见的J2EE服务器内核工作机制、内存管理、进程机制、源代码等。因为涉及的很多东西都比较抽象,代码也很多,练这一层的武功需要有很好的资质及耐性、并具还得有一定的环境及条件。好比神雕大侠杨过拿起“玄铁剑”,并练成“暗然销魂掌”的成长过程,需要前面的武功修为作基础,更需那只威力神武神雕的帮助指点及他处处为民、惩奸除恶的侠之心态。
  
  胡侃了这么多,现在来根据自己情况测算一下自己的份量,结果如下:
  第一层 练到8成;
  第二层 练到5成;
  第三层 准备走禅僧线路,当前算是练到1成;
  
  唉,后面的武功提升越来越难,真不知道要到何年何月才能达到10成啊。你的武功练到哪一个层次了,不防亮出来大家切磋切磋。嘿嘿,要是有一天,咱们中国的Java程序员人手一把“玄铁剑”、人人会使“暗然销魂掌”,那还了得!汗...,写着写着居然做起白日梦了,不好意思,就此打住。
  
  手中鸡蛋先别扔,还要打个广告:本人刚开始涉足Java开源,目前在EasyJF开源团队中负责EasyJWeb(官网www.easyjf.com)项目,欢迎大家前来指导。

作者Blog:http://blog.csdn.net/psyl/

posted @ 2007-06-16 16:37 roy_johnson 阅读(355) | 评论 (2)编辑 收藏

      很多新手都不知道如何开始学习JSP,本人就个人学习的一些经历在这里简单得谈一下。
      首先,你得对WEB应用开发感兴趣,因为兴趣是最好的老师,更是你学习前进的动力,如果只是抱这学学看的态度,本人建议不要开始学。那样既浪费了时间又浪费了精力。有了兴趣,一切就好说了,学得多快那就看你个人的能力了。
      从HTML开始下手,一星期即可搞定HTML。因为开发WEB应用要求你能看懂网页代码,然后是Java语言基础,Java语言学习的时间可能要长些。等前面这两项熟悉了,就要开始学习JavaScript和CSS,当然作为后台程序员后面这两项了解即可。
     再接下来就要学习一下JDBC的技术了。数据库建议先学习Mysql,然后再学习Mssql,Oracle,最后还要熟悉WEB服务器,初学者建议学习Tomcat,等这些都熟悉了。开始尝试着开发几个系统,比如信息管理系统,聊天室,论坛等。
     再往后就要学习Struts,Hibernate,Spring等高级技术了。
     今后我会逐步介绍以上技术,最后还会教大家开发一个基于Struts+Hibernate+Spring的实例。大家希望看到那方面的知识或有何好的建议。可以给我留言,或发表在评论里。

posted @ 2007-06-16 11:48 roy_johnson 阅读(747) | 评论 (4)编辑 收藏