将Struts 1.2.1结构文档进行到底

原创 2004年07月15日 14:18:00

Struts 1.2.1新特点简介(1)

 

目前Struts得到了广泛的应用,有人称它为Java Web框架默认的事实标准,自2003年6月apache推出Struts 1.1版本以来apache对Struts修改和升级工作,其中Struts 1.2.1版本是这一年修改和升级工作的直接结果。Struts 1.2.1版本改正了Struts 1.1版本中存在的错误和不足,同时,增强、改进以及增加了许多新的功能,这些特点,值得广大Struts学习、开发者的关注。建议有条件的开发人员,可升级到Struts 1.2.1版本来开发,这样能充分利用Struts的新功能。有关Struts 1.2.1版本的介绍,可到Struts官方网站http://struts.apache.org/userGuide/release-notes-1.2.1.html查看,还可以到http://cvs.apache.org/dist/struts/v1.2.1/下载。JavaWebStudio开发工具的Visual Struts最新版本也完全支持Struts 1.2.1版本的开发(http://javawebstudio.51.net/)。

 

1、不再提供GenericDataSource和GenericConnection接口

http://struts.apache.org/userGuide/release-notes-1.2.1.html看,GenericDataSourceGenericConnection接口都已不再提供,从下载的jakarta-struts-1.2.1也看出,已去掉了Struts1.1中的struts-legacy.jar,即整个legacy都去掉了。但struts.jar中还是保留了DataSourceConfig类。还保留了datasources管理功能

GenericDataSource并不是非常必要的好用,其中因为之一是这个datasource需要用ActionServlet中定义的方法从Action类访问数据源,不能从其它类中用它。

Struts实现自定义数据库连接池的方法很多,其中JavaWebStudio(详情可参考《Struts开发实例》)提供的自定义数据库连接池,通过web.xml配置引入是一种方法,另外,也可采用Struts1.2.1建议的通过Plug Ins Configuration (插件配置)的方法实现,例如struts自带例子struts-config.xml中的配置:

<plug-in className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn">

    <set-property property="pathname" value="/WEB-INF/database.xml"/>

  </plug-in>

另外,Jakarta的DBCP也是一个选择。

 

2、增加的数据验证组件(Validator enhancements)

·         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处,

先从http://blog.csdn.net/kui/archive/2004/07/15/42075.aspx抄袭过来,请kui兄谅解。以后必整理出自己的东东,以作回报。

1.2.1计算机网络分层结构

两个系统中实体间的通信是一个很复杂的过程,为了降低协议设计和调试过程的复杂性,也为了便于对网络进行研究、实现和维护,促进标准化工作,通常对计算机网络的体系结构以分层的方式进行建模。 我们把计算机网络...
  • jxq0816
  • jxq0816
  • 2016年08月04日 23:09
  • 1212

【struts】struts导入源码和生成API文档

前言    这篇文章主要总结一下在struts中如何导入源码,和如何在没有找到API文档的情况下,自己根据源码手动生成API文档struts导入源码步骤一    在struts项目上右击选择build...
  • boniesunshine
  • boniesunshine
  • 2017年05月21日 21:20
  • 320

简单Struts2的目录结构

最近看Struts2,留个脚印。自己构建一个Struct2后的目录结构 1、Java Resources的src下是源码,例如Action类。还有一个struts.xml的配置文件,主要内容是在A...
  • tjzhaomengyi
  • tjzhaomengyi
  • 2016年04月11日 10:15
  • 2436

Struts2系统结构及运行原理(1)

一、架构图下边是一张Struts2的官方文档中的Struts2的构架图 二、各模块的简要分析(1)橙色是Servlet Filters,过滤连,所有的请求都要经过Filter的处理; (2)浅蓝色...
  • u010870518
  • u010870518
  • 2015年05月20日 11:42
  • 3688

Struts2的目录结构(ssh)

Struts2的目录结构:   解压apps目录下的struts2-blank.war:   仿照这个最基本的项目,拷贝相关文件: 1.拷贝apps/struts2-blank/WE...
  • shenghuaDay
  • shenghuaDay
  • 2016年06月05日 22:19
  • 1580

第一章 HTML标记与文档结构(HTML文档剖析)

1.2 HTML文档剖析   1.2.1 HTML模板 今天,按照 HTML5 语法编写的最简单的 HTML 页面的模板可以写成这样:                      An HTML...
  • Vivianluolita
  • Vivianluolita
  • 2016年06月21日 16:02
  • 1640

Struts基础之工作原理和文件结构

1.工作原理 1.1.工作原理图解 1.1.1.过滤器:用户通过HttpServletRequet发出请求至过滤器,ActionContextCleanUp(可选过滤器主要用于和其他框架进行集成...
  • moHedong
  • moHedong
  • 2016年09月08日 12:12
  • 572

文档视图结构

一、概述 文档/视图结构是在Visual C 中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的对象――文档和视图负责的。具体地说,用户...
  • iamherego
  • iamherego
  • 2015年10月16日 11:08
  • 1160

Hadoop-1.2.1分布式集群搭建(亲测有效版)

Hadoop-1.2.1分布式集群搭建Hadoop-121分布式集群搭建 环境条件 安装jdk并配置环境 安装ssh-client 安装ssh-server 配置ssh免密登录 安装配置Hadoop-...
  • linukey
  • linukey
  • 2017年03月17日 10:14
  • 490

struts2上传word文件并保存到服务器上

1.前台js: Ext.onReady(function() {      Ext.QuickTips.init();           Ext.form.Field.prototype.msg...
  • love_java_cc
  • love_java_cc
  • 2016年04月12日 09:03
  • 1019
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将Struts 1.2.1结构文档进行到底
举报原因:
原因补充:

(最多只允许输入30个字)