struts1.2介绍

                   Struts中是apache组织的MVC框架

下表列出了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周期即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值