Struts基本知识

应用程序文件

Struts 1.1 将许多公用类从 struts.jar 中分离出来。大多数公用功能(如 digestor 实用程序和 Bean 实用程序)已移至公用包中。需要将 commons jar 随 Struts 实现类一起引用。Struts 实现类中已广泛使用 commons 类。

如果不想遭遇那些恼人的 NoClassDefFound 错误,就需要确保 Struts Web 应用程序始终包含下列包。

包名称
用途

commons-beanutils.jar

简单易用的 Java 反射和内省 API 包装器

commons-collections.jar

一组用于扩展和增强 Java Collections Framework 的类

commons-digester.jar

通常用于分析 XML 配置文件的 XML 到 Java 对象映射实用程序

commons-lang.jar

一组公用实用程序类,可以为 java.lang 中的类提供附加功能

commons-logging.jar

各种日志 API 实现的包装器

commons-validator.jar

用于定义 XML 文件中的验证类(验证方法)和验证规则的可扩展框架

jakarta-oro.jar

一组文本处理 Java 类,可以提供兼容 Perl 5 的正则表达式


备注:如果从 Struts 1.0 升级到 Struts 1.1,digestor 类将以单独包的形式位于公用项目下。在 Struts 1.0 中,digestor 类是 Struts 源代码的一部分。

对于任何 Struts 应用程序,类路径中必须有上述类。

理解 Struts 配置文件
通过一个基于 XML 的配置文件来记录和控制 Struts 配置。缺省情况下,该文件的名称是 struts-config.xml,位于 Web 应用程序的 WEB-INF 目录中。Struts 有一个中央控制器 Servlet (org.apache.struts.action.ActionServlet),首次加载 Struts 应用程序时,它会对该配置文件进行分析。 

该配置文件包含 Action 类与 Form 类的映射。映射为应用程序提供页面流。因此,配置文件的两个重要部分是 <form-beans><action-mappings>

  • 下面是一个示例 form-bean

<form-beans>

<form-bean
name="LoginForm"

type="com.test.LoginForm"/>


</form-beans>

对应的 action-mapping 是这样的:

<action-mappings>

<action
path="/login"
type="com.test.LoginAction"
name="LoginForm"
scope="request"
validate="true"
input="/pages/Login.jsp"/>


</action-mappings>

如果 Struts 配置文件中提供的配置详细信息正确,Struts 控制器会对该应用程序流实施控制。如果提供的路径不正确或未在类加载器中找到 Form Bean 或 Action Bean,控制器将返回运行时错误。

 

Struts Form Bean

那么,准确地讲什么是 Form Bean 呢?Form Bean 是一种 Java Bean,广泛用于映射 HTML 表单与相应的 Java Bean。Form Bean 的编码和使用都很简单。在使用 Form Bean 时,需要密切注意以下几点:

  1. Form Bean 映射到的是 HTML 表单上的元素或控件。例如,如果 HTML 表单包含名为 name 的字段,Form Bean 就会包含名为 name 的属性。

  2. 在映射到 HTML 控件的 Form Bean 中定义的每个属性都必须有与之对应的赋值方法和取值方法。例如,该属性有两个方法:setName()getName()。 

  3. Form Bean 还包含一个名为 validate() 的方法。可以使用 validate 方法验证表单项,如果验证失败,则填充 actionErrors 对象,并将控制权返还给调用页面,随后调用页面会显示这些错误。下一小节将对验证和错误处理做更多介绍。

 

Action

Action 类主要用于处理来自视图的数据和对该数据执行任何业务操作。Action 类是 org.apache.struts.action.Action(其实就是一个 HttpServlet)的扩展。因此实际上是在执行 Servlet。 

这些 action 类与 Servlet 不同,它们不是在 web.xml 中注册,而是映射到 Struts 配置文件中的 action 表单。其类似于以下代码:

<action
path="/login"
type="com.test.LoginAction"
name="LoginForm"
scope="request"
validate="true"
input="/pages/Login.jsp"/>

 

可以使用其中的 path 属性 "/login" 调用 Servlet。

Action 类定义需要先行覆盖,才能执行任何任务的 execute 方法。Execute 方法有权访问对应视图的 actionForm Bean、对整个 Struts 配置的引用、HttpServletRequest 对象及 HttpServletResponse 对象。这使 execute 方法能够对 HttpSession 对象、HttpSelvletRequest 对象及 HttpServletResponse 对象执行操作。

 

public ActionForward execute(ActionMapping mapping,
                                                        ActionForm form, 
                                                       HttpServletRequest request, 
                                                       HttpServletResponse response)

 

备注:在 Struts 1.0 中,该方法的名称是 perform()。Struts 1.1 已不支持该方法。

Action 类返回 ActionForward 对象。此 ActionForward 对象确定需要将请求发送到的正确视图。还会在 Struts 配置文件中注册需要将控制权转交给的正确视图。

在上例中,假定在登录失败时需要将控制权传递给 error.jsp,在登录成功时需要将控制权传递给 nextPage.jsp。Forward 标记的注册方式如下:

 

<action
path="/login"
type="com.test.LoginAction"
name="LoginForm"
scope="request"
validate="true"
input="/pages/Login.jsp">
<forward 
    name="failure" 
    path="/error.jsp"/>
<forward 
    name="success" 
    path="/nextPage.jsp"/>
</action>

 


Execute 方法通常以下列语句作为结束语句。

return (mapping.findForward("failure"));

其中的 mapping 指的是 ActionMapping 对象。已定义了特定 action 的 "failure" 路径。因此以上语句实际执行的操作是将请求发送给 error.jsp。 

以上示例中的 <forward> 标记具有局部作用域,可以在定义时所针对的 action 内使用。但也可以定义全局 forward。全局 forward 也在 Struts 配置文件中定义,这与任何其它配置信息是一样的。正如定义全局变量那样,全局 forward 可以在应用程序中的任何地方使用。


 

<global-forwards>
<forward
name="welcome"
path="/Welcome.jsp"/>
</global-forwards>

 

因此,可以在应用程序中的任何地方使用 mapping.findForward("welcome"),而它始终会将控制权转交给 Welcome.jsp

 

Validate 方法和错误处理
如前所述,可以在 struts-config.xml 中禁用操作和验证。Action 中央控制器将确保不进行验证。

 

<action
path="/login"
type="com.test.LoginAction"
name="LoginForm"
scope="request"
validate="true"
input="/pages/Login.jsp"/>

 


Validate 方法返回 ActionErrors 对象。这些对象充当错误信息的容器。如果验证失败,将把这些对象返还给调用 JSP,它可以处理对象以显示它们。


排除消息资源故障
消息资源帮助开发人员在一个集中位置存储标签、错误信息等内容,简化了后续阶段的维护工作。该集中位置是一个属性文件,存储在应用程序的类路径中,因此组件可以方便地访问。

以下是为 Struts 应用程序定义消息资源的两种方法:

  • web.xml 
  • struts-config.xml

对于 web.xml,将属性文件定义为 ActionServlet 的 param-value。下面是一个简短的示例:

<servlet>
<servlet-name>action</servlet -name>
<servlet-class>
    org.apache.struts.action .ActionServlet
</servlet-class>
<init-param>
<param-name>
    application
</param-name>
<param-value>
   beatest.ApplicationResources
</param-value>
</init-param>
</servlet>

请注意,param-name 应用程序和值表示为beatest.ApplicationResources这表示在应用程序类路径的包 beatest 内一定存在一个名为 ApplicationResources.properties 的属性文件。

在 Struts 1.1 中,可以在 struts-config.xml 中定义资源包。

<message-resources parameter="beatest.ApplicationResources"/>

此处的参数为必需值,它引用类路径 beatest 包中的 ApplicationResources.properties 文件。使用 Struts 1.1 时可以有多个资源包,这使开发人员还能够对资源包进行组织。例如,可以有这样的包:

<message-resources key=”errorBundle”  parameter="beatest.ApplicationErrors"/>

<message-resources key=”labelsBundle”  parameter="beatest.ApplicationLabels"/>

可以在应用程序中对它们进行适当设置。如果用户想要为 HTML 显示标签,则可以使用 labelsBundle

<bean:message bundle="lablesBundle" key="some.message.key"/>

而如果想要显示错误信息,则可以使用 errorBundle。

<bean:message bundle="errorBundle" key="some.error.message"/>

 

使用消息资源时的常见问题
开发 Struts 应用程序过程中的一个常见错误是:

 javax.servlet.jsp.JspException:Missing message for key "<some key name>"

要解决此问题,可以确认是否存在下列情况:

  • 消息不是从正确的资源包取得的。请确保引用的是真正包含所提及的键的正确的资源包。 

  • 资源属性文件不在正确的位置或不在应用程序的类路径中。应用程序资源属性文件应位于 WEB-INF/classes 目录中,或应为 WEB-INF/lib 目录中某个 .jar 文件的一部分。 

  •  使用 null="false" 可避免上述错误。例如:

     <bean:message bundle="lablesBundle" key="some.message.key" null="false">

    这样将会设置一个消息资源包,在文件 MyWebAppResources.properties 的缺省键下提供该资源包。缺少的资源键将显示为“???keyname???”。 

 

排除 Struts 国际化故障
缺省情况下,Struts 在每个用户的会话中提供一个 Locale 对象。可以根据用户提供的信息对此 Locale 对象做适当设置。 

以下是 Struts 国际化检查清单:

  1. 设置了 Locale Servlet 参数。
    确保将 ActionServlet 的 Locale 参数设置为 true。缺省情况下将此参数设置为 true,即缺省情况下启用本地化。

  2. 使用了正确的应用程序资源 Servlet 参数。
    对于 MessageResource,如果指定了正确的语言环境,则 ActionServlet 将在类路径中寻找该语言环境专用的属性文件。例如,如果像下面这样指定 MessageResource: 

    <message-resources parameter="beatest.ApplicationResources"/>

    对语言环境敏感的应用程序将寻找名称为 ApplicationResources_xx_XX.properties 的文件,其中 xx_XX 为特定的语言环境,如 es_USfr_CA

    该属性文件只不过是一个简单的包含一组键值对的文本文件。用户需要确保文件的名称正确并位于类路径中。建议将该文件置于 Web 应用程序的 WEB-INF/classes 目录中。 

  3. 如果用户不在缺省语言环境中,则可以在 ActionServlet 中更改 Locale 对象。可以通过替换会话中的 Locale 对象进行更改。 

    Locale locale = new Locale("English","US");
    session.setAttribute(Action.LOCALE_KEY,locale); 

  4. 如果使用了 Struts 控制器,则可以在 struts-config.xml 中将语言环境指定为控制器声明的一部分。 

    <controller processorClass="org.apache.struts.action.RequestProcessor" debug="2" locale="fr_CA"/>

 

Struts 应用程序内的扩展日志记录 

  1. ActionServletweb.xml 中使用调试级别来确保获得扩展的调试消息。有效的 debug 值是 0(不记录)到 6(最严重)。 

  2. 将 detail 参数设置为调试来自 digestor 的消息。以下是 web.xml 的一个片断。

    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
    <param-name>debug</param-name>
    <param-value>4</param-value>
    </init-param>
    <init-param>
    <param-name>detail</param-name>
    <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
    </servlet>
    请注意其中的 debug 和 detail 级别。 

     

  3. 如果使用缺省的 RequestProcesor 控制器,请对附加调试消息使用控制器的 debug 参数。以下是 struts-config.xml 的一个片断。
    <controller processorClass="org.apache.struts.action.RequestProcessor" debug="2"/>

Struts 应用程序性能问题

  • 为对象使用适当的作用域
    避免使 HttpSession 膨胀,而应评估在请求中存储对象这一方案的可行性。可以将不需要长时间持久存储的对象作为 HttpSessionRequest 的一部分来存储,这些对象用后即会被销毁。作为一项惯例,应将 JSP 中 useBean 标记的作用域最小化。因此,Action 表单的子类不应具有会话或应用程序的作用域,除非已无其它方案可供选择。 

  • gif 和 jpeg 数量过多
    站在用户的角度看,其浏览器中页面显示的响应时间取决于下载速度和页面的复杂性。例如,图形的数量。即使各单项 Web 内容的下载都相当快,设计不佳的图形极多的动态网站也会让人有“慢”的感觉。 

  • 预编译 JSP
    预编译 JSP 可以为首次访问 Struts 应用程序的用户提供更好的性能。请使用 weblogic.appc(WLS 8.1 及更高版本)或 weblogic.jspc 来预编译应用程序。 

  • 刷新静态页面
    如果只修改了静态文件,则可以刷新它们而不用重新部署整个应用程序。请使用 weblogic.deployer 实用程序来完成此任务。请参考
    http://e-docs.bea.com/wls/docs81/webapp/deployment.html (English)

  • 标记库过多
    实际上,Struts 框架本身就使用了大量标记库。除非不得已,建议在任何情况下都要最充分地利用这些现成的库,而不要创建新库。自定义标记会产生性能开销。请尽可能少用。

  • 使用 Servlet 过滤器
    这可能会成为性能开销。请确认它是否为应用程序可接受的开销。 

  • 充分调整 JVM
    请确保充分调整 JVM。有关如何调整 JVM 的更多详细信息,请参考 http://e-docs.bea.com/wls/docs81/perform/JVMTuning.html (English)。 

  • 将 EJB 与 Struts Web 应用程序打包在一起
    避免在 WebLogic Server 上将 EJB 档案与 Web 应用程序作为独立的、彼此无关的应用程序进行部署。如果客户端在同一企业应用程序内,WebLogic Server 会优化 EJB 访问。

Struts 最佳实践

  1. 始终依据 JSP 规范定义缺省错误页面。这样如果在处理 Struts 页面过程中出错,将显示错误页面而不是无任何内容的空白屏幕。在 WebLogic 中,可以通过引用 http://e-docs.bea.com/wls/docs81/webapp/web_xml.html#1017571 (English) 处的链接来设置错误页面。

  2. 使用 ExceptionHandler 来处理异常。可以在 Struts-config 文件中声明 ExceptionHandler。可以将控制权传递给相应的错误处理程序页面。可以在需要将控制权传递给非标准错误页面时使用它。 

  3. 将 EJB 与 Struts 一起使用时,使用 Facade 模型调用 EJB。避免直接调用实体。避免将句柄缓存到无状态会话 Bean 中。

  4. 建议不使用 Struts 数据源,而应在进行任何数据库相关操作时使用 WebLogic 数据源,以利用 WebLogic 提供的连接池和事务控制功能。

  5. 仍处于开发阶段时,使用展开 war 格式部署应用程序以节省开发时间。应以开发模式启动 WebLogic Server,以利用 WebLogic 提供的热部署功能。

  6. 如果使用 EJB 和 Struts 应用程序间共享的实用程序类简化对实用程序类和实用程序档案的打包,则请使用 WebLogic 8.1 提供的 APP-INF 功能。

  7. 不将应用程序类添加到服务器的类路径中。服务器处于运行状态时,将无法更改服务器类路径中的任何内容。

 

外部资源


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值