??xml version="1.0" encoding="utf-8" standalone="yes"?> 你可以在array中添加items: 但是你在声明时对索引不做数量限制Q你可以通过它的名字讉Kq个JS对象中的M成员,pq样Q创Z个空的对象,然后可以不停地d了:(x) 在JS中,对象和关pd数组QhashesQ两个概念通常是没有区别,下面的这两行代码是等L(fng)Q?br />
Ҏ(gu)1Q全部改为绝对\径?
Ҏ(gu)2Q把.do和它要forward的jsp文g映射到同一目录l构?
Ҏ(gu)3Qhtml:base(其实生成了base标签Q?
Ҏ(gu)4Q代码{?
forward跌{后图片不能刷新的问题Q在url 后加个随机数 i
<img src="aaaa.gif?<%=i%>" width="572" height="69">
另一U方?br />Internet 选项> 常规> Internet临时文g讄->(g)查网늚较新版本?选择“每ơ访问此|(g)查?br />
]]>
Struts1.1发布了这么长旉了,我才刚刚开始系l地学习(fn)Struts的相关知识,l过前一阉|心研IӞ对Struts1.1中已有的cDispatchAction有了q一步的认识。我在q里ȝ一下,希望能对大家有所帮助?br />
?.0版本中我们通常都是用executeҎ(gu)来完成我们对业务逻辑的处理及(qing)面的{发。通常在一个Action中我们都只能够完成一U业务逻辑的操作。如果要是完成多个业务逻辑Q比如:(x)d、删除等Q功能相q的业务逻辑我们没有办法了么?{案是否定的Q我们可以通过在页面中定义一个隐藏变量,在不同的面要求处理不同的业务逻辑的时候我们可以赋予这个变量不同的|q在executeҎ(gu)中通过对变量值的判断来完成不同的业务逻辑操作?br />
举例来说Q我们首先在面中定义一个隐藏变量?br />
<QhtmlQhidden property="operAt"/>
然后定义一个JavaScript函数Q我们可以在通过点击提交按钮的时候,在函C里面修改它的倹{?br />
<QSCRIPT>
function setQkeyQ?{
withQdocument.forms[0]Q{
operAt.value=keyQ?br />
}
}
<Q?SCRIPT>
当我们点?yn)L交按钮便触发该事Ӟ修改变量的倹{?br />
<QhtmlQsubmit onclick="setQ?save'Q;">SAVE<Q?htmlQsubmit>
那我们在后台execute中又如何处理相关逻辑呢?
String operAt = myForm.getOperAtQ)Q?br />
if QoperAt.equalsQ?create"Q) { …?br />
if QoperAt.equalsQ?save"Q) { …?br />
很简单吧Q虽然说q样做我们可以实现多个业务逻辑在同一个Action中实玎ͼ可是带来的代价便是代码的冗长Q不易理解?br />
下面我们p介绍一下DispatchActioncM。它是Action的一个子c,它可以实现多个业务逻辑在同一个Action当中的实玎ͼ而上面的例子在DispatchAction中也变成了下面的Ş式:(x)
public ActionForward createQ?br />
ActionMapping mappingQ?br />
ActionForm formQ?br />
HttpServletRequest requestQ?br />
HttpServletResponse responseQ?br />
throws Exception { …?br />
public ActionForward saveQ?br />
ActionMapping mappingQ?br />
ActionForm formQ?br />
HttpServletRequest requestQ?br />
HttpServletResponse responseQ?br />
throws Exception { …?br />
每一U业务逻辑都能在DispatchAction当中扑ֈ对应的方法。那么我们如何去实现q样的调用呢QDispatchAction中对struts-config.xml的配|比一般的Action配置E显ȝ(ch)QD例来Ԍ(x)
<Qaction path="/telConsle" type="com.meng.action.TelConsleDispatch"
name="telForm" scope="request" validate="false" parameter="method"/>
我们在这里指定了parameter的gؓ(f)methodQ而当我们hAction的时候我们必L定method的值来定L们想要调用哪个ActionҎ(gu)。如Q?br />
http://localhostQ?080/tsss/telConsle.doQmethod=save
昄Q通过昄链接指定参数值的Ҏ(gu)可以辑ֈ我们调用Ҏ(gu)的目的。然而我们如果不xC用的话我们应该怎样处理呢?q记得前面讲q的Ҏ(gu)么?我们在页面中定义一个隐藏的变量Q然后通过对变量的赋值来定我们来确定我们将要执行的业务Ҏ(gu)。在q里我们可不可以一栯样用呢Q?br />
{案是肯定的Q我们当然可以通过定义一个类g<QhtmlQhidden property="operAt"/>的变量,只要对该变量赋上对应DispatchAction中的Ҏ(gu)的值来定我们要调用的业务Ҏ(gu)。然而笔者比提倡用Struts标签来定义这L(fng)隐含的变量,因ؓ(f)Struts标签为动态标{,它可能需要在FormBean中定义该属性的get和setҎ(gu)Q而在parameter中定义的g需要在FormBean当中定义get和setҎ(gu)。笔者徏议用html的标准标{?lt;Qinput>来定义该隐藏变量。因标签为静态标{,如果我们该用Struts标签的话可能D面出错?/span>
我们在页面上有多个按?br />我们q那么DispatchAction
控制我们惌做的?br />我们先在面用其所?lt;html:hidden property="method " value=""/>来隐葛_?br />我们用javascript告诉我们要做什么事也就是用L(fng)M那个?\\
我想我们用这个就有一点好处就是页面有javaxcript提示出来是有一点h性化
我相我们用他的子cM(x)更好?br />我认为我们用了javacript以后我们的页面就多了很多代码?br />我们用lookupdispacthaction也行
]]>q用Jakarta Struts的七大实战心?/h4>
(原文 http://www.onjava.com/pub/a/onjava/2002/10/30/jakarta.html?page=1)
(作者Chuck Cavaness, ~译 邱文?
~者按Q当作?Chuck CavanessQ著有《Programming Jakarta Struts》一书)所在的|络公司军_采用Struts框架之后QChuck曄p了好几个月来研究如何用它来构建公司的应用pȝ。本文叙q的正是作者在q用Strutsq程中来之不易的若干l验和心得。如果你是个负责通过jsp和servlet开发Web应用的JavaE序员,q且也正在考虑采用ZStruts的构建方法的话,那么你会(x)在这里发现很多颇有见地同时也很有价值的信息?br />
1. 只在必要的时候才考虑扩展Struts框架
一个好的framework有很多优点,首先Q它必须能够满用户的可预见的需求。ؓ(f)?Struts为Web 应用提供了一个通用的架构,q样开发h员可以把_֊集中在如何解军_际业务问题上。其ơ,一个好的frameworkq必能够在适当的地Ҏ(gu)供扩展接口,以便应用E序能扩展该框架来更好的适应使用者的实际需要?br />
如果Struts framework在Q何场合,M目中都能很好的满需求,那真是太了。但是实际上Q没有一个框架声U能做到q一炏V一定会(x)有一些特定的应用需求是框架的开发者们无法预见到的。因此,最好的办法是提供_的扩展接口,使得开发工E师能够调整struts来更好的W合他们的特D要求?br />
在Struts framework中有很多地方可供扩展和定制。几乎所有的配置c都能被替换为某个用户定制的版本Q这只要单的修改一下Struts的配|文件就可以做到?br />
其他lg如ActionServlet?RequestProcessor 也能用自定义的版本代? 甚至qStruts 1.1里才有的新特性也是按照扩展的原则来设计的。例如,在异常处理机制中允许用户定制异常处理的句柄Q以便更好的对应用系l发生的错误做出响应?br />
作ؓ(f)框架的这U可调整Ҏ(gu)在它更适合你的应用的同时也在很大的E度上媄(jing)响了目开发的效果。首先,׃(zhn)的应用是基于一个现有的成熟的、稳定的framework如StrutsQ测试过E中发现的错误数量将?x)大大减,同时也能~短开发时间和减少资源的投入。因Z不再需要投入开发力量用于编写基框架的代码了?br />
然? 实现更多的功能是要花Ҏ(gu)大的代h(hun)的。我们必d心避免不必要的滥用扩展性能Q?Struts是由核心包加上很多工具包构成的,它们已经提供了很多已l实现的功能。因此不要盲目的扩展Struts框架Q要先确定能不能采用其他Ҏ(gu)使用现有的功能来实现?在决定编写扩展代码前务必要确认Struts的确没有实现你要的功能。否则重复的功能?x)导致乱将来还得花贚w外的_֊清除它?br />
2. 使用异常处理声明
要定义应用程序的逻辑程Q成熟的l验是推荐在代码之外Q用配置的方法来实现Q而不是写dE序代码中的。在J2EE中,q样的例子比比皆是。从实现EJB的安全性和事务性行为到描述JMS消息和目的地之间的关p,很多q行时的处理程都是可以在程序之外定义的?br />
Struts 创徏者从一开始就采用q种Ҏ(gu)Q通过配置Struts的配|文件来定制应用pȝq行时的各个斚w。这一点在版本1.1的新Ҏ(gu)上得到延箋Q包括新的异常处理功能。在Struts framework以前的版本中Q开发h员不得不自己处理Struts应用中发生的错误情况。在最新的版本中,情况大大的改观了QStruts Framework提供了内|的一个称?ExceptionHandler 的类Q?用于pȝ~省处理actionc运行中产生的错误。这也是在上一个技巧中我们提到的framework许多可扩展接口之一?br />
Struts~省?ExceptionHandlercM(x)生成一个ActionError对象q保存在适当的范_(d)scopeQ对象中。这样就允许JSP面使用错误cL提醒用户出现什么问题。如果你认ؓ(f)q不能满你的需求,那么可以很方便的实现你自qExcepionHandlercR?br />
具体定制异常处理的方法和机制
要定制自q异常处理机制Q第一步是l承org.apache.struts.action.ExceptionHandlercR这个类?个方法可以覆盖,一个是excute()另外一个是storeException(). 在多数情况下Q只需要覆盖其中的excute()Ҏ(gu)。下面是ExceptionHandlercȝexcute()Ҏ(gu)声明Q?br />
正如你看到的Q该Ҏ(gu)有好几个参数Q其中包括原始的异常。方法返回一个ActionForward对象Q用于异常处理结束后controllercd到请求必{发的地方厅R?br />
当然(zhn)可以实CQ何处理,但一般而言Q我们必L查抛出的异常,q对该cd的异常进行特定的处理。缺省的Q系l的异常处理功能是创Z个出错信息,同时把请求{发到配置文g中指定的地方厅R?定制异常处理的一个常见的例子是处理嵌套异常。假设该异常包含有嵌套异常,q些嵌套异常又包含了其他异常Q因此我们必覆盖原来的execute()Ҏ(gu)Q对每个异常~写出错信息?br />
一旦你创徏了自qExceptionHandler c,应该在Struts配置文g中的部分声明q个c,以便让Struts知道改用你自定义的异常处理取代缺省的异常处理.
可以配置你自qExceptionHandler cL用于Action Mapping特定的部分还是所有的Action对象。如果是用于Action Mapping特定的部分就?lt;action>元素中配|。如果想让这个类可用于所有的Action对象,可以?lt;global-sections> 元素中指定。例如,假设我们创徏了异常处理类CustomizedExceptionHandler用于所有的Actionc? <global-exceptions>元素定义如下所C:(x)
?lt;exception />元素中可以对很多属性进行设|。在本文中,最重要的属性莫q于handler属? handler属性的值就是自定义的承了ExceptionHandlercȝ子类的全名?假如该属性没有定义,Struts?x)采用自q~省倹{当?dng)其他的属性也很重要,但如果想覆盖~省的异常处理的话,handler无疑是最重要的属性?br />
最后必L出的一Ҏ(gu)Q你可以有不同的异常处理cL处理不同的异常。在上面的例子中QCustomizedExceptionHandler用来处理Mjava.lang.Exception的子c? 其实Q你也可以定义多个异常处理类Q每一个专门处理不同的异常?wi)。下面的XML片断解释了如何配|以实现q一炏V?br />
在这里,一旦有异常抛出Qstruts framework试囑֜配置文g中找到ExceptionHandlerQ如果没有找刎ͼ那么struts沿着该异常的父类链一层层往上找直到发现匚w的ؓ(f)止。因此,我们可以定义一个层ơ型的异常处理关pȝ构,在配|文件中已经体现了这一炏V?br />
3. 使用应用模块QApplication ModulesQ?br />
Struts 1.1的一个新Ҏ(gu)是应用模块的概c(din)应用模块允许将单个Struts应用划分成几个模块,每个模块有自qStruts配置文gQJSP面QAction{等。这个新Ҏ(gu)是Z解决大中型的开发队伍抱怨最多的一个问题,即ؓ(f)了更好的支持q行开发允许多个配|文件而不是单个配|文件?br />
注:(x)在早期的beta版本中,该特性被UCؓ(f)子应用(sub-applicationsQ,最q的改名目的是ؓ(f)了更多地反映它们在逻辑上的分工?br />
昄Q当很多开发h员一起参加一个项目时Q单个的Struts配置文g很容易引赯源冲H。应用模块允许Struts按照功能要求q行划分Q许多情况已l证明这h贴近实际。例如,假设我们要开发一个典型的商店应用E序。可以将l成部分划分成模块比如catalogQ商品目录), customerQ顾客), customer serviceQ顾客服务), orderQ订单){。每个模块可以分布到不同的目录下Q这样各部分的资源很Ҏ(gu)定位Q有助于开发和部v。图1 昄了该应用的目录结构?
?1. 一个典型的商店应用E序的目录结?br />
注:(x)如果你无需项目划分成多个模块QStruts框架支持一个缺省的应用模块。这׃得应用程序也可以?.0版本下创建,h可移植性,因ؓ(f)应用E序?x)自动作为缺省的应用模块?br />
Z使用多应用模块功能,必须执行以下几个准备步骤Q?br />
• 为每个应用模块创建独立的Struts配置文g?br />
• 配置Web 部v描述W?Web.xml文g?br />
• 使用org.apache.struts.actions.SwitchAction 来实现程序在模块之间的蟩?
创徏独立的Struts配置文g
每个Struts应用模块必须拥有自己的配|文件。允许创q独立于其他模块的ActionQActionFormQ异常处理甚x多?br />
l箋以上面的商店应用E序ZQ我们可以创Z下的配置文gQ一个文件名为struts-config-catalog.xmlQ包含catalogQ商品目录)、items(商品清单)、和其它与库存相关的功能的配|信息;另一个文件名为struts- config-order.xml, 包含对orderQ订单)和order trackingQ订单跟t)的设|。第三个配置文g是struts-config.xml,其中含有属于~省的应用模块中的一般性的功能?br />
配置Web部v描述W?
在Struts的早期版本中Q我们在Web.xml中指定Struts配置文g的\径。好在这Ҏ(gu)变,有助于向后兼宏V但对于多个应用模块Q我们需要在Web部v描述W中增加新的配置文g的设定?br />
对于~省的应用(包括Struts的早期版本)QStruts framework 在Web.xml文g中查扑ָ有config的元?lt;init-param>Q用于蝲入Action mapping 和其它的应用E序讑֮。作Z子,以下的XML片断展现一个典型的<init-param>元素Q?br />
注:(x)如果在现有的<init-param>元素中找不到"config"关键字,Struts framework缺省地使用/WEB/struts-config.xml
Z支持多个应用模块(Struts 1.1的新Ҏ(gu)?Q必d加附加的<init-param>元素。与~省?lt;init-param>元素不同的是Q附加的<init-param>元素与每个应用模块对应,必须以config/xxx的Ş式命名,其中字符串xxx代表该模块唯一的名字。例如,在商店应用程序的例子中,<init-param>元素可定义如下(注意_体字部分)Q?br />
W一?<init-param>元素对应~省的应用模块。第二和W三个元素分别代表非~省应用模块catalog ?order?br />
当Struts载入应用E序Ӟ它首先蝲入缺省应用模块的配置文g。然后查扑ָ有字W串config/xxx 形式的附加的初始化参数。对每个附加的配|文件也q行解析q蝲入内存。这一步完成后Q用户就可以很随意地用config/后面的字W串也就是名字来调用相应的应用模块?br />
多个应用模块之间调用Actionc?br />
在ؓ(f)每个应用模块创徏独立的配|文件之后,我们有可能需要调用不同的模块中Action。ؓ(f)此必M用Struts框架提供的SwitchActioncRStruts ?x)自动将应用模块的名字添加到URL,如Struts 自动d应用E序的名字加到URL一栗应用模块是Ҏ(gu)架的一个新的扩充,有助于进行ƈ行的团队开发。如果你的团队很那没必要用到q个Ҏ(gu),不必q行模块化。当?dng)q是只有一个模块,pȝq是一L(fng)q作?br />
4. 把JSP攑ֈWEB-INF后以保护JSP源代?br />
Z更好C护你的JSP避免未经授权的访问和H视Q?一个好办法是将面文g存放在Web应用的WEB-INF目录下?br />
通常JSP开发h员会(x)把他们的面文g存放在Web应用相应的子目录下。一个典型的商店应用E序的目录结构如?所C。跟catalog Q商品目录)相关的JSP被保存在catalog子目录下。跟customer相关的JSPQ跟订单相关的JSP{都按照q种Ҏ(gu)存放?br />
?2.Z不同的功?JSP 被放|在不同的目录下
q种Ҏ(gu)的问题是q些面文gҎ(gu)被偷看到源代码,或被直接调用。某些场合下q可能不是个大问题,可是在特定情形中却可能构成安全隐(zhn)。用户可以绕qStruts的controller直接调用JSP同样也是个问题?br />
Z减少风险Q可以把q些面文gUdWEB-INF 目录下。基于Servlet的声明,W(xu)EB-INF不作为Web应用的公共文档树(wi)的一部分。因此,W(xu)EB-INF 目录下的资源不是为客L(fng)接服务的。我们仍然可以用WEB-INF目录下的JSP面来提供视囄客户Q客户却不能直接h讉KJSP?br />
采用前面的例子,?昄JSP面UdWEB-INF 目录下后的目录结?br />
?3. JSP存放?WEB-INF 目录下更为安?br />
如果把这些JSP面文gUdWEB-INF 目录下,在调用页面的时候就必须?WEB-INF"d到URL中。例如,在一个Struts配置文g中ؓ(f)一个logoff action写一个Action mapping。其中JSP的\径必M"WEB-INF"开头。如下所C:(x)h意粗体部?
q个Ҏ(gu)在Q何情况下都不׃ؓ(f)Struts实践中的一个好Ҏ(gu)。是唯一要注意的技巧是你必LJSP和一个Struts action联系h。即使该Action只是一个很基本的很单JSPQ也L要调用一个ActionQ再由它调用JSP?br />
最后要说明的是Qƈ不是所有的容器都能支持q个Ҏ(gu)。WebLogic早期的版本不能解释Servlet声明Q因此无法提供支持,据报道在新版本中已经改进了。M使用之前先检查一下你的Servlet容器?br />
5. 使用 Prebuilt ActioncL升开发效?br />
Struts framework带有好几个prebuilt Actionc,使用它们可以大大节省开发时间。其中最有用的是org.apache.struts.actions.ForwardAction ?org.apache.struts.actions.DispatchAction.
使用 ForwardAction
在应用程序中Q可能会(x)l常出现只要Action对象转发到某个JSP的情c(din)在上一点中曾提到L由Action调用JSP是个好习(fn)惯。如果我们不必在Action中执行Q何业务逻辑Q却又想遵@从Action讉K面的话Q就可以使用ForwardActionQ它可以使你免去创徏许多I的ActioncR运用ForwardAction的好处是不必创徏自己的Actionc,你需要做的仅仅是在Struts配置文g中配|一个Action mapping?br />
举个例子Q假定你有一个JSP文gindex.jsp Q而且不能直接调用该页面,必须让程序通过一个Actionc调用,那么Q你可以建立以下的Action mapping来实现这一点:(x)
正如你看到的Q当 /home 被调用时, ׃(x)调用ForwardAction q把h转发?index.jsp 面.
再讨Z下不通过一个Actioncȝ接{发到某个面的情况,必须注意我们仍然使用<action>元素中的forward属性来实现转发的目标。这?lt;action>元素定义如下Q?br />
以上两种Ҏ(gu)都可以节省你的时_(d)q有助于减少一个应用所需的文件数?br />
使用 DispatchAction
DispatchAction是Struts包含的另一个能大量节省开发时间的ActioncR与其它ActioncM提供单个execute()Ҏ(gu)实现单个业务不同QDispatchAction允许你在单个ActioncM~写多个与业务相关的Ҏ(gu)。这样可以减Actioncȝ数量Qƈ且把相关的业务方法集合在一起得维护v来更Ҏ(gu)?br />
要用DispatchAction的功能,需要自己创Z个类Q通过l承抽象的DispatchAction得到。对每个要提供的业务Ҏ(gu)必须有特定的Ҏ(gu)signature。例如,我们惌提供一个方法来实现对购物Rd商品清单Q创Z一个类ShoppingCartDispatchAction提供以下的方法:(x)
那么Q这个类很可能还需要一个deleteItem()Ҏ(gu)从客L(fng)购物车中删除商品清单Q还有clearCart()Ҏ(gu)清除购物车等{。这时我们就可以把这些方法集合在单个Actionc,不用为每个方法都提供一个ActioncR?br />
在调用ShoppingCartDispatchAction里的某个Ҏ(gu)Ӟ只需在URL中提供方法名作ؓ(f)参数倹{就是说Q调用addItem()Ҏ(gu)?URL看v来可能类gQ?br />
http://myhost/storefront/action/cart?method=addItem
其中method参数指定ShoppingCartDispatchAction中要调用的方法。参数的名称可以L配置Q这里用的"method"只是一个例子。参数的名称可以在Struts配置文g中自行设定?br />
6.使用动态ActionForm
在Struts framework中,ActionForm对象用来包装HTML表格数据Q包括请求)Qƈq回q回动态显C给用户的数据。它们必L完全的JavaBeanQƈl承.Struts 里面的ActionFormc,同时Q用户可以有选择地覆盖两个缺省方法?br />
该特性能节省很多旉Q因为它可以协助q行自动的表现层的验证。ActionForm的唯一~点是必Mؓ(f)不同的HTML表格生成多个ActionForm cM保存数据。例如,如果有一个页面含有用L(fng)注册信息Q另一个页面则含有用户的介lh的信息,那么需要有两个不同的ActionFormcR这在大的应用系l中׃(x)Dq多的ActionFormcRStruts 1.1Ҏ(gu)做出了很好的改进Q引入了动态ActionFormcL?br />
通过Struts framework中的DynaActionFormcd(qing)其子cd以实现动态的ActionForm Q动态的ActionForm允许你通过Struts的配|文件完成ActionForm的全部配|;再也没有必要在应用程序中创徏具体的ActionFormcR具体配|方法是Q在Struts的配|文仉过增加一?lt;form-bean>元素Q将type属性设定成DynaActionForm或它的某个子cȝ全名。下面的例子创徏了一个动态的ActionForm名ؓ(f)logonFormQ它包含两个实例变量Qusername ?password.
动态的ActionForm可以用于ActioncdJSPQ用方法跟普通的ActionForm相同Q只有一个小差别。如果用普通的ActionForm对象则需要提供get ?setҎ(gu)取得和设|数据。以上面的例子而言Q我们需要提供getUsername() ?setUsername()Ҏ(gu)取得和设|username变量Q同样地有一Ҏ(gu)法用于取得和讄password变量.
q里我们使用的是DynaActionFormQ它?yu)变量保存在一个Mapcd象中Q所以必M用DynaActionForm cM的get(name) ?set(name)Ҏ(gu)Q其中参数name是要讉K的实例变量名。例如要讉KDynaActionForm中username的|可以采用cM的代码:(x)
String username = (String)form.get("username");
׃值存攑֜一个Map对象Q所以要记得对get()Ҏ(gu)q回的Object对象做强制性类型{换?br />
DynaActionForm有好几个很有用的子类。其中最重要的是DynaValidatorForm Q这个动态的ActionForm和Validator 一起利用公qValidator包来提供自动验证。这个特性你得以在E序代码之外指定验证规则。将两个Ҏ(gu)结合用对开发h员来说将非常有吸引力?br />
7. 使用可视化工?br />
自从Struts 1.0 分布以来Q就出现了不可视化工具用于协助创徏Q修改和l护Struts的配|文件。配|文件本w是ZXML格式Q在大中型的开发应用中?x)增大变得很W拙。ؓ(f)了更方便的管理这些文Ӟ一旦文件大C无法一目了然的时候,试着采用其中的一UGUI 工具协助开发。商业性的和开放源代码的工具都有不,?列出了可用的工具和其相关链接Q从那里可以获取更多信息?br />
?1. Struts GUI 工具应用E序 性质 |址 Adalon 商业软g http://www.synthis.com/products/adalon Easy Struts 开放源?/td> http://easystruts.sourceforge.net/ Struts Console 免费 http://www.jamesholmes.com/struts/console JForms 商业软g http://www.solanasoft.com/ Camino 商业软g http://www.scioworks.com/scioworks_camino.html Struts Builder 开放源?/td> http://sourceforge.net/projects/rivernorth/ StrutsGUI 免费 http://www.alien-factory.co.uk/struts/struts-index.html
]]>
什么是JSONQ?JavaScript Object Notation -------javascript对象W号,一个Ajax中砰然出现的新话?其实它就是javascript中申明对象的Ҏ(gu)。让我们来看一个示?br />var myPet =
{
color: 'black',
leg_count: 4,
communicate: function(repeatCount){ for(i=0;i<repeatCount;i++) alert('Woof!');}
};
q里我们创Z一个对象引用,q个对象包含?个属?color,leg_count)和一个方?communicate),
在myPet对象的列表中不难看出Q这些属性和Ҏ(gu)之间都是用逗号","分隔开来的。属性很好理解,而方法的创徏则是׃个匿名function标记的?br />
在该对象被创Z后ƈ且以myPet变量声明了以后我们就可以q样使用了:(x)alert('my pet is ' + myPet.color);
alert('my pet has ' + myPet.legCount + ' legs');
//if you are a dog, bark three times:
myPet.communicate(3);
大家可以看到QJSON可以漂亮地应用到javascript中Q何一个地方,作ؓ(f)function参数、返回倹{服务器响应...
你理解了吗?function同样也是一个对象?br />---------------------------------------------------------------
或许JSE序员中有些Z来就不这么认为,但是function实也是一个Object。下面我们可以做个实验来验证一下,你的functionl你的另一个function做ؓ(f)参数传递,׃一个String一栗?br />var myDog = {
bark: function()
{
alert('Woof!');
}
};
var myCat =
{
meow: function()
{
alert('I am a lazy cat. I will not meow for you.');
}
};
function annoyThePet(petFunction)
{
//let's see what the pet can do
petFunction();
}
//annoy the dog:
annoyThePet(myDog.bark);
//annoy the cat:
annoyThePet(myCat.meow);
在这里我们传递了myDog.bark和myCat.meowlannoyThePet。注意它们后面都没有带括?font color="#ff0000">"()"Q如果不q样做的话我们传递的不?Ҏ(gu)",而是该方法的q回|在此例中?font color="#ff0000">"Undefine"Q?br />
如果你想我的懒猫学狗狗叫Q你可以q样做:(x)myCat.meow = myDog.bark;
myCat.meow(); //alerts 'Woof!'
Arrays, items 和对象成员object members
L(fng)下面2?br />var a = new Array();
var b = [];
var a = ['first', 'second', 'third'];
var v1 = a[0];
var v2 = a[1];
var v3 = a[2];
var obj =
{}; //new, empty object
obj['member_1'] = 'this is the member value';
obj['flag_2'] = false;
obj['some_function'] = function()
{ /**//* do something */};
var obj =
{
member_1:'this is the member value',
flag_2: false,
some_function: function()
{ /**//* do something */}
};
obj.some_function();
obj['some_function']();
{了q么久,我可以拥有自qClass了么Q?br />OO的强大力量来自于cClass。当然了我们的JavaScript同样也可以做到这一点,L(fng)?//defining a new class called Pet
var Pet = function(petName, age)
{
this.name = petName;
this.age = age;
};
//let's create an object of the Pet class
var famousDog = new Pet('Santa\'s Little Helper', 15);
alert('This pet is called ' + famousDog.name);
但是我们如何能够方法加到我们的Pet Class中来呢。我们可以ؓ(f)我们所有的cd义一个prototype属性。prototype属性其实也是一个对象,它包含一个类所拥有的一切其他对象。甚至默认JSc(Date,String,NumberQ也可以拥有prototype对象Q得各U新的方法和属性能扩充其中Q让基础c获得更多的Ҏ(gu)?br />Pet.prototype.communicate = function()
{
alert('I do not know what I should say, but my name is ' + this.name);
};
var Pet = Class.create();
Pet.prototype =
{
//our 'constructor'
initialize: function(petName, age)
{
this.name = petName;
this.age = age;
},
communicate: function()
{
alert('I do not know what I should say, but my name is ' + this.name);
}
};
方法做为参?br />如果你没有用过支持closure的语aQ象Ruby,C#Q你?x)发现象q样的语法真是太有趣?var myArray = ['first', 'second', 'third'];
myArray.each( function(item, index)
{
alert('The item in the position #' + index + ' is:' + item);
});
未完带箋.........
]]>
1
异常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login
Q?/span>
/Login
是你?/span>
action
名字Q?/span>
可能原因
:action
没有?/span>
struts-config.xml
中定义,或没有找到匹配的
action
Q例如在
JSP
文g中?/span>
<HTML:FORM&NBSP;ACTION="LOGIN.DO".
表单提交给
LOGIN.DO
处理
:
如果出现上述异常Q请查看
struts-config.xml
中的定义部分Q有时可能是打错了字W或者是某些不符合规则,可以使用
struts console
工具来检查?/span>
2
异常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null
可能原因
:
q个异常是因?/span>
Struts
Ҏ(gu)
struts-config.xml
中的
mapping
没有扑ֈ
action
期望?/span>
form bean
。大部分的情况可能是因ؓ(f)?/span>
form-bean
中设|的
name
属性和
action
中设|的
name
属性不匚w所致。换句话_(d)
action
?/span>
form
都应该各自有一?/span>
name
属性,q且要精匹配,包括大小写。这个错误当没有
name
属性和
action
兌时也?x)发生,如果没有?/span>
action
中指?/span>
name
属性,那么没?/span>
name
属性和
action
相关联。当然当
action
制作某些控制Ӟ譬如Ҏ(gu)参数D转到相应?/span>
jsp
面Q而不是处理表单数据,q是׃?/span>
name
属性,q也?/span>
action
的用方法之一?/span>
3
异常
No action instance for path /xxxx could be created
可能原因
特别提示Q因为有很多中情况会(x)Dq个错误的发生,所以推荐大家调高你?/span>
web
服务器的日志
/
调试U别Q这样可以从更多的信息中看到潜在的、在试图创徏
action
cL发生的错误,q个
action
cM已经?/span>
struts-config.xml
中设|了兌Q即d了标{)?/span>
?/span>
struts-config.xml
中通过
action
标签?/span>
class
属性指定的
action
cM能被扑ֈ有很多种原因Q例如:(x)
定位~译后的
.class
文gp|?/span>
Failure to place compiled .class file for the action in the classpath (
?/span>
web
开发中Q?/span>
class
的的位置?/span>
r WEB-INF/classes
Q所以你?/span>
action class
必须要在q个目录下。例如你?/span>
action
cM?/span>
WEB-INF/classes/action/Login.class,
那么?/span>
struts-config.xml
中设|?/span>
action
的属?/span>
type
时就?/span>
action.Login).
拼写错误Q这个也时有发生Qƈ且不易找刎ͼ特别注意W一个字母的大小写和包的名称?/span>
?/span>
struts-config.xml
中指定的
action
cL有承自
Stuts
?/span>
Action
c,或者你自定义的
Action
cL有承自
Struts
提供?/span>
Action
cR?/span>
你的
action
cdȝ承自
Struts
提供?/span>
Action
cR?/span>
你的
classpath
的问题。例?/span>
web server
没有发现你的资源文gQ资源文件必d
WEB-INF/classes/
目录下?/span>
4
?/span>
?/span>
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN
可能原因
没有?/span>
form bean
中的某个变量定义
getter
Ҏ(gu)
q个错误主要发生在表单提交的
FormBean
中,?/span>
struts
标记
<HTML:TEXT&NBSP;PROPERTY=”USERNAME?gt;
Ӟ?/span>
FormBean
中必L一?/span>
getUsername()
Ҏ(gu)。注意字母?/span>
U
”?/span>
5 Exception javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
可能原因
不是标识
Struts actionServlet
的标记就是映?/span>
.do
扩展名的标记或者两者都没有?/span>
web.xml
中声明?/span>
?/span>
struts-config.xml
中的打字或者拼写错误也可导致这个异常的发生。例如缺一个标记的关闭W号
/>
。最好?/span>
struts console
工具(g)查一下?/span>
另外Q?/span>
load-on-startup
必须?/span>
web.xml
中声明,q要么是一个空标记Q要么指定一个数|q个数值用来表
servlet
q行的优先Q数D大优先低?/span>
q有一个和使用
load-on-startup
有关的是使用
Struts
预编?/span>
JSP
文g时也可能Dq个异常?/span>
6 Exception
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
Probable Causes
试图?/span>
Struts
?/span>
form
标记外?/span>
form
的子元素。这常常发生在你在后面?/span>
Struts
?/span>
html
标记?/span>
另外要注意可能你不经意用的无主体的标记Q如
<HTML:FORM&NBSP;?amp;NBSP; />
Q这?/span>
web
服务器解析时当作一个无M的标讎ͼ随后使用的所有标记都被认为是在这个标C外的Q如又用了
<HTML:TEXT&NBSP;PROPERTY=”ID?gt;
q有是在?/span>
taglib
引入
HTML
标记库时Q你使用?/span>
prefix
的g?/span>
html
?/span>
常见错误Q?span lang="EN-US">
1
Q?span lang="EN-US">Caused by: org.dom4j.DocumentException: Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence.
如果出现q行错误说明你的XML配置文g有不规范的字W,(g)查下?
2
Q?span lang="EN-US">net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml
如果出现q行错误说明你的hibernate?span lang="EN-US">XML配置文g有错
3
Q?span lang="EN-US">net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found
如果出现q行错误说明hibernate?span lang="EN-US">XML配置文g没有扑ֈQ你应该?span lang="EN-US">XML文g攑֜与你的类文g同个目录?span lang="EN-US">,本文中是攑֜hibernate\classes\hibernate\目录下,也就是跟Hello_Bean.classcL件一赗?
4
Q?span lang="EN-US">net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean
如果出现q行错误说明你的xml文g里设|的字段?span lang="EN-US">name的gHello_Bean.Javac里?span lang="EN-US">getXXX?span lang="EN-US">setXXXҎ(gu)不一致?span lang="EN-US">
5
Q?span lang="EN-US">net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver
6.The database returned no natively generated identity value
?/span>
主键没有d增量