`
dimpen
  • 浏览: 25162 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

struts1.2学习

阅读更多
下表列出了Struts中用到的lib包及其用途
包名称                               用途
Common-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-fileupload.jar      一个处理文件上传的包
Commons-validator.jar      用于定义 XML 文件中的验证类(验证方法)和验证规则的可扩展框架
Jakarta-oro.jar             一组文本处理 Java 类,可以提供兼容 Perl 5 的正则表达式
Struts.jar                  Struts MVC框架包



WEB-INF/下的 后缀名为.tld的文件(标签库描述文件)

struts-bean.tld:  bean标签的描述文件,bean标签用于访问JavaBeans和它们的关联属性,也可以用于定义新的Bean

struts-html.tld:  html标签的描述文件,html标签主要用来创建Html输入表单的标记符

struts-logic.tld: logic标签的描述的文件,logic标签用于管理对输出内容条件判断,从一个集合对象中循环取出内容等以及应用程序的流程管理

struts-nested.tld: nested标签的描述文件,又称嵌套标签,使用嵌套属性可以自由的访问任一层的bean属性

struts-template.tld: 这个template标签库的描述文件,对于共享通用格式的页面创建动态JSP模版是有用的,一般我们不用

struts-tiles.tld: tiles标签的描述文件,只有我们在工程中加入了titles组件时才会用到,titles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。



在我们的web工程中如何引入struts框架呢
在工程中引入struts框架要这么几个步骤

1.将以上所述的 .jar文件和需要的.tld文件分别放在lib目录和WEB-INF/目录下。

2.在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>2</param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

  </servlet-mapping>

3.在web.xml文件中添加要用到的taglib描述文件,例如:

     <jsp-config>

    <taglib>

      <taglib-uri>struts-bean.tld</taglib-uri>

      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

    </taglib>

    <taglib>

      <taglib-uri>struts-html.tld</taglib-uri>

      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>

    </taglib>

    <taglib>

      <taglib-uri>struts-logic.tld</taglib-uri>

      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

    </taglib>

  </jsp-config>

  然后我们就可以在页面中如下引用

<%@ taglib uri="struts-bean.tld" prefix="bean" %>

<%@ taglib uri="struts-html.tld" prefix="html" %>

<%@ taglib uri="struts-logic.tld" prefix="logic" %>


在web.xml中

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns=http://java.sun.com/xml/ns/j2ee

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

可以看出web版本是2.4版本,在2.4版本中允许不在web.xml中配置taglib描述文件

而直接在页面上引用,

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

其中的uri指向本地taglib描述文件的路径即可,但是在web2.3版本中必须在web.xml文件中配置。


4.WEB-INF/struts-cofig.xml配置文件中的struts配置版本必须和lib包中struts版本保持一致

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> 
5.如果工程中要用到validator验证,还用在struts-config.xml文件中加入validator插件

  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property  property="pathnames"

             value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

  </plug-in>

相应得在WEB-INF/目录下validator-rules.xml文件和validation.xml文件也要存在


所有的action from和acton都配在一个struct-config.xml文件中这样的话,这个struts-config文件岂不是变得很大,难以维护。

从struts1.1开始可以支持多个配置文件,一般配置文件的分割原则是一个模块使用一个独立的配置文件,比如在工程中有个user模块,我们可以用struts-config-user.xml文件,所有user模块用到的actionform和action都配置在struts-config-user.xml文件中,注意在各个模块的配置文件中,action元素的input、path属性,forward元素的path属性中的路径都不用带模块名,struts在进行路径解析的时候会自动把模块名加上,如果forward中要跳转到不属于这个模块的下的某个页面,要将forward元素中的contextrelative="false"



那么在工程中我们如何配置多个struts配置文件呢?
修改web.xml文件中关于struts配置部分

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <init-param>

      <param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-user.xml</param-value>

</init-param>

<init-param>

      <param-name>config/user</param-name>

      <param-value>/WEB-INF/struts-config-user.xml</param-value>

</init-param>

    <init-param>

      <param-name>debug</param-name>

      <param-value>2</param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

  </servlet>


参考上面的配置即可,而在我们平时的开发过程中,(JBuilder开发环境中),要在webmodule下的Deployment description目录中右键单击在属性中将所有struts的配置文件全部添加进来,这样就可以了。



在用Jbuilder开发的过程中经常碰到strust1.1和struts1.2版本不一致造成的异常,那么struts1.1和struts1.2版本之间到底有哪些区别呢?
其实在struts1.1和struts1.2种基本没有什么区别, 我们平时碰到的这些异常,是因为Jbuilder2006中基于现有代码创建工程的话,struts的默认版本是1.2,可是我们工程中采用的

Struts是1.1版本,这样struts-config.xml文件中的指示的版本不一致就会出错,

推荐在用Jbuilder2006开发工程时采用struts1.2版本,免得造成不必要的麻烦1.1和1.2之间的区别在于错误信息的处理方式上。

  在1.1中我们用如下的方式在action中保存错误信息

      ActionErrors  errors= new ActionErrors ();

      errors.add(Globals.ERROR_KEY ,new ActionError("要保存得错误信息"));

      this.saveErrors(request,errors);

  在1.2中舍弃了ActionErrors类,统一用ActionMessages

      ActionMessages  messages = new ActionMessages ();

      messages.add(Globals.MESSAGE_KEY,new ActionMessage("要保存得错误信息"));

      this.saveMessages(request,messages);

页面部分显示错误信息1.1中用

<html:errors>

而在1.2中

在页面上显示错误信息

<html:messages id="message" message="true">
      <bean:write name="message"/>

</html:messages>


其他的区别暂时还没有发现。



我要写一个只有两三个属性的ActionForm,可是觉得又不值,还有什么别的办法吗?
像这种情况我们可以写一个动态的ActionForm继承自

org.apache.struts.action.DynaActionForm在struts-config文件中直接配置: 如下所示

   <form-bean name="categoryForm" type="org.apache.struts.action.DynaActionForm">

      <form-property name="categoryId" type="java.lang.Integer" />

      <form-property name="categoryName" type="java.lang.String" />

</form-bean>

然后我们就可以利用这个名为categoryForm的ActionForm了


我现在要用Struts进行服务器端效验,我该怎么作?

有两种办法:

1.在继承自org.apache.struts.action. ActionForm的自定义的ActionForm中覆写validate方法

在这个方法中写入我们的验证代码。

2.在struts-config文件将要进行效验的action元素的validator属性设为true。

二 采用validator插件

其实利用validator进行服务器端效验要做到以下几点:

1.首先确保struts-config.xml文件中已经进行了Validator插件的配置

   <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

     <set-property property="pathnames"

          value="/WEB-INF/validator-rules.xml,/WEB-INF/validations.xml"/>

     <set-property property="pathnames" value="false"/>

</plug-in>

2.所要验证的ActionForm必须继承自org.apache.struts.validator.ValidatorForm;

3.在struts-config文件将要进行效验的action元素的validator属性设为true;

4.在validations.xml文件中指明要进行验证的字段;



如果即在Form Beans中重载了validate方法,又启用了Validate框架,那会是什么效果呢?
由于要启用Validate框架,Form Beans需要继承ValidatorForm,查看ValidatorForm的源代码,发现validate方法已经作了处理(真是为Validate框架所服务的)。

那么在Form Beans中重载了validate方法的话,就会覆盖原有ValidatorForm中对应的功能,所以如果想一起用的话,需要在Form Beans的validate方法中调用errors = super.validate(mapping, request);这句代码是启用Validate框架所要做的工作,然后可以判断errors再作下一步的处理。


当然也可以先做Form Beans中的validate方法,然后启用Validate框架,要看具体情况而定。



Form Beans可以被多个Action应用,有的Aaction中需要验证,我该怎么作?
这时我们可以通过在struts-config.xml文件中设置action元素的validator属性为true或false来实现。



Form Beans可以被多个Action应用,而每个Action可能需要的验证字段都不一样。而在validation.xml中配置的验证方式(如<form name="userForm">)是对这个Form Beans进行的。这样的话,如何来验证呢?
你的Form Beans可以继承org.apache.struts.validator.ValidatorActionForm(当然可以直接配置DynaValidatorActionForm)

struts-config文件配置如下:

<action-mappings>

  <action path="/user/createUser"

         type="com.thewebpagestudio.user.CreateUserAction"

         name="userForm"/>

  <action path="/user/editUser"

         type= com.thewebpagestudio.user.EditUserAction"

         name="userForm"/>

</action-mappings>


validation.xml文件配置如下:

<formset>

  <form name="/user/ createUser ">----这里的采用的是action的path路径

    <field property="city" depends="required">

      <arg0 key="prompt.city"/>

    </field>

  </form>

  <form name="/user/editUser ">

    <field property="state" depends="required">

      <arg0 key="prompt.state"/>

    </field>

  </form>

</formset>


这里说明一点

其中key=" prompt.city "和key=" prompt.state "需要在资源文件中配置,而如果配置成

例如:<arg key="prompt.city " resource="false"/>

如果多了resource="false"这句话,那么它不会再从资源文件中去取,而是直接用key值来表示。



Struts中如何防止重复提交?
在做新增和修改时,一般我们在保存成功后,转向list页面,这时在action中的return mapping.findForward(“list”) 中的list在struts-cofig.xml文件中要指定redirect=true

如果要在request保存返回信息,而不能用redirect=true时,我们可以采用Struts的Token(令牌)机制能够很好的解决表单的重复提交问题:

基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

这时我们一般从Action中的一个方法比如 add()方法转向新增页面,在add方法中,在add方法中用saveToken(request);保存令牌,这时我们可以在输入的jsp页面中发现多了些代码。

<inpu  type="hidden"  name="org.apache.struts.taglib.html.TOKEN"

            value="6aa35341f25184fd996c4c918255c3ae">

这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。


现在我们点击提交按钮到action中的insert()方法,在insert()方法中我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。

if (isTokenValid(request, true)) {

// 表单不是重复提交

//这里是保存数据的代码

} else {

//表单重复提交

saveToken(request);

//其它的处理代码



Struts中如何实现跨页面提交?
跨页面提交时我们可以在Struts-config.xml文件中将所对应的actionForm的周期设为session周期即可。
分享到:
评论

相关推荐

    struts、struts1.2 学习教程

    对于初学者,建议从理解MVC模式入手,然后学习Struts1.2的基本组件和配置,如Action、ActionForm、ActionMapping等。接着,实践创建简单的示例项目,掌握数据传递、请求处理和页面跳转。进阶学习可以涉及Tiles、验证...

    Struts1.2中文学习手册

    通过阅读《Struts1.2学习手册》,初学者能够全面了解Struts1.2框架的工作原理,掌握开发Struts1.2应用的基本技能,并逐步成长为一名熟练的Web开发者。该手册是学习Struts1.2的宝贵资源,无论你是Java新手还是有经验...

    struts1.2学习模型

    这个"struts1.2学习模型"是一个针对初学者或开发者的学习资源,旨在帮助他们理解和掌握Struts1.2的核心概念和工作流程。 在Struts1.2框架中,最重要的组成部分包括Action、ActionForm、ActionServlet、配置文件...

    Struts 1.2 学习的简单例子

    struts学习的核心在于理解其中的配置文件web.xml和struts-config.xml文件的结构,本资源在前人写的基础上改写,web.xml和struts-config.xml均用图形界面设计(不是直接敲代码的),有问题可以联系QQ:845359787

    美河Struts1.2学习-源码(1)

    这个压缩包文件"美河Struts1.2学习-源码(1)"显然是一个关于Struts1.2版本的学习资源,包含了相关的源代码、配置文件以及日志管理的配置。下面我们将深入探讨Struts1.2的主要特性、工作原理以及如何使用它。 **1. ...

    struts1.2学习笔记

    ### Struts 1.2 学习笔记:深入理解 Struts 工作流程 #### Struts 概述 Struts 是一个开源的 MVC(Model-View-Controller)框架,用于简化 Java Web 应用程序的开发。Struts 1.2 版本是基于 Servlet 的 MVC 实现,...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    总结来说,这个demo项目提供了一个学习和实践Struts1.2、Spring2.5和Hibernate3.2集成的平台,涵盖了MVC设计模式、依赖注入、面向切面编程和对象关系映射等多个关键概念。通过深入研究和修改这个项目,开发者能够...

    struts2和struts1.2学习课件

    通过学习这个课件,你将能够掌握Struts 2的基础知识,了解其与Struts 1.2的区别,从而更好地在实际项目中应用Struts框架,提升开发效率。如果你正在寻找一种强大的MVC框架来构建Java Web应用,那么无论是Struts 1.2...

    struts1.2下载包

    3. `examples`目录:包含了一些示例应用,展示了Struts1.2的各种功能和最佳实践,是学习和调试的好材料。 4. `webapps`目录:可能包含一个或多个预配置的Web应用程序,演示了Struts1.2框架的使用。 在JSP中使用...

    STRUTS1.2中文文档

    通过深入学习这些Struts1.2的关键概念和机制,开发者能够更好地理解和构建基于MVC的Java Web应用程序。这份"STRUTS1.2中文文档"涵盖了这些主题,是初学者和进阶者学习Struts框架的重要参考资料。文档中的实例、教程...

    struts1.2 from表单提交包含list的对象

    如果能访问到这个项目,可以更深入地学习Struts1.2处理包含列表对象的表单提交的实践细节。 总结来说,Struts1.2处理包含列表对象的表单提交涉及到表单设计、ActionForm的创建、Action类的编写以及Struts框架的内部...

    struts 1.2驱动包

    Struts 1.2虽然在现代Web开发中已经被Struts 2或者Spring MVC等更新的框架取代,但它的设计理念和模式对于理解MVC架构和Web应用的开发仍然具有重要的学习价值。在学习和使用Struts 1.2时,开发者应关注其核心组件的...

    Struts 1.2 API详细讲解.rar

    这份"Struts 1.2 API详细讲解"文档很可能会涵盖这些组件的详细说明、使用示例以及最佳实践,对于想要深入学习Struts 1.2的初学者来说,是一份不可多得的学习资料。通过系统地学习和实践,你可以逐步掌握如何利用...

    struts 1.2 类库和源码

    这个压缩包包含了Struts 1.2版本的类库和源码,使得开发者能够方便地研究和学习这个经典框架的工作原理。 Struts 1.2 类库主要包括以下组件: 1. **核心库(lib)**:这是框架运行的基础,包含如struts-core、...

    基于Struts1.2的上传下载Demo

    通过本项目"基于Struts1.2的上传下载Demo",你可以学习到如何在实际项目中实施这些操作,这对于理解Struts1.2的工作原理以及如何处理文件操作具有重要意义。请注意,虽然Struts1.2已经比较老旧,但了解其工作原理...

    struts1.2.jar包

    Struts1.2.jar包是基于Java的Web应用程序开发中的一个关键组件,它属于Apache Struts框架的一个版本。Struts是一个开源的MVC(Model-View-Controller)框架,用于构建可维护、可扩展和高度结构化的Web应用程序。在...

    struts1.2 简单文件上传例子

    通过这个简单的Struts1.2文件上传示例,我们可以学习到如何在Java Web环境中处理文件上传,理解MVC框架如何与外部库协同工作,以及如何在实际应用中确保文件上传的安全性。这对于任何想要深入理解Struts1.2或者进行...

    struts1.2源代码及文档

    通过学习Struts1.2的源代码,你可以更深入地了解MVC模式的实现,以及Web应用的请求处理流程。同时,结合提供的文档,可以更好地理解框架的设计理念和使用方法。文档通常会包含详细的API参考、教程和最佳实践,对于...

Global site tag (gtag.js) - Google Analytics