Struts 1.2.1新特点简介(1)

来源:互联网 发布:小蜜蜂软件抢手机 编辑:程序博客网 时间:2024/04/29 19:48

大笑微笑生气吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头生气微笑大笑


偷笑我爱北京天安门偷笑


偷笑天安门上太阳升偷笑


偷笑伟大领袖毛主席偷笑


偷笑指引我们向前进偷笑

偷笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑大笑偷笑

<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><span lang="EN" style="FONT-SIZE: 24pt">Struts 1.2.1</span><span style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新特点简介</span><span lang="EN" style="FONT-SIZE: 24pt">(1)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN" style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></b></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">目前</span><span lang="EN" style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Struts得到了广泛的应用,有人称它为Java Web框架默认的事实标准,自2003年6月apache推出</span><span lang="EN" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts 1.1版本以来</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">,<span lang="EN">apache对</span></span><span lang="EN" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts修改和升级工作</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">,其中</span><span lang="EN" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts 1.2.1版本是这一年修改和升级工作的直接结果。Struts 1.2.1版本改正了Struts 1.1版本中存在的错误和不足,同时,增强、改进以及增加了许多新的功能,这些特点,值得广大Struts学习、开发者的关注。建议有条件的开发人员,可升级到Struts 1.2.1版本来开发,这样能充分利用Struts的新功能。有关Struts 1.2.1版本的介绍,可到Struts官方网站</span><span lang="EN"><a href="http://struts.apache.org/userGuide/release-notes-1.2.1.html">http://struts.apache.org/userGuide/release-notes-1.2.1.html</a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查看,还可以到</span><span lang="EN"><a href="http://cvs.apache.org/dist/struts/v1.2.1/">http://cvs.apache.org/dist/struts/v1.2.1/</a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下载。</span><span lang="EN">JavaWebStudio</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发工具的</span><span lang="EN">Visual Struts</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最新版本也完全支持</span><span lang="EN" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts 1.2.1版本的开发(<a href="http://javawebstudio.51.net/">http://javawebstudio.51.net/</a>)。</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN" style="FONT-SIZE: 14pt; FONT-FAMILY: 黑体">1、不再提供GenericDataSource和GenericConnection接口<o:p></o:p></span></b></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-layout-grid-align: none" align="left"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span><span lang="EN">http://struts.apache.org/userGuide/release-notes-1.2.1.html</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看,</span><span lang="EN">GenericDataSource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN">GenericConnection</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口都已不再提供,从下载的</span><span lang="EN">jakarta-struts-1.2.1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也看出,已去掉了</span><span lang="EN">Struts1.1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN">struts-legacy.jar</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,即整个</span><span lang="EN">legacy</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都去掉了。但</span><span lang="EN">struts.jar</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中还是保留了</span><span lang="EN">DataSourceConfig</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类。还保留了</span><span lang="EN" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">datasources管理功能</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-layout-grid-align: none" align="left"><span lang="EN">GenericDataSource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并不是非常必要的好用,其中因为之一是这个</span><span lang="EN">datasource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要用</span><span lang="EN">ActionServlet</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中定义的方法从</span><span lang="EN">Action</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类访问数据源,不能从其它类中用它。</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-layout-grid-align: none" align="left"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN">Struts</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现自定义数据库连接池的方法很多,其中</span><span lang="EN">JavaWebStudio(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详情可参考《</span><span lang="EN">Struts</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发实例》</span><span lang="EN">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的自定义数据库连接池,通过</span><span lang="EN">web.xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置引入是一种方法,另外,也可采用</span><span lang="EN">Struts1.2.1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建议的通过</span><span lang="EN">Plug Ins Configuration (</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插件配置</span><span lang="EN">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法实现,例如</span><span lang="EN">struts</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自带例子</span><span lang="EN">struts-config.xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的配置:</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN">&lt;plug-in className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn"&gt;</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;set-property property="pathname" value="/<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:stocktickeruk w:st="on"><st1:stocktickerca w:st="on">WEB</st1:stocktickerca></st1:stocktickeruk>-<st1:stocktickeruk w:st="on"><st1:stocktickerca w:st="on">INF</st1:stocktickerca></st1:stocktickeruk>/database.xml"/&gt;</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN"><span style="mso-spacerun: yes">&nbsp; </span>&lt;/plug-in&gt;</span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">另外,<span lang="EN">Jakarta的DBCP也是一个选择。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align="left"><b style="mso-bidi-font-weight: normal"><span lang="EN" style="FONT-SIZE: 14pt; FONT-FAMILY: 黑体">2、增加的数据验证组件(</span></b><b><span lang="EN" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">Validator enhancements</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">)<o:p></o:p></span></b></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 37.1pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; tab-stops: list 36.0pt; mso-list: l1 level1 lfo1" align="left">·        ValidWhen:Struts的 Validator支持 ValidWhen 规则,可实现一个数据的验证依赖于另一个数据的验证;

·        IntRange:可验证单选select-one标签和radio标签功能. Example: This allows populating combo boxes with valid choices plus one additional choice with a caption something like "Choose one" and a value 0f "-1". Then when the user attempts to submit the form, you can look for the value of "-1" and advise if nothing was selected.

·        可强制客户端Javascript validation去较验所有的约束,代替在第一次出错造成的中断。

·        "required" 数据的验证处理checkboxes, radio,select-one, 和 select-multiple标签.

·         标准的validateUrl规则可检查URL的有效性.

Designing Complex Validations with validwhen

一个常用的数据验证设计是验证一个数据域依赖于另一个数据域的情况(例如,如果你要用户输入两次密码,如果这两个密码相同才能通过),还有就是只有当某一个数据域依赖于有效时其它的一个数据域才有效. validwhen 数据验证规则提供上述情况的实现方法.

例如:

(1)

<field property="emailAddress" depends="validwhen">

     <arg0 key="userinfo.emailAddress.label"/>

       <var>

         <var-name>test</var-name>

         <var-value>((sendNewsletter == null) or (*this* != null))</var-value>

       </var>

     </field>

 

(2)

   <field property="quantity" indexedListProperty="orderLines" depends="validwhen">

     <arg0 key="orderform.quantity.label"/>

       <var>

         <var-name>test</var-name>

         <var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value>

       </var>

     </field>

 

(3)

   <field property="nbaPointGuard" depends="validwhen">

     <arg0 key="careers.nbaPointGuard.label"/>

       <var>

         <var-name>test</var-name>

         <var-value>((heightInInches >= 60) or (*this* == null))</var-value>

       </var>

     </field>

 

 

 

Unstoppable JavaScript Validations

可强制客户端Javascript validation去较验所有的约束,代替在第一次出错造成的中断。通过设置一个新的属性stopOnFirstError在Validator PlugIn实现来完成第一次出错设置. 例如struts-config.xml设置片段:

  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property property="pathnames"
   value="/WEB-INF/validation.xml,/WEB-INF/validator-rules.xml"/>
  <set-property property="stopOnFirstError" value="false"/>
  </plug-in>

 

3、通配符

action-mappings配置中,可采用通配符的配置方式 ,例如Struts自带的例子中的struts-config-registration.xml文件中有:

<!-- Generic edit* mapping -->
<action    
    path="/edit*"
    type="org.apache.struts.webapp.example.Edit{1}Action"
    name="{1}Form"
    scope="request"
    validate="false">
    <forward 
        name="failure" 
        path="/mainMenu.jsp"/>
    <forward 
        name="success" 
        path="/{1}.jsp"/>
</action>

/edit*”代表了所有以“edit”开头的路径,{1}代表了“*”在实际表单提交中的内容(字符串)。

通配符模式可包含一个或多个如下的专门符号:

*

不含斜线 ('/') 字符.

**

含斜线 ('/') 字符.

/character

反斜线字符用于分隔顺序. /* 匹配 ('*'), and //匹配('/').

action mapping 和 action forwards中, 通配符{N}的序号取值N 可取从 1 到 9 . 所有的请求 URI 可采用通配符{0}.

目前action mapping支持通配符的属性有:

·        type

·        name

·        roles

·        parameter

·        attribute

·        forward

·        include

·        input

action mapping将要支持通配符的属性有:

·        path

 

4、Maven 项目文件

 在Struts项目本身的开阶段就已用到了Maven的管理. 核心JAR 和 TLDs可利用Maven编译生成. 在Struts 源代码概目录中我们可看到当前的 maven.xml and project.xml 文件. 当然,在当前,原来的Ant编译文件还是官方编译Struts的方法.

   值得关注的是,Maven将为我们的项目开发带来很大的方便,详细情况可参考http://maven.apache.org/start/use.html。

 

5、新的 Configuration DTD

Configuration 1.1 DTD 已不推荐使用,struts-config_1_2.dtd 成为首选,struts-config_1_2.dtd为struts-config新增了两个元素<display-name> 和 <description>.可用于描述项目(或配置)的版本号等信息。例如:

<display-name><![CDATA[

    account maintenance

 ]]>

 </display-name>

   <description><![CDATA[

    Allows the updating of users accounts and subscriptions.

 ]]>

 </description>

 

6、Session-scoped ActionMessages

可在session中保存ActionMessages及在第一次使用后进行清除。通过 Action.saveMessages() 保存信息到 session中.可通过 ActionMessages.isAccessed() 返回已保存的信息. 如果要清除信息,RequestProcessor.processCachedMessages() 通过 isAccessed()进行检查.

   这一功能对于信息的重复使用是非常有效的。

 

7、JA Mailreader

Struts 自带的例子Mailreader Example包含了日本资源文件,虽然我们不需要日本资源,但它对于我们学习如何实现“国际化信息”是非常有好处的,实现方式很简单,例如自带的例子welcome.jsp有如下语言类型选择:
<ul>
<li><html:link action="/Locale?language=en">English</html:link></li>

<li><html:link action="/Locale?language=ja" useLocalEncoding="true">Japanese</html:link></li>

<li><html:link action="/Locale?language=ru" useLocalEncoding="true">Russian</html:link></li>

</ul>

LocaleAction.java中进行处理

public ActionForward execute(ActionMapping mapping,

                ActionForm form,

                HttpServletRequest request,

                HttpServletResponse response)

   throws Exception {

 

       String language = request.getParameter(LANGUAGE);

       String country = request.getParameter(COUNTRY);

 

       Locale locale = getLocale(request);

 

       if ((!isBlank(language)) && (!isBlank(country))) {

           locale = new Locale(language, country);

       }

       else if (!isBlank(language)) {

           locale = new Locale(language, "");

       }

 

       HttpSession session = request.getSession();

       session.setAttribute(Globals.LOCALE_KEY, locale);

 

       String target = request.getParameter(PAGE);

       if (!isBlank(target)) return new ActionForward(target);

 

       target = request.getParameter(FORWARD);

       if (isBlank(target)) target = mapping.getParameter();

       if (isBlank(target)) {

           log.warn(LOCALE_LOG);

           return null;

       }

       return mapping.findForward(target);

   }

 

.

8、Tiles EL

Tiles标签支持基于JSTL 的Struts EL标签库.

 

9、truts-mailreader

struts自带例子struts-mailreade进行改进。特别是增加了Welcome页。

index.jsp只有两行代码主要是实现到"/Welcome"的转发功能。

<%@ taglib uri="/tags/struts-logic" prefix="logic" %>

<logic:redirect action="/Welcome"/>

 

struts-config.xml可看出"/Welcome"的Action处事文件是WelcomeAction.java文件:

<action   path="/Welcome"

                type="org.apache.struts.webapp.example.WelcomeAction">

         <forward name="failure" path="/Error.jsp" />

         <forward name="success" path="/welcome.jsp" />

     </action>

 

WelcomeAction.java文件的execute()函数如下:

public ActionForward execute(

       ActionMapping mapping,

       ActionForm form,

       HttpServletRequest request,

       HttpServletResponse response)

       throws Exception {

 

       // Setup message array in case there are errors

       ArrayList messages = new ArrayList();

 

       // Confirm message resources loaded

       MessageResources resources = getResources(request);

       if (resources==null) {

           messages.add(Constants.ERROR_MESSAGES_NOT_LOADED);

       }

 

       // Confirm database loaded

       UserDatabase userDatabase = getUserDatabase(request);

       if (userDatabase==null) {

           messages.add(Constants.ERROR_DATABASE_NOT_LOADED);

       }

 

       // If there were errors, forward to our failure page

       if (messages.size()>0) {

           request.setAttribute(Constants.ERROR_KEY,messages);

           return findFailure(mapping);

       }

 

       // Forward to our success page

       return findSuccess(mapping);

 

   }

 

其中核心代码是:

UserDatabase userDatabase = getUserDatabase(request);

       if (userDatabase==null) {

           messages.add(Constants.ERROR_DATABASE_NOT_LOADED);

       }

用户检查用户数据是否已存在。

 

10、Action 包

Action Package是修改最多的部分,其中大的修改有25处,

 

 

原创粉丝点击