??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲αv久久久噜噜噜噜噜,亚洲AV无码成人精品区天堂,久久久久亚洲AV无码专区桃色http://m.tkk7.com/lanxin1020/category/38971.htmlzh-cnWed, 15 Apr 2009 09:47:43 GMTWed, 15 Apr 2009 09:47:43 GMT60struts2原理(?http://m.tkk7.com/lanxin1020/archive/2009/04/15/265744.htmllanxin1020lanxin1020Wed, 15 Apr 2009 06:03:00 GMThttp://m.tkk7.com/lanxin1020/archive/2009/04/15/265744.htmlhttp://m.tkk7.com/lanxin1020/comments/265744.htmlhttp://m.tkk7.com/lanxin1020/archive/2009/04/15/265744.html#Feedback0http://m.tkk7.com/lanxin1020/comments/commentRss/265744.htmlhttp://m.tkk7.com/lanxin1020/services/trackbacks/265744.html   Struts 2框架?个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑lg。在q?个部分里QStruts 2框架提供了核心控制器FilterDispatcherQ而用户需要实C务控制器和业务逻辑lg?
2.核心控制器:FilterDispatcher
  FilterDispatcher是Struts 2框架的核心控制器Q该控制器作Z个Filterq行在Web应用中,它负责拦截所有的用户hQ当用户h到达Ӟ该Filter会过滤用戯求。如果用戯求以actionl尾Q该h被转入Struts 2框架处理?

Struts 2框架获得?.actionh后,根?.actionh的前面部分决定调用哪个业务逻辑lgQ例如,对于login.actionhQStruts 2调用名ؓlogin的Action来处理该h?

Struts 2应用中的Action都被定义在struts.xml文g中,在该文g中定义ActionӞ定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户hQ而class属性决定了该Action的实现类?

Struts 2用于处理用户h的Action实例Qƈ不是用户实现的业务控制器Q而是Action代理——因为用户实现的业务控制器ƈ没有与Servlet API耦合Q显然无法处理用戯求。而Struts 2框架提供了系列拦截器Q该pd拦截器负责将HttpServletRequesth中的h参数解析出来Q传入到Action中,q回调Action 的executeҎ来处理用戯求?

昄Q上面的处理q程是典型的AOPQ面向切面编E)处理方式。图3.19昄了这U处理模型?



?.19  Struts 2的拦截器和Action

从图3.19中可以看出,用户实现的ActioncM仅是Struts 2的Action代理的代理目标。用户实现的业务控制器(ActionQ则包含了对用户h的处理。用Lh数据包含?HttpServletRequest对象里,而用LActioncL需讉KHttpServletRequest对象。拦截器负责?HttpServletRequest里的h数据解析出来Qƈ传给业务逻辑lgAction实例?
3.业务控制?
  正如从图3.19所看到的,业务控制器组件就是用户实现Actioncȝ实例QActionc里通常包含了一个executeҎQ该Ҏq回一个字W串——该字符串就是一个逻辑视图名,当业务控制器处理完用戯求后Q根据处理结果不同,executeҎq回不同字符?nbsp;  ——每个字W串对应一个视囑֐?

E序员开发出pȝ所需要的业务控制器后Q还需要配|Struts 2的ActionQ即需要配|Action的如下三个部分定义:

?nbsp; Action所处理的URL?

?nbsp; Actionlg所对应的实现类?

?nbsp; Action里包含的逻辑视图和物理资源之间的对应关系?

每个Action都要处理一个用戯求,而用戯求L包含了指定URL。当Filter Dispatcher拦截到用戯求后Q根据请求的URL和Action处理URL之间的对应关pL处理转发?
4.Struts 2的模型组?
  实际上,模型lg已经出了MVC框架的覆盖范围。对于Struts 2框架而言Q通常没有为模型组件的实现提供太多的帮助?

文本? ?.20 控制器调用模型组件Java EE应用里的模型lgQ通常指系l的业务逻辑lg。而隐藏在pȝ的业务逻辑lg下面的,可能q包含了DAO、领域对象等lg?

通常QMVC框架里的业务控制器会调用模型lg的方法来处理用户h。也是_业务逻辑控制器不会对用户hq行M实际处理Q用戯求最l由模型lg负责处理。业务控制器只是中间负责调度的调度器Q这也是UAction为控制器的原因?


?.20昄了这U处理流E?

提示  在图3.20中看到Action调用业务逻辑lg的方法。当控制器需要获得业务逻辑lg实例Ӟ通常q不会直接获取业务逻辑lg实例Q而是通过工厂模式来获得业务逻辑lg的实例;或者利用其他IoC容器Q如Spring容器Q来理业务逻辑lg的实例?
5.Struts 2的视囄?
  Struts 2已经改变了Struts 1只能使用JSP作ؓ视图技术的现状QStruts 2允许使用其他的模板技术,如FreeMarker、Velocity作ؓ视图技术?

当Struts 2的控制器q回逻辑视图名时Q逻辑视图q未与Q何的视图技术关联,仅仅是返回一个字W串Q该字符串作为逻辑视图名?

当我们在struts.xml文g中配|?ActionӞ不仅需要指定Action的name属性和class属性,q要为Action元素指定pdresult子元素,每个result子元素定义一个逻辑视图和物理视图之间的映射。前面所介绍的应用都使用了JSP技术作图,故配|result子元素时没有指定type属性,默认使用JSP 作ؓ视图资源?

如果需要在Struts 2中用其他视图技术,则可以在配置result子元素时Q指定相应的type属性即可。例如,如果需要用FreeMarkerQ则为result指定gؓfreemarker的type属性;如果想用Velocity模板技术作图资源,则ؓresult指定gؓvelocity的type属?#8230;…
6.Struts 2的运行流E?
  l过上面介绍Q我们发现Struts 2框架的运行流E非常类gWebWork框架的流E?

提示  在Struts 2的官方站点,我们可以扑ֈ如下说法QEssentiallyQStruts 2.0 is the technical equivalent of WebWork 2.3。Aside from the package and property renamingQit isn't much different thanQsayQmigrating from WebWork 2.1 to 2.2——意思是_Struts 2.0技术等同于WebWork 2.3框架Q除了包和属性被改名外。从WebWork 2.2q移到Struts 2不会比从WebWork 2.1q移?span class="hilite1">WebWork 2.2更复杂?

q里我们可以看到QStruts 2其实是WebWork 2.2的升U版Q这也就不难理解Qؓ什?span class="hilite1">WebWork和Struts 2如此怼Q?

因此QStruts 2的运行流E与WebWork的运行流E完全相同,读者可以参看图1.8来了解Struts 2的运行流E?


lanxin1020 2009-04-15 14:03 发表评论
]]>
struts2 使用 jakarta 上传文g时commons fileupload的异常捕捉(转自alfred.wQ?/title><link>http://m.tkk7.com/lanxin1020/archive/2009/04/14/265476.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Tue, 14 Apr 2009 04:50:00 GMT</pubDate><guid>http://m.tkk7.com/lanxin1020/archive/2009/04/14/265476.html</guid><wfw:comment>http://m.tkk7.com/lanxin1020/comments/265476.html</wfw:comment><comments>http://m.tkk7.com/lanxin1020/archive/2009/04/14/265476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lanxin1020/comments/commentRss/265476.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lanxin1020/services/trackbacks/265476.html</trackback:ping><description><![CDATA[     摘要: 问题Q?        struts2 使用jakarta 上传文gӞ如果上传文g的大超出commons fileupload(jakarta上传文gq是依赖commons-fileupload)讄的大就会在q入action以前抛出异常.       &nb...  <a href='http://m.tkk7.com/lanxin1020/archive/2009/04/14/265476.html'>阅读全文</a><img src ="http://m.tkk7.com/lanxin1020/aggbug/265476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-14 12:50 <a href="http://m.tkk7.com/lanxin1020/archive/2009/04/14/265476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主题Q谈谈我对Struts2文g上传的理?转自 netfork)http://m.tkk7.com/lanxin1020/archive/2009/04/14/265473.htmllanxin1020lanxin1020Tue, 14 Apr 2009 04:46:00 GMThttp://m.tkk7.com/lanxin1020/archive/2009/04/14/265473.htmlhttp://m.tkk7.com/lanxin1020/comments/265473.htmlhttp://m.tkk7.com/lanxin1020/archive/2009/04/14/265473.html#Feedback0http://m.tkk7.com/lanxin1020/comments/commentRss/265473.htmlhttp://m.tkk7.com/lanxin1020/services/trackbacks/265473.html 

下文书中包的版本Qcommons-fileupload-1.2.1.jar、struts2-core-2.1.2.jar

孙鑫的书《Struts2 深入详解?09|关于限制上传文g的最大长度的内容?
其中谈到fileUpload拦截器只是当文g上传到服务器上之后,才进行的文gcd和大判断?
Struts2框架底层默认用的是apache的commons-fileuploadlg对上传文件进行接受处理?
通过struts.multipart.maxSize属性来Ҏ件大进行限定时Q将直接影响到commons-fileuploadlg的文件大设定,默认?M。当上传文g过了这个尺寸时Q将从commons-fileuploadlg中抛出SizeLimitExceededException异常。上传文件拦截器捕获到这个异常后Q将直接把该异常信息讄为ActionU别的错误信息?

l过我的试和对源代码的DebugQ发现确实如孙鑫书中所aQ如果上传文件大?MӞ在页面上出C一堆英文的错误信息Q大致是Qthe request was rejected because its size....exceeds the configured maximum...q且在fieUpload中将来自MultiPartRequestWrapper型request对象的错误信息给加到了Action的错误中?

q时候,你在ApplicationResources.properties中自定义的上传文件过大的错误信息Ҏ不v作用。原因就如书上所aQ在底层commons-fileuploadlg中就把异常给抛出来了文gҎ没被上传Q所以到了fileUpload拦截器时Q根据取不到文gQ当然也没法对文g的类型和大小q行判断了?

然而,q个异常直接带来两个问题Q?/strong>

1、在面上显CZ英文的错误信息。这L信息昄不是我们惌的?
2、由于错误的产生Q原来页面上输入的其他文本内容也都不见了Q也是说params注入p|?/strong>

带着q两个问题,我们来探M下Struts2对于h的处理过E?
注:qƈ不是一关于Struts2hq程的介l,主要是ؓ了解决以上两个问题,才引L单分析?

首先当然我们要拿FilterDispatcher开刀?/strong>

在doFilterҎ中调用了prepareDispatcherAndWrapRequestҎQؓ了包装出Struts2自己的request对象Q在prepareDispatcherAndWrapRequestҎ中调用DispatchercȝwrapRequestҎQ在q个Ҏ里,会根据请求内容的cd(提交的是文本的,q是multipart/form-data格式)Q决定是使用tomcat的HttpServletRequestWrappercddh中的数据Q还是用Struts2的MultiPartRequestWrapper来分请求中的数据?
注:向服务器hӞ数据是以的形式向服务器提交Q内Ҏ一些有规则东东Q我们^时在jsp中用request内置对象取parameterӞ实际上是由tomcat的HttpServletRequestWrappercd解好了的Q无需我们再分解这些东西了?

当然Q在q里Q我们研I的是上传文件的情况Q所以,׃form中设定的提交内容是媒体格式的Q所以,DispatchercȝwrapRequestҎ会将h交由MultiPartRequestWrappercL处理?

MultiPartRequestWrapperq个cLStruts2的类Qƈ且承了tomcat的HttpServletRequestWrapperc,也是我们用来代替HttpServletRequestq个cȝc,看名字也知道Q是对多媒体h的包装类?
Struts2本n当然不会再造个轮子Q来解析hQ而是交由Apache的commons-fileuploadlg来解析了?
在MultiPartRequestWrapper的构造方法中Q会调用MultiPartRequestQ默认ؓJakartaMultiPartRequestc)的parseҎ来解析请求?

在Struts2的JakartaMultiPartRequestcȝparseҎ中才会真正来调用commons-fileuploadlg的ServletFileUploadcdhq行解析Q至此,Struts2已经实现了将h转交commons-fileuploadlg对请求解析的全过E。剩下的是{commons-fileuploadlg对请求解析完毕后Q拿到分解后的数据,Ҏfield名,依次分解后的field名和值放到paramsQHashMapcdQ里Q同时JakartaMultiPartRequestc重|了HttpServletRequest的好多方法,比如熟知的getParameter、getParameterNames、getParameterValuesQ实际上都是从解析后得到的那个params对象里拿数据Q在q个q程Qcommons-fileuploadlg也乖乖的把上传的文g分析好了QJakartaMultiPartRequest也毫不客气的把分解后的文件一个一个的攑ֈ了filesQHashMapcdQ中Q实际上此时Qcommons-fileuploadlg已经所有要上传的文件上传完了。至此,Struts2实现了对HttpServletRequestcȝ包装Q当回到MultiPartRequestWrappercdQ再取一下上q解析过E中发生的错误,然后把错误加C自己的errors列表中了。同h们会发现在MultiPartRequestWrappercMQ也把HttpServletRequestcȝ好多Ҏ重蝲了,毕竟是个包装cdQ实际上对于上传文g的请求,在Struts2后期的处理中用到的request都是MultiPartRequestWrappercd象,比如我们调用getParameterӞ直接调用的是MultiPartRequestWrapper的getParameterҎQ间接调的是JakartaMultiPartRequestcd象的getParameterҎ?
注:从这里,我们可以看出,JakartaMultiPartRequest是完全设计成可以替换的类了?

然后l箋向回q,CDispatchercȝwrapRequestҎQ直接把MultiPartRequestWrapper对象q回了,我们q于回CFilterDispatchercȝprepareDispatcherAndWrapRequestҎQ此Ӟ我们拿到了完全解析好了的request对象QMultiPartRequestWrapperc)Q该对象又进一步被q回CFilterDispatchercȝdoFilterҎQ也是回到了出发点Q至此,doFilter中拿到的request对象是一个将h中的数据分解好的了HttpServletRequest对象Q我们完全可以用getParameterҎ取其中的数据了,同时Q我们也可以用getFiles得到文g数组了?
doFilterҎ中,会进一步调用actionMapper的getMappingҎ对urlq行解析Q找出命名空间和action名等Q以备后面根据配|文件调用相应的拦截器和action使用?

关于doFilterҎ中下一步对DispatchercȝserviceActionҎ的调用,不再描述QM在action被调用之前,会首先走到fileUpload拦截器(对应的是FileUploadInterceptorc)Q在q个拦截器中Q会先看一下request是不?MultiPartRequestWrapper,如果不是Q就说明不是上传文g用的requestQfildUpload拦截器会直接控制权交给下一个拦截器Q如果是Q就会把request对象{为MultiPartRequestWrapper对象Q然后调用hasErrorsҎQ看看有没有上传时候生的错误Q有的话Q就直接加到了Action的错误(ActionU别的)中了。另外,在fileUpload拦截器中会将MultiPartRequestWrapper对象中放|的文g全取出来Q把文g、文件名、文件类型取出来Q放到request的parameters中,q样Cparams拦截器时Q就可以L的将q些内容注入到Action中了Q这也就是ؓ什么fileUpload拦截器需要放在params拦截器前面的理由。在文g都放到request的parameters对象里之后,fileUpload拦截器会l箋调用其他拦截器直到Action{执行完毕,他还要做一个扫工作Q把临时文g夹中的文件删除(q些文g是由commons-fileuploadlg上传的,供你在自qAction中将文gcopy到指定的目录下,当action执行完了后,q些临时文g当然没用了Q?

你好Q你q在看吗Q?/strong>呵呵Q是不是太多了,也太׃Q没办法QStruts2是q样的调用的。也不知道Struts2有没有公开其Sequence图,我是想画一个,不过Q太懒,q是看着代码说说吧?

如果上面看烦了,也完全可以不看了Q直接看下面的?/strong>

在上面一番分析之后,文g上传的全q程q束了?
我们回到我们的问题上来?

先看W一个:
1、在面上显CZ英文的错误信息。这昄不是我们惌的?/strong>

没办法了Qcommons-fileuploadlg没想到国际化Q在FileUploadInterceptor拦蝲器中Q也没想着国际化,直接攑ֈAction的错误中了,没他事了,三种做法Q?
  (1)在错误显CZ前,把这条错误给换掉Q应该难度不大,我没做留l你做了?
  (2)或者重写一下JakartaMultiPartRequestq个c,把捕捉到的异怿息换成自qQ然后,通过Struts2的配|文Ӟ把我们重写的q个parser换上ȝ?
  (3)直接改commons-fileuploadlg的类Q换成中文的?
我具体说一下第(3)U做法:扑ֈFileUploadBasec,?02行~908行改一下?
FileUploadException ex =
    new SizeLimitExceededException(
        "the request was rejected because"
        + " its size (" + pCount
        + ") exceeds the configured maximum"
        + " (" + pSizeMax + ")",
        pCount, pSizeMax);
=>
FileUploadException ex = new SizeLimitExceededException(
"服务器拒l了您的hQ原因可能是向服务器提交的数据发生了丢失?, pCount, pSizeMax);

?14行~918行改一下?
throw new SizeLimitExceededException(
        "the request was rejected because its size ("
        + requestSize
        + ") exceeds the configured maximum ("
        + sizeMax + ")",
=>
throw new SizeLimitExceededException("服务器拒l了您的hQ原因是提交数据量过?通常是由于上传文件过?Q请q回上页重试?
+ " (最大字节数Q? + sizeMax / 1024
+ "K)", requestSize, sizeMax);


再看一下第二个问题?
2、由于错误的产生Q原来页面上输入的内容也全部不见了,也就是说params注入p|?/strong>
关于q个问题我在javaeye上搜索到一文章(使用的commons-fileuploadlg的jar包似乎比较老)?
http://www.javaeye.com/topic/197345

虽然按照此文Q当上传p|Ӟ能够其他输入内ҎC出来,但是q样做的l果是全部的文g肯定会上传到服务器上Q也是_虽然是页面上报了文g因ؓ太大Q请求被拒绝的错Q但是文件依然会被上传到服务器上Qcommons-fileuploadlgҎ没会L文g的上传?
在这里要说明一下,如果你不抛出q个异常Q请求的会l箋向服务器上传Q只有当整个上传完了之后,commons-fileuploadlg才能正确的分析出文g部分、文本部分。所以,在这里抛出异常是不得已的作法Q如果不抛异常,后果是虽焉面报错,但文件还是会被传到服务器的上Q这一步根本没挡住输入的上传Q如果没挡住的话Q大家想想会有什么后果?
所以,lg所qͼ对于W二个问题,如果出现了这个异常,我们Ҏ无法让原来输入的内容q显C出来的Q因为commons-fileuploadlgq没有解析全部的输入内容Q直接给出异怺Q到了params拦截器中Qrequest里就是空的,Ҏ取不到parameterQ所以也无法注入到Action中了。这U情况下Q只能显CZ个告知用L于提交数据量q大Q服务器拒绝了请求的错误信息Q比较好的方法是Q直接蟩C个专门的面Q提C用P然后让用Lq回来再ơ输入,否则用户会感觉上传文件大大吧,怎么q我输入的其他一些内容也没给保存住。当Ӟ如果能用Ajax来上传文Ӟ对客L操作体验可能是最好的Q但是,q样可能会导致服务器上有些挂I的文gQ上传后从来没被用过Q,需要想法清除的?

整个分析下来Q我们说W二个问题基本上是无法避免的?


lanxin1020 2009-04-14 12:46 发表评论
]]>
webservice 概述(转自linliangyi2007)http://m.tkk7.com/lanxin1020/archive/2009/04/13/265351.htmllanxin1020lanxin1020Mon, 13 Apr 2009 10:37:00 GMThttp://m.tkk7.com/lanxin1020/archive/2009/04/13/265351.htmlhttp://m.tkk7.com/lanxin1020/comments/265351.htmlhttp://m.tkk7.com/lanxin1020/archive/2009/04/13/265351.html#Feedback0http://m.tkk7.com/lanxin1020/comments/commentRss/265351.htmlhttp://m.tkk7.com/lanxin1020/services/trackbacks/265351.html阅读全文

lanxin1020 2009-04-13 18:37 发表评论
]]>
10Struts2文g上传功能开发(转自黑暗子Q?/title><link>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265297.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Mon, 13 Apr 2009 07:33:00 GMT</pubDate><guid>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265297.html</guid><wfw:comment>http://m.tkk7.com/lanxin1020/comments/265297.html</wfw:comment><comments>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lanxin1020/comments/commentRss/265297.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lanxin1020/services/trackbacks/265297.html</trackback:ping><description><![CDATA[技术要?<br /> 本节代码详细说明文g上传功能的开发流E,介绍知识点如下: <br /> <div style="text-align: left">?文g上传面和显CZ传成功页面代码内宏V?<br /> ?UploadActioncM实现上传功能Ҏ和上传文件属性介l?<br /> ?struts.xml中UploadAction配置Q以及字W编码、文件时存放\径配|?<br /> ?上传后所处\径和最l上传成功后效果展示?/div> <br /> 演示代码 <br /> 上传文g面Q这里笔者定义的是多个文件上传?<br /> <div id="qkg24m4" class="dp-highlighter"> <div id="22iyioi" class="bar"> <div id="6wseyoq" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!---------------------文g名:upload.jsp----------------->   </span></span></li> <li><span><%</span><span id="oi2koes" class="annotation">@taglib</span><span> prefix=</span><span id="c42cwmk" class="string">"s"</span><span> uri=</span><span id="gksc4sm" class="string">"/struts-tags"</span><span>%>   </span></span></li> <li><span><html>   </span></li> <li><span>    <head>   </span></li> <li><span>        <meta http-equiv=</span><span id="o2ia4qe" class="string">"Content-Type"</span><span> content=</span><span id="igaassy" class="string">"text/html; charset=gb2312"</span><span>>   </span></span></li> <li><span>        <title>上传文g</title>   </span></li> <li><span>    </head>   </span></li> <li><span>    <body>   </span></li> <li><span>    <!-- 上传文g表单定义 -->   </span></li> <li><span>    <s:form action=</span><span id="eaug2m4" class="string">"upload"</span><span> method=</span><span id="o2oaski" class="string">"post"</span><span> enctype=</span><span id="ewy44g4" class="string">"multipart/form-data"</span><span>>   </span></span></li> <li><span>        <tr>   </span></li> <li><span>    <!-- 上传文g标签定义 -->   </span></li> <li><span>    <td>上传文g:<s:file name=</span><span id="ag424ak" class="string">"file"</span><span>></s:file></td>   </span></span></li> <li><span>    </tr>   </span></li> <li><span>    <tr>   </span></li> <li><span>    <td>再次上传文g:<s:file name=</span><span id="ew2ca4e" class="string">"file"</span><span>></s:file></td>   </span></span></li> <li><span>    </tr>   </span></li> <li><span>    <tr>   </span></li> <li><span>    <td align=</span><span id="24wg4sa" class="string">"left"</span><span>><s:submit name=</span><span id="su2g4ki" class="string">"submit"</span><span> value=</span><span id="4cey4em" class="string">"提交"</span><span>></s:submit></td>   </span></span></li> <li><span>    </tr>   </span></li> <li><span>    </s:form>   </span></li> <li><span>    </body>   </span></li> <li><span></html>  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!---------------------文g名:upload.jsp-----------------> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>上传文g</title> </head> <body> <!-- 上传文g表单定义 --> <s:form action="upload" method="post" enctype="multipart/form-data"> <tr> <!-- 上传文g标签定义 --> <td>上传文g:<s:file name="file"></s:file></td> </tr> <tr> <td>再次上传文g:<s:file name="file"></s:file></td> </tr> <tr> <td align="left"><s:submit name="submit" value="提交"></s:submit></td> </tr> </s:form> </body> </html></pre> <br /> 上传文g成功后结果页?<br /> <div id="mo244c4" class="dp-highlighter"> <div id="42c424i" class="bar"> <div id="6as4aks" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!-------------------文g名:result.jsp ----------------->   </span></span></li> <li><span><%</span><span id="wq24cuk" class="annotation">@taglib</span><span> prefix=</span><span id="gi624ec" class="string">"s"</span><span> uri=</span><span id="ugmwi2k" class="string">"/struts-tags"</span><span>%>   </span></span></li> <li><span><html>   </span></li> <li><span>    <head>   </span></li> <li><span>        <meta http-equiv=</span><span id="mmum244" class="string">"Content-Type"</span><span> content=</span><span id="4g444c4" class="string">"text/html; charset=gb2312"</span><span>>   </span></span></li> <li><span>        <title>上传l果</title>   </span></li> <li><span>    </head>   </span></li> <li><span>    <body>   </span></li> <li><span>        上传文gQ?  </span></li> <li><span>        <!-- 昄上传成功文g?nbsp;-->   </span></li> <li><span>        <s:property value=</span><span id="yqmia2q" class="string">"fileFileName"</span><span> />   </span></span></li> <li><span>    </body>   </span></li> <li><span></html>  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!-------------------文g名:result.jsp -----------------> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>上传l果</title> </head> <body> 上传文gQ? <!-- 昄上传成功文g?--> <s:property value="fileFileName" /> </body> </html></pre> <br /> UploadActioncM?<br /> <div id="i4g4yy2" class="dp-highlighter"> <div id="ga2qa2c" class="bar"> <div id="2kwgs4u" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!------------------文g名:UploadAction.java ------------------>   </span></span></li> <li><span id="yi4cogo" class="keyword">import</span><span> java.io.File;   </span></span></li> <li><span id="qsic24c" class="keyword">import</span><span> java.io.FileInputStream;   </span></span></li> <li><span id="ac2ma4w" class="keyword">import</span><span> java.io.FileNotFoundException;   </span></span></li> <li><span id="y2y4a4k" class="keyword">import</span><span> java.io.FileOutputStream;   </span></span></li> <li><span id="244okgw" class="keyword">import</span><span> java.io.IOException;   </span></span></li> <li><span id="244eqg4" class="keyword">import</span><span> java.io.InputStream;   </span></span></li> <li><span id="cm4cmcc" class="keyword">import</span><span> java.io.OutputStream;   </span></span></li> <li><span id="eycgigw" class="keyword">import</span><span> java.util.List;   </span></span></li> <li><span>  </span></li> <li><span id="o2m4qym" class="keyword">import</span><span> org.apache.struts2.ServletActionContext;   </span></span></li> <li><span id="qk4cuma" class="keyword">import</span><span> com.opensymphony.xwork2.ActionSupport;   </span></span></li> <li><span>  </span></li> <li><span id="44os4ie" class="comment">//文g上传Action </span><span>  </span></span></li> <li><span id="cu4uyem" class="keyword">public</span><span> </span><span id="64w4ggw" class="keyword">class</span><span> UploadAction </span><span id="2yikywm" class="keyword">extends</span><span> ActionSupport {   </span></span></li> <li><span>    </span><span id="k444cig" class="comment">//上传文g存放路径 </span><span>  </span></span></li> <li><span>    </span><span id="yi2ycko" class="keyword">private</span><span> </span><span id="c4ua4y4" class="keyword">final</span><span> </span><span id="26cqcqg" class="keyword">static</span><span> String UPLOADDIR = </span><span id="wymi2ok" class="string">"/upload"</span><span>;   </span></span></li> <li><span>    </span><span id="smyku4o" class="comment">//上传文g集合 </span><span>  </span></span></li> <li><span>    </span><span id="oi4oayo" class="keyword">private</span><span> List<File> file;   </span></span></li> <li><span>    </span><span id="qyguomk" class="comment">//上传文g名集?</span><span>  </span></span></li> <li><span>    </span><span id="4qkmu44" class="keyword">private</span><span> List<String> fileFileName;   </span></span></li> <li><span>    </span><span id="4ceq2o4" class="comment">//上传文g内容cd集合 </span><span>  </span></span></li> <li><span>    </span><span id="ssauo2g" class="keyword">private</span><span> List<String> fileContentType;   </span></span></li> <li><span>  </span></li> <li><span>    </span><span id="gqm4io4" class="keyword">public</span><span> List<File> getFile() {   </span></span></li> <li><span>        </span><span id="cwmg2ek" class="keyword">return</span><span> file;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="oaswwmc" class="keyword">public</span><span> </span><span id="wqcuygw" class="keyword">void</span><span> setFile(List<File> file) {   </span></span></li> <li><span>        </span><span id="c44kw44" class="keyword">this</span><span>.file = file;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="2w4oiy4" class="keyword">public</span><span> List<String> getFileFileName() {   </span></span></li> <li><span>        </span><span id="i2ioyou" class="keyword">return</span><span> fileFileName;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="ag24mc2" class="keyword">public</span><span> </span><span id="4q4a4ky" class="keyword">void</span><span> setFileFileName(List<String> fileFileName) {   </span></span></li> <li><span>        </span><span id="uoikmc2" class="keyword">this</span><span>.fileFileName = fileFileName;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="i4cassq" class="keyword">public</span><span> List<String> getFileContentType() {   </span></span></li> <li><span>        </span><span id="y2ysmka" class="keyword">return</span><span> fileContentType;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="24uogg2" class="keyword">public</span><span> </span><span id="2y4qq4u" class="keyword">void</span><span> setFileContentType(List<String> fileContentType) {   </span></span></li> <li><span>        </span><span id="gyk4q44" class="keyword">this</span><span>.fileContentType = fileContentType;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="me2gqg4" class="keyword">public</span><span> String execute() </span><span id="s4kco4s" class="keyword">throws</span><span> Exception {   </span></span></li> <li><span>        </span><span id="egi2euw" class="keyword">for</span><span> (</span><span id="qa4me4i" class="keyword">int</span><span> i = </span><span id="u2uo4c4" class="number">0</span><span>; i < file.size(); i++) {   </span></span></li> <li><span>            </span><span id="eoi242q" class="comment">//循环上传每个文g </span><span>  </span></span></li> <li><span>            uploadFile(i);   </span></li> <li><span>        }   </span></li> <li><span>        </span><span id="2a24a4e" class="keyword">return</span><span> </span><span id="goc4gu2" class="string">"success"</span><span>;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="4e4mi44" class="comment">//执行上传功能 </span><span>  </span></span></li> <li><span>    </span><span id="6ioc44c" class="keyword">private</span><span> </span><span id="s222iy4" class="keyword">void</span><span> uploadFile(</span><span id="gacoiw4" class="keyword">int</span><span> i) </span><span id="sc24e4g" class="keyword">throws</span><span> FileNotFoundException, IOException {   </span></span></li> <li><span>        </span><span id="y2oicq6" class="keyword">try</span><span> {   </span></span></li> <li><span>            InputStream in = </span><span id="q44o2us" class="keyword">new</span><span> FileInputStream(file.get(i));   </span></span></li> <li><span>            String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);   </span></li> <li><span>            File uploadFile = </span><span id="2kike4w" class="keyword">new</span><span> File(dir, </span><span id="iim2oeq" class="keyword">this</span><span>.getFileFileName().get(i));   </span></span></li> <li><span>            OutputStream out = </span><span id="2o424ig" class="keyword">new</span><span> FileOutputStream(uploadFile);   </span></span></li> <li><span>            </span><span id="wwicw44" class="keyword">byte</span><span>[] buffer = </span><span id="44mik4e" class="keyword">new</span><span> </span><span id="2ckcqsu" class="keyword">byte</span><span>[</span><span id="kwo2i4k" class="number">1024</span><span> * </span><span id="ice244w" class="number">1024</span><span>];   </span></span></li> <li><span>            </span><span id="qq2kwkm" class="keyword">int</span><span> length;   </span></span></li> <li><span>            </span><span id="4co444q" class="keyword">while</span><span> ((length = in.read(buffer)) > </span><span id="yas2ow2" class="number">0</span><span>) {   </span></span></li> <li><span>                out.write(buffer, </span><span id="2awuoug" class="number">0</span><span>, length);   </span></span></li> <li><span>            }   </span></li> <li><span>  </span></li> <li><span>            in.close();   </span></li> <li><span>            out.close();   </span></li> <li><span>        } </span><span id="cwysess" class="keyword">catch</span><span> (FileNotFoundException ex) {   </span></span></li> <li><span>            ex.printStackTrace();   </span></li> <li><span>        } </span><span id="oey4u4o" class="keyword">catch</span><span> (IOException ex) {   </span></span></li> <li><span>            ex.printStackTrace();   </span></li> <li><span>        }   </span></li> <li><span>    }   </span></li> <li><span>}  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!------------------文g名:UploadAction.java ------------------> import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //文g上传Action public class UploadAction extends ActionSupport { //上传文g存放路径 private final static String UPLOADDIR = "/upload"; //上传文g集合 private List<File> file; //上传文g名集? private List<String> fileFileName; //上传文g内容cd集合 private List<String> fileContentType; public List<File> getFile() { return file; } public void setFile(List<File> file) { this.file = file; } public List<String> getFileFileName() { return fileFileName; } public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName; } public List<String> getFileContentType() { return fileContentType; } public void setFileContentType(List<String> fileContentType) { this.fileContentType = fileContentType; } public String execute() throws Exception { for (int i = 0; i < file.size(); i++) { //循环上传每个文g uploadFile(i); } return "success"; } //执行上传功能 private void uploadFile(int i) throws FileNotFoundException, IOException { try { InputStream in = new FileInputStream(file.get(i)); String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR); File uploadFile = new File(dir, this.getFileFileName().get(i)); OutputStream out = new FileOutputStream(uploadFile); byte[] buffer = new byte[1024 * 1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }</pre> <br /> struts.xml配置文g中有x件上传的配置Q?<br /> <div id="2ykmi44" class="dp-highlighter"> <div id="2qkoyo4" class="bar"> <div id="gic2uss" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!--------------------文g名:struts.xml------------------->   </span></span></li> <li><span><struts>   </span></li> <li><span>    <!-- pȝ帔R定义Q定义上传文件字W集~码 -->   </span></li> <li><span>    <constant name=</span><span id="qac2euk" class="string">"struts.i18n.encoding"</span><span> value=</span><span id="i2icum4" class="string">"gb2312"</span><span>></constant>   </span></span></li> <li><span>    <!-- pȝ帔R定义Q定义上传文件时存放\?nbsp;-->   </span></li> <li><span>    <constant name=</span><span id="a2qce42" class="string">"struts.multipart.saveDir"</span><span> value=</span><span id="4i4kmm4" class="string">"c:\"</span><span>></constant>   </span></span></li> <li><span>    <!-- Action所在包定义 -->   </span></li> <li><span>    <</span><span id="2yce4ai" class="keyword">package</span><span> name=</span><span id="22ga4gw" class="string">"C04.4"</span><span> </span><span id="smwa2y4" class="keyword">extends</span><span>=</span><span id="w2o4ooe" class="string">"struts-default"</span><span>>   </span></span></li> <li><span>        <!-- Action名字Q类以及D面定义 -->   </span></li> <li><span>        <!-- 通过Actioncd理才D的的Action定义 -->   </span></li> <li><span>        <action name=</span><span id="2oysmec" class="string">"upload"</span><span> </span><span id="c4kw2ci" class="keyword">class</span><span>=</span><span id="2424444" class="string">"action.UploadAction"</span><span>>   </span></span></li> <li><span>            <result name=</span><span id="u24e44y" class="string">"input"</span><span>>/jsp/upload.jsp</result>   </span></span></li> <li><span>            <result name=</span><span id="24wo4uk" class="string">"success"</span><span>>/jsp/result.jsp</result>   </span></span></li> <li><span>        </action>   </span></li> <li><span>    </</span><span id="2yqk6uu" class="keyword">package</span><span>>   </span></span></li> <li><span></struts>   </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!--------------------文g名:struts.xml-------------------> <struts> <!-- pȝ帔R定义Q定义上传文件字W集~码 --> <constant name="struts.i18n.encoding" value="gb2312"></constant> <!-- pȝ帔R定义Q定义上传文件时存放\?--> <constant name="struts.multipart.saveDir" value="c:\"></constant> <!-- Action所在包定义 --> <package name="C04.4" extends="struts-default"> <!-- Action名字Q类以及D面定义 --> <!-- 通过Actioncd理才D的的Action定义 --> <action name="upload" class="action.UploadAction"> <result name="input">/jsp/upload.jsp</result> <result name="success">/jsp/result.jsp</result> </action> </package> </struts> </pre> <br /> Q?Q:文g上传面如图4.8所C?<br /> <br /> ?.8  文g上传 <br /> Q?Q:选择文g如图4.9所C?<br /> <br /> ?.9  选择上传的文?<br /> Q?Q:单击“提交”按钮后文件上传成功页面,q显CZ传文件名Q如?.10所C?<br /> <br /> ?.10  上传文g成功后效?<br /> Q?Q:两个被上传文件最l在服务器上存放路径效果如图4.11所C?<br /> <br /> ?.11  上传文g存放路径?<br /> 代码解释 <br /> Q?Q在upload.jsp中通过Form标签和File标签定义了两个上传文件。Struts2标签W者会在之后章节里具体介绍Q这里只是让读者知道是如何使用标签昄?.8昄的内宏V如果上传成功,W者在result.jsp?#8220;[”?#8220;]”之间昄上传文g的文件名Q如果是多个文gQ以“Q?#8221;盔R。这些显C格式都是用Property标签定义的?<br /> 注意Q如果上传文Ӟ在JSP的Form中一定要定义如upload.jsp文g中黑体表C的部分。method和enctype属性都必须要如代码中所C。这样Form中上传文件才会v作用?<br /> Q?QUploadAction文g中先定义了常量UPLOADDIRQ它是上传文件上传后存放的文件夹名字。比如笔者用的是JBossQ附录中有安装和在MyEclipse中部|的操作说明Q,则在它的已部|Web目下的upload文g夹中Q会有所有上传成功的文g。如?.11读者也可以看见它的上传文g最l存放\径?<br /> 注意Q在MyEclipse中开发的“WebRoot”目录下也要新Z个upload文g夹,否则部v后在JBoss的已部vWeb目下将没有upload文g夏V因为部|的时候会所?#8220;WebRoot”目录下的文g夹和文g都部|到JBoss的已部vWeb目下?<br /> 定义好UPLOADDIR后,在定义上传文件的属性变量。也许其中的“fileFileName”?#8220;fileContentType”读者看了有点别扭,其?#8220;fileFileName”感觉不符合Java命名规范Q但是这两个属性变量是4.1节中介l的“fileUpload”拦截器类中的cd有变量名字,只有q样定义QUploadAction执行时候会把在面上选择的上传文件的属性值放在这两个变量里面Q否则调试UploadAction时候会发现q两个变量都会是“null”即空倹{不怿的读者可以自行改变这两个变量名再执行上传文g功能q行调试看一下这两个变量得到的倹{?<br /> 注意Q因里笔者是q行多个文g上传功能开发,因此“file”?#8220;fileFileName”?#8220;fileFileName”属性变量都讑֮为ListcdQ其实还可以讑֮为数l类型。个得没有啥大区别。完全凭个h喜好而定。还有如果读者自己开发单个文件上传,没必要把它们设定ؓListcd或数l类型。直接把“file”定义为Java的IO包中的FilecdQ?#8220;fileFileName”?#8220;fileFileName”定义为普通的Stringcd卛_W串cd?<br /> 之后在executeҎ中,写一个@环,Ҏ有页面中选择的上传文件一个个q行上传。这里笔者运用了重构中的“抽取Ҏ”的方式,上传文件的功能装成一个私有方法,名字?#8220;uploadFile”。其中运用了Java的IO包中很多APIҎ。有寚w构和Java的IO功能不了解的读者可以去查阅相关资料ȝ解掌握,q里不是本书以及本节重点Q因此不再具体记q?<br /> Q?Qstruts.xml中定义了<constant>标签Q主要定义了文g名和文g内容昄的字W编码集以及q些被上传文件时存放\径?<br /> 先说明一?lt;constant>标签Q顾名思义q是定义整个Web目的一些常量属性|如果不定义则在Struts2自带的default.propertiesQ读者们可到自己安装Struts2的文件\径src\core\src\main\resources\org\apache\struts2\下找刎ͼ文g中有q些帔R的定义,比如在本节struts.xml文g中的“struts.i18n.encoding”?#8220;struts.multipart.saveDir”在default.properties定义代码如下Q?<br /> <div id="o2cu64s" class="dp-highlighter"> <div id="c2eg4a4" class="bar"> <div id="242uy44" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!--------------------文g名:</span><span id="24u4c4m" class="keyword">default</span><span>.properties---------------->   </span></span></li> <li><span>### This can be used to set your </span><span id="we4ie4o" class="keyword">default</span><span> locale and encoding scheme   </span></span></li> <li><span># struts.locale=en_US   </span></li> <li><span>struts.i18n.encoding=UTF-</span><span id="k22244u" class="number">8</span><span>  </span></span></li> <li><span>  </span></li> <li><span>### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data   </span></li> <li><span># struts.multipart.parser=cos   </span></li> <li><span># struts.multipart.parser=pell   </span></li> <li><span>struts.multipart.parser=jakarta   </span></li> <li><span># uses javax.servlet.context.tempdir by </span><span id="gu444qi" class="keyword">default</span><span>  </span></span></li> <li><span>struts.multipart.saveDir=  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!--------------------文g名:default.properties----------------> ### This can be used to set your default locale and encoding scheme # struts.locale=en_US struts.i18n.encoding=UTF-8 ### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir=</pre> <br /> 如果不在struts.xml文g中定义,则Web目会缺省用default.properties文g中这两个帔R属性的定义。一个将使字W编码集变ؓ“UTF-8”Q另一个干脆没有Q何文件\径指定。而笔者开发的该Web目~省支持的字W编码集?#8220;gb2312”Q而且需要指定时上传文件存放\径。(当然如果读者开发的Web目~省~码集就?#8220;UTF-8”Q而且也ƈ不需要指定时\径时候,没必要在struts.xml中定义这两个<constant>Q,因此有必要定义这两个属性符合项目开发要求?<br /> 注意Q也可以如第3章那P把这两个属性定义在自定义的struts.properties文g中,具体代码可以如下Q?<br /> <div id="6qmg4si" class="dp-highlighter"> <div id="smi2mwc" class="bar"> <div id="i4mg44c" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!------------------------文g名:struts.properties------------------>   </span></span></li> <li><span>struts.i18n.encoding =gb2312   </span></li> <li><span>struts.multipart.saveDir= c:\  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!------------------------文g名:struts.properties------------------> struts.i18n.encoding =gb2312 struts.multipart.saveDir= c:\</pre> <br /> W者个为比在struts.xml中定义更加好Q毕竟Struts2自己也是定义在properties属性文件中Q而不是定义在自己的xml配置文g中。(Struts2自带的xml配置文g为struts-default.xmlQ在4.1节中已记述Q。这里是Z让读者知道struts.xml配置文g也可以配|这些属性,因此写在struts.xml配置文g中。从3.2节W者说明struts.xml配置文g时ƈ没有介绍<constant>标签q点也可以知道笔者个人其实是不赞同这L配置手段卛_struts.xml中配|?lt;constant>标签?<br /> ?lt;Action>标签中配|?#8220;result”Q和W?章类|这两个JSP文g的导航流E配|好卛_?<br /> Q?Q开始进行文件上传功能展C,按照如上记述的步骤执行即可。笔者在桌面上新Z两个文本文gQ将它们上传到JBoss已部|的Web目中展C文件上传的upload文g夹下。如?.11所C?<br /> 其实q可以指定上传文件的格式Q让它只上传特定cd的文件。比如只能上传文本和xml文gQ则在struts.xml需要显C配|?#8220;uploadFile”拦截器。如下代码: <br /> <div id="6uo4yg4" class="dp-highlighter"> <div id="u4auqo2" class="bar"> <div id="24mo6yy" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!-----------------------文g名:struts.xml------------------>   </span></span></li> <li><span><struts>   </span></li> <li><span>    <!-- Action所在包定义 -->   </span></li> <li><span>    <</span><span id="ge2w4cq" class="keyword">package</span><span> name=</span><span id="uisusyo" class="string">"C04.4"</span><span> </span><span id="sea4k44" class="keyword">extends</span><span>=</span><span id="u2wsw44" class="string">"struts-default"</span><span>>   </span></span></li> <li><span>        <!-- Action名字Q类以及D面定义 -->   </span></li> <li><span>        <!-- 通过Actioncd理才D的的Action定义 -->   </span></li> <li><span>        <action name=</span><span id="yko2geu" class="string">"upload"</span><span> </span><span id="uoika44" class="keyword">class</span><span>=</span><span id="6kws2o4" class="string">"action.UploadAction"</span><span>>   </span></span></li> <li><span>            <result name=</span><span id="w44e2m4" class="string">"input"</span><span>>/jsp/upload.jsp</result>   </span></span></li> <li><span>            <result name=</span><span id="yueae4e" class="string">"success"</span><span>>/jsp/result.jsp</result>   </span></span></li> <li><span>        </action>   </span></li> <li><span><!—显C配|文件上传拦截器 -->   </span></li> <li><span><interceptor-ref name=”fileUpload”>   </span></li> <li><span><!—指定特定类型的上传文g -->   </span></li> <li><span><param name =”allowedTypes”>text/plain,application/xml</param>   </span></li> <li><span></ interceptor-ref >   </span></li> <li><span><interceptor-ref name=”defaultStack”></ interceptor-ref >   </span></li> <li><span>    </</span><span id="iawq4k4" class="keyword">package</span><span>>   </span></span></li> <li><span></struts>   </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!-----------------------文g名:struts.xml------------------> <struts> <!-- Action所在包定义 --> <package name="C04.4" extends="struts-default"> <!-- Action名字Q类以及D面定义 --> <!-- 通过Actioncd理才D的的Action定义 --> <action name="upload" class="action.UploadAction"> <result name="input">/jsp/upload.jsp</result> <result name="success">/jsp/result.jsp</result> </action> <!—显C配|文件上传拦截器 --> <interceptor-ref name=”fileUpload”> <!—指定特定类型的上传文g --> <param name =”allowedTypes”>text/plain,application/xml</param> </ interceptor-ref > <interceptor-ref name=”defaultStack”></ interceptor-ref > </package> </struts> </pre> <br /> 定义了一个名?#8220;allowedTypes”的参敎ͼ其中?lt;param></param>之间的是文gcdQ也可以?#8220;Q?#8221;间隔Q表C允怸传多个文件类型。这里允怸传文件类型ؓtxt、xml格式的文件。如果读者不知道各个文gcd的定义,可在自己的JBoss安装目录中的server\default\deploy\jboss-web.deployer\conf\下的web.xml文g中找刎ͼ搜烦<mime-mapping>卛_Q?<br /> 注意Q如果显C配|Struts2自己的缺省拦截器一定要写在“defaultStack”前,否则“fileUpload”拦截器不会执行拦截。因为Struts2中如果某个拦截器执行拦截时候发现自己已l执行过Q第二个乃至之后同名的拦截器都不会执行。这里因?#8220;defaultStack”拦截器栈中包含了“fileUpload”拦截器,?#8220;fileUpload”拦截器已l执行拦截了Q则不会再执行拦截。如果把“defaultStack”拦截器栈攑֜“fileUpload”拦截器前配置Q则只执?#8220;defaultStack”拦截器栈中的“fileUpload”拦截器,q里是没有定?#8220;allowedTypes”的,Struts2~省默认的是支持所有文件类型。因此它会支持所有文件类型的文g上传。因此再讑֮“allowedTypes”没有Q何意义了?<br /> <img src ="http://m.tkk7.com/lanxin1020/aggbug/265297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-13 15:33 <a href="http://m.tkk7.com/lanxin1020/archive/2009/04/13/265297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>11 Struts2文g下蝲功能开发(转自黑暗子Q?/title><link>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265295.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Mon, 13 Apr 2009 07:30:00 GMT</pubDate><guid>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265295.html</guid><wfw:comment>http://m.tkk7.com/lanxin1020/comments/265295.html</wfw:comment><comments>http://m.tkk7.com/lanxin1020/archive/2009/04/13/265295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lanxin1020/comments/commentRss/265295.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lanxin1020/services/trackbacks/265295.html</trackback:ping><description><![CDATA[<span style="font-size: xx-large">Struts2文g下蝲功能开?/span> <br /> 技术要?<br /> 本节代码详细说明文g下蝲功能的开发流E,介绍知识点如下: <br /> <div style="text-align: left">?上传成功面重修改后支持文g下蝲代码内容?<br /> ?DownloadAction文g下蝲功能开发?<br /> ?struts.xml中DownloadAction配置Q以及支持文件名Z文字W的文g下蝲?<br /> ?下蝲文g程展示?/div> <br /> 演示代码 <br /> 上传成功面Q这里笔者让其在每个上传文g后提?#8220;下蝲”链接?<br /> <div id="o4mycc2" class="dp-highlighter"> <div id="2e4y44y" class="bar"> <div id="mg4u444" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!------------------------文g名:result.jsp------------------->   </span></span></li> <li><span><%</span><span id="qi2ouaq" class="annotation">@taglib</span><span> prefix=</span><span id="cwqsyow" class="string">"s"</span><span> uri=</span><span id="q44isii" class="string">"/struts-tags"</span><span>%>   </span></span></li> <li><span>    <body>   </span></li> <li><span>        上传文gQ?  </span></li> <li><span>        <table>   </span></li> <li><span>        <!-- 循环昄上传成功文g?nbsp;-->   </span></li> <li><span>        <s:iterator value=</span><span id="6keisa4" class="string">"fileFileName"</span><span> status=</span><span id="s2g2iiy" class="string">"fn"</span><span>>   </span></span></li> <li><span>        <tr>   </span></li> <li><span>        <td>   </span></li> <li><span>        <!-- 上传成功文g?nbsp;-->   </span></li> <li><span>        <s:property />           </span></li> <li><span>        </td>   </span></li> <li><span>        <td>   </span></li> <li><span>        <!-- 下蝲文g链接内容为定义的下蝲Action -->   </span></li> <li><span>        <!-- 下蝲文g名作为链接参数fileName|用OGNL表达式表?nbsp;-->     </span></li> <li><span>        <a href="<s:url value=</span><span id="ewy2a4w" class="string">'download.action'</span><span>>                  </span></span></li> <li><span>                    <s:param name=</span><span id="2e4444q" class="string">'fileName'</span><span>  </span></span></li> <li><span> value=</span><span id="ke4q44a" class="string">'fileFileName[#fn.getIndex()]'</span><span>/>     </span></span></li> <li><span>                 </s:url>">下蝲</a>   </span></li> <li><span>        </td>   </span></li> <li><span>        </tr>   </span></li> <li><span>        </s:iterator>        </span></li> <li><span>        </table>         </span></li> <li><span>    </body>  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!------------------------文g名:result.jsp-------------------> <%@taglib prefix="s" uri="/struts-tags"%> <body> 上传文gQ? <table> <!-- 循环昄上传成功文g?--> <s:iterator value="fileFileName" status="fn"> <tr> <td> <!-- 上传成功文g?--> <s:property /> </td> <td> <!-- 下蝲文g链接内容为定义的下蝲Action --> <!-- 下蝲文g名作为链接参数fileName|用OGNL表达式表?--> <a href="<s:url value='download.action'> <s:param name='fileName' value='fileFileName[#fn.getIndex()]'/> </s:url>">下蝲</a> </td> </tr> </s:iterator> </table> </body></pre> <br /> DownLoadActioncM?<br /> <div id="64w44w2" class="dp-highlighter"> <div id="giuoy2c" class="bar"> <div id="u4w4wem" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!------------文g名:DownLoadAction.java ------------------>   </span></span></li> <li><span id="ame244u" class="keyword">import</span><span> java.io.InputStream;   </span></span></li> <li><span id="ks2oiye" class="keyword">import</span><span> java.io.UnsupportedEncodingException;   </span></span></li> <li><span>  </span></li> <li><span id="4s4eou4" class="keyword">import</span><span> org.apache.struts2.ServletActionContext;   </span></span></li> <li><span id="yq4a444" class="keyword">import</span><span> com.opensymphony.xwork2.ActionSupport;   </span></span></li> <li><span>  </span></li> <li><span id="2ikwqo4" class="keyword">public</span><span> </span><span id="e244k44" class="keyword">class</span><span> DownLoadAction </span><span id="2uw4444" class="keyword">extends</span><span> ActionSupport {   </span></span></li> <li><span>    </span><span id="2k2e4gk" class="comment">//下蝲文g原始存放路径 </span><span>  </span></span></li> <li><span>    </span><span id="k4kc42g" class="keyword">private</span><span> </span><span id="ksw4qge" class="keyword">final</span><span> </span><span id="2uwi244" class="keyword">static</span><span> String DOWNLOADFILEPATH=</span><span id="ogi244w" class="string">"/upload/"</span><span>;   </span></span></li> <li><span>    </span><span id="24oysiy" class="comment">//文g名参数变?</span><span>  </span></span></li> <li><span>    </span><span id="ueyk2ck" class="keyword">private</span><span> String fileName;   </span></span></li> <li><span>  </span></li> <li><span>    </span><span id="2eqs4iy" class="keyword">public</span><span> String getFileName() {   </span></span></li> <li><span>        </span><span id="a24o44i" class="keyword">return</span><span> fileName;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="2am4mmc" class="keyword">public</span><span> </span><span id="m2imge4" class="keyword">void</span><span> setFileName(String fileName) {   </span></span></li> <li><span>        </span><span id="qi4a44c" class="keyword">this</span><span>.fileName = fileName;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="ewa4uii" class="comment">//从下载文件原始存放\径读取得到文件输出流 </span><span>  </span></span></li> <li><span>    </span><span id="y44s4em" class="keyword">public</span><span> InputStream getDownloadFile() {   </span></span></li> <li><span>        </span><span id="wosey2s" class="keyword">return</span><span>    </span></span></li> <li><span>ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);   </span></li> <li><span>    }   </span></li> <li><span>    </span><span id="2ogi4iy" class="comment">//如果下蝲文g名ؓ中文Q进行字W编码{?</span><span>  </span></span></li> <li><span>    </span><span id="c44agym" class="keyword">public</span><span> String getDownloadChineseFileName() {   </span></span></li> <li><span>        String downloadChineseFileName = fileName;   </span></li> <li><span>  </span></li> <li><span>        </span><span id="q2gkeuk" class="keyword">try</span><span> {   </span></span></li> <li><span>            downloadChineseFileName = </span><span id="k4ac4ks" class="keyword">new</span><span> String(downloadChineseFileName.getBytes(), </span><span id="ygasowu" class="string">"ISO8859-1"</span><span>);   </span></span></li> <li><span>        } </span><span id="o22c64i" class="keyword">catch</span><span> (UnsupportedEncodingException e) {   </span></span></li> <li><span>            e.printStackTrace();   </span></li> <li><span>        }   </span></li> <li><span>  </span></li> <li><span>        </span><span id="gqk4csi" class="keyword">return</span><span> downloadChineseFileName;   </span></span></li> <li><span>    }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="4ykm24a" class="keyword">public</span><span> String execute() {   </span></span></li> <li><span>        </span><span id="c4ke4uk" class="keyword">return</span><span> SUCCESS;   </span></span></li> <li><span>    }   </span></li> <li><span>}  </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!------------文g名:DownLoadAction.java ------------------> import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownLoadAction extends ActionSupport { //下蝲文g原始存放路径 private final static String DOWNLOADFILEPATH="/upload/"; //文g名参数变? private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } //从下载文件原始存放\径读取得到文件输出流 public InputStream getDownloadFile() { return ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName); } //如果下蝲文g名ؓ中文Q进行字W编码{? public String getDownloadChineseFileName() { String downloadChineseFileName = fileName; try { downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return downloadChineseFileName; } public String execute() { return SUCCESS; } }</pre> <br /> struts.xml配置文g中有x件下载的配置Q?<br /> <div id="2wqsgwk" class="dp-highlighter"> <div id="w444c44" class="bar"> <div id="gicegyw" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!------------------文g名:struts.xml----------------->   </span></span></li> <li><span><struts>   </span></li> <li><span>    <!-- 下蝲文g的Action定义 -->   </span></li> <li><span>        <action name=</span><span id="qqawqoe" class="string">"download"</span><span> </span><span id="qq444ge" class="keyword">class</span><span>=</span><span id="2y2kq4c" class="string">"action.DownLoadAction"</span><span>>   </span></span></li> <li><span>            <!-- 讄文g名参敎ͼ由页面上传入 -->   </span></li> <li><span>            <param name=</span><span id="yoqu2us" class="string">"fileName"</span><span>></param>   </span></span></li> <li><span>            <result name=</span><span id="aauy2ci" class="string">"success"</span><span> type=</span><span id="mm2gm44" class="string">"stream"</span><span>>   </span></span></li> <li><span>                <!-- 下蝲文gcd定义 -->   </span></li> <li><span>                <param name=</span><span id="kq244ki" class="string">"contentType"</span><span>>text/plain</param>   </span></span></li> <li><span>                <!-- 下蝲文g处理Ҏ -->   </span></li> <li><span>                <param name=</span><span id="244c2mc" class="string">"contentDisposition"</span><span>>   </span></span></li> <li><span>                    attachment;filename=</span><span id="444s64e" class="string">"${downloadChineseFileName}"</span><span>  </span></span></li> <li><span>                </param>   </span></li> <li><span>                <!-- 下蝲文g输出定?nbsp;-->   </span></li> <li><span>                <param name=</span><span id="yos44qo" class="string">"inputName"</span><span>>downloadFile</param>   </span></span></li> <li><span>            </result>   </span></li> <li><span>        </action>   </span></li> <li><span></struts>   </span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!------------------文g名:struts.xml-----------------> <struts> <!-- 下蝲文g的Action定义 --> <action name="download" class="action.DownLoadAction"> <!-- 讄文g名参敎ͼ由页面上传入 --> <param name="fileName"></param> <result name="success" type="stream"> <!-- 下蝲文gcd定义 --> <param name="contentType">text/plain</param> <!-- 下蝲文g处理Ҏ --> <param name="contentDisposition"> attachment;filename="${downloadChineseFileName}" </param> <!-- 下蝲文g输出定?--> <param name="inputName">downloadFile</param> </result> </action> </struts> </pre> <br /> Q?Q:文g开始下载页面如?.12所C?<br /> <br /> ?.12  文g下蝲 <br /> Q?Q:单击“下蝲”链接Q比如点“下蝲文g1.txt”文g双“下蝲”链接Q出现对话框如图4.13所C?<br /> <br /> ?.13  下蝲文g处理方式 <br /> Q?Q:单击“保存”按钮后选择下蝲文g存放路径Q如?.14所C?<br /> <br /> ?.14  下蝲文g选择存放路径 <br /> 代码解释 <br /> Q?Q在result.jsp中通过iterator标签和url标签定义?#8220;fileFileName”的@环显CZ及链接。其中有?#8220;status”和OGNL表达式笔者会在之后章节里具体介绍Q这里只是让读者知道是如何使用标签昄?.12昄的内宏V特别指?lt;param>标签为downloadAction定义了一个参敎ͼ该参数名?#8220;fileName”Q因为在4.4.1节中笔者定义的“fileFileName”是个Listcd的数据集合,因此利用OGNL表达式将文g名作?#8220;fileName”参数g入downloadAction中?<br /> Q?QDownLoadAction文g中先定义了常量DOWNLOADFILEPATHQ它是下载文件在服务器存攄路径名,也就?.4.1节中上传文件在服务器存攄路径名?<br /> 定义好DOWNLOADFILEPATH后,在定义DownLoadAction的属性变量。因为在result.jsp中定义了参数“fileName”Q则它作为DownLoadAction的属性变量,需要定义相应的getter、setterҎ?<br /> 然后定义了getDownloadFileҎQ它q回的是一个文件流Q表明将被下载文件{换ؓ输出,方便下蝲。利用Struts2自带?#8220;ServletActionContext”cȝAPI把下载文件存放\径作为方法参敎ͼd下蝲文gQ将其{换ؓ文g?<br /> q有一个getDownloadChineseFileNameҎQ该Ҏ主要作用是将文g名ؓ中文字符的文件进行文件名的字W编码集合{换。因为在Webpȝ中由JSP{视N面传入的变量|特别是中文字W的变量。缺省的字符~码集合都是“ISO8859-1”Q因此利用Java的字W串cȝAPIQ将字符~码转成开发需要的字符~码集。防止中文字Wؕ码问题发生?<br /> Q?Qstruts.xml中定义了名ؓ“download”的Action。其中它自己的参?#8220;fileName”因ؓ在这里它的g从JSP面上传入,所以这里只是定义,没有具体l它赋Q何?<br /> ?lt;result>标签中定义了type属性,gؓ“stream”。如果是下蝲文g功能开发,DownLoadAction一定要讄type属性,而且gؓ“stream”。这是因为在Struts2自带的xml配置文g为struts-default.xml中有关于“stream”的resultq回cd的定义,代码如下Q?<br /> <div id="4iuoqwc" class="dp-highlighter"> <div id="yeys444" class="bar"> <div id="wm24saw" class="tools">Java代码 </div> </div> <ol class="dp-j"> <li><span><span><!-------------------文g名:struts-</span><span id="qqkw4io" class="keyword">default</span><span>.xml-------------->   </span></span></li> <li><span><result-type name=</span><span id="24c4ecu" class="string">"stream"</span><span> </span><span id="4k4oukq" class="keyword">class</span><span>=</span><span id="a44m4yo" class="string">"org.apache.struts2.dispatcher.StreamResult"</span><span>/>  </span></span></li> </ol> </div> <pre style="display: none" class="java" name="code"><!-------------------文g名:struts-default.xml--------------> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/></pre> <br /> q里Struts2定义了resultq回cd?#8220;stream”Q这个resultcd主要是处理文件的输入和输出流时候需要用的。因Z载文件就是把文g转换成输入输出流Q将其从一个文件\径放到另外一个文件\径中厅R所以肯定要讄q个resultcd的?<br /> “contentType”?#8220;contentDisposition”?#8220;inputName”都是q个result的属性?#8220;contentType”是文gcd。这里因Z载的文g是文本文Ӟ因此讑֮的gؓ文本文gcdQ具体各个文件类型如何定义,4.4.1节已经介绍q,q里不再做说明?#8220;contentDisposition”是指定下载文件处理方式,如图4.13是处理方式的效果。特别指出如?#8220;contentDisposition”定义的值把前面?#8220;attachment”LQ则下蝲方式不是以附件方式下载,如果单击“下蝲”链接Q则会把下蝲文g的内ҎC在览器中。读者可以去试验一下。这里有?#8220;${downloadChineseFileName}”Q这是在DownLoadAction中定义getDownloadChineseFileNameҎ的目的,${downloadChineseFileName}是OGNL的表辑ּQ它昄?#8220;downloadChineseFileName”变量的具体|因ؓ在DownLoadAction中定义getDownloadChineseFileNameҎQ则把已l{换成W合需要字W编码集的下载文件名作ؓ下蝲文g方式对话框中昄的名Uͼ不会造成Mq问题?#8220;inputName”是最关键的一个属性,也是一定要定义的属性,“inputName”参数中定义的?#8220;downloadFile”是DownLoadAction中getDownloadFileҎq回的文件流名字。在Struts2中Acion用前~名ؓget的方法得到各U属性的|q些属性有些是在Action中定义,有些像本示例在配置文g中利用OGNL表达式或直接定义?<br /> Q?Q开始进行文件下载功能展C,按照如上记述的步骤执行即可。笔者将两个文本文g上传上去Q然后在上传成功面对具体的文gq行下蝲。在?.13中单?#8220;保存”按钮显C图4.14Q选择在本Z存放下蝲文g的\径即可完成下载文件功能?<br /> <img src ="http://m.tkk7.com/lanxin1020/aggbug/265295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-13 15:30 <a href="http://m.tkk7.com/lanxin1020/archive/2009/04/13/265295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>12Struts2标签使用原理Q{自黑暗浪子)http://m.tkk7.com/lanxin1020/archive/2009/04/13/265294.htmllanxin1020lanxin1020Mon, 13 Apr 2009 07:28:00 GMThttp://m.tkk7.com/lanxin1020/archive/2009/04/13/265294.htmlhttp://m.tkk7.com/lanxin1020/comments/265294.htmlhttp://m.tkk7.com/lanxin1020/archive/2009/04/13/265294.html#Feedback0http://m.tkk7.com/lanxin1020/comments/commentRss/265294.htmlhttp://m.tkk7.com/lanxin1020/services/trackbacks/265294.htmlStruts2标签使用原理解疑
在笔者下载的Struts2的包中,读者可以在/lib下找到struts2-core-2.0.11.1.jar包,解压该包在其根目录下?META-INF文g夹下可以看到一个名字ؓ“struts-tags.tld”文g。该文g是Struts2中所有自带的标签库定义。本节通过对该文g代码的介l来让读者知晓Struts2内部是如何用这些标{来q行工作。ƈ单说明JSP中是如何用其来书写标{代码?
技术要?
本节代码说明Struts2内部定义标签的格式和在JSP中用方式?
?struts-tags.tld文g定标{֮义配|格式?
?JSP中用标{֊能介l?/div>
演示代码
Java代码
  1. <!------------------文g名: struts-tags.tld----------------->   
  2. <taglib>   
  3.   <tlib-version>2.2.3</tlib-version>   
  4.   <jsp-version>1.2</jsp-version>   
  5.   <short-name>s</short-name>   
  6.   <uri>/struts-tags</uri>   
  7.   <display-name>"Struts Tags"</display-name>   
  8.   <description>………………</description>   
  9.   <tag>   
  10.     <name>action</name>   
  11.     <tag-class>org.apache.struts2.views.jsp.ActionTag</tag-class>   
  12.     <body-content>JSP</body-content>   
  13.     <description><![CDATA[Execute an action from within a view]]></description>   
  14.     <attribute>   
  15.       <name>executeResult</name>   
  16.       <required>false</required>   
  17.       <rtexprvalue>false</rtexprvalue>   
  18.       <description><![CDATA[Whether the result of this action (probably a view) should be executed/rendered]]></description>   
  19.     </attribute>   
  20.    …………………………   
  21.     <attribute>   
  22.       <name>namespace</name>   
  23.       <required>false</required>   
  24.       <rtexprvalue>false</rtexprvalue>   
  25.       <description><![CDATA[Namespace for action to call]]></description>   
  26.     </attribute>   
  27.   </tag>   
  28. </taglib>  

代码解释
Q?Qstruts-tags.tld是Struts2自标{֮义文件。所有标{֮义都是在<tablib>?lt;/taglib>之间定义。以<tag></tag>用来定义一个具体标{。每个标{֛为都可以有很多自q属性。这些属性定义都是以<attribute></attribute>来定义?
Q?Q?lt;tlib-version></tlib-version>之间定义的是标签库的版本?lt;jsp-version></jsp-version>定义的是标签库这些标{是支持JSP的哪个版本?lt;short-name> </short-name>其实是标{ֺ的默认名Q也可以认ؓ是其늧?lt;uri> </uri>定义的是标签库的URIQ在JSP中会使用到?lt;display-name></display-name>是显C名?lt;description></description>是标{ֺ的记qͼ记述标签库的使用用途等{?
Q?Q?lt;attribute>?lt;name></name>是属性名U定义?lt;required></required>表示的该属性是否是必须的属性,如果是必ȝ?lt;required></required>之间为trueQ否则ؓfalse?lt;rtexprvalue></rtexprvalue>表示的是可否使用表达式,大多数标{N是ؓfalse。这里不是不能用表辑ּQ而是恰恰相反表示可以使用表达式?lt;description></description>定义和前面介l相同?
Q?Q在JSP中,如之前章节的演示代码所C,都是在文件头有个使用标签的声明,代码如下?
Java代码
  1. <!---------------------文g名: *.jsp------------------------->   
  2. <%@taglib prefix="s" uri="/struts-tags"%>  

有了q个声明Q在JSP文g中就可以使用Struts2的标{。比如form标签定义要像如下代码所C?
Java代码
  1. <s:form action="upload" ………>  

C一定要?#8220;s”Q它是Struts2中标{默认名也是相当于一个昵Uͼ当然读者也可以把它改ؓ自己惛_的名字,不过在标{֣明中?#8220;prefix”中就要改成那个自己取的名字?
注意Q因为笔者用的Servlet版本?.3之上的版本,因此没必要在web.xml中定义标{ֺ。如果读者用的Servlet版本比较低,则在web.xml文g中需要定义如下的代码Q?
Java代码
  1. <!----------------------文g名:web.xml----------------------->   
  2. <taglib>   
  3.     <!- 定义URI - ->   
  4.     <taglib-uri>/Struts 2-tags</taglib-uri>   
  5. <!- 定义标签库支持的jar包位|? ->   
  6.     <taglib-location>/WEB-INF/lib/struts2-core-2.0.11.1.jar</taglib-location>   
  7. </taglib>  

只有q样标签库才会在Servlet版本比较低的情况下用有效果?


lanxin1020 2009-04-13 15:28 发表评论
]]> վ֩ģ壺 aһƬ| 鵺̳߹ۿ| ޾Ʒպ?V| ޸岻߹ۿ| ɫƷVRһ| ƬվŮ| Ļ| ѹۿһëƬ| ߳ëƬڵƵ| 100018ѷ˸| 777޾Ʒþþþþ| ĻѸ| aרav| þþþù| ˵þþþƷ| 91Ʒѹۿ| ˰ǿŮ²Ƶ| ŷ͵Ʒ | ŷͽȺ| 40| þ޸ۺ| þƵ| 33333| һػƸѴƬ| Ƶ߹ۿ| ޾ƷĻ| ëƬ߲| aëƬվ| ղ2021| vѹۿ| 100018վ| ҳվѹۿ| ޹˾þþƷ| xxxxƵ| ߹ۿ| պ ɫ ͼվ| ޾ƷƷۺ| Ļ| ԴƵ| ҹƵվ| 鶹˾þþƷ|