struts 1.2配置文件

struts 1.2配置文件

49人阅读 评论(0) 收藏 举报
     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周期即可

转载于:https://www.cnblogs.com/moonvan/archive/2011/12/06/2278601.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资本|五大科技巨头并购投资布局分析

来源&#xff1a;199IT互联网数据中心就买进而言&#xff0c;科技巨头可能是一个理想的收购方。Alphabet、亚马逊、苹果、Facebook和微软拥有巨大的市场价值&#xff08;3.9万亿美元&#xff09;。综合来看&#xff0c;五大科技巨头在整个并购市场占有相对较小的份额。下图显示…

安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega

安装 Chrome 插件 3 种方法 方法 1&#xff1a;直接通过 chrome 插件商店安装&#xff0c;google 插件商店因为 "都懂的" 原因无法访问&#xff0c;如果会 "高科技" 上网可以忽略。直接通过插件商店安装方法 2&#xff1a;如果不会 "高科技" 上网…

第2节 多层PCB设计布局和布线原则

11.2.1 元器件布局的一般原则 设计人员在电路板布局过程中需要遵循的一般原则如下。 &#xff08;1&#xff09;元器件最好单面放置。如果需要双面放置元器件&#xff0c;在底层&#xff08;Bottom Layer&#xff09;放置插针式元器件&#xff0c;就有可能造成电路板不易安放…

数据库管理工具 Navicat 和 DBeaver

Navicat “Navicat” 是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库&#xff0c;例如阿里云、‎腾讯云。Navicat 和 Navicat …

百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市

来源&#xff1a;雷锋网去年 10 月&#xff0c;全球自动驾驶研发先行者 Waymo 发布了长达 43 页的安全报告&#xff0c;里面详细说明了如何装备和训练自动驾驶车辆&#xff0c;从而避免驾驶过程中一些意外情况的发生。今年 1 月&#xff0c;美国车企巨头通用也发布了“2018 自动…

Chrome Devtools 高级调试指南

From ( Chrome Devtools 高级调试指南 )&#xff1a;https://juejin.cn/post/6844903961472974855 chrome devtools 设置黑色主题&#xff1a;https://blog.csdn.net/sinat_15347975/article/details/81151342 Chrome DevTools 实用技巧大全&#xff08;收藏&#xff09;&…

包揽全球50%以上份额,中美发力超级计算

来源&#xff1a;第一财经摘要&#xff1a;中国已经成为全球拥有最多超级计算机的国家。根据上周发布的一份最新榜单&#xff0c;全球排名前500强的超级计算机中&#xff0c;有206台是中国研制的&#xff1b;而美国仅拥有124台。多年来&#xff0c;美国长期主导着超级计算机市场…

Oracle函数translate()的用法

一、语法&#xff1a; TRANSLATE(string,from_str,to_str) 二、目的 返回将&#xff08;所有出现的&#xff09;from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长…

Fiddler 抓包工具总结

From&#xff1a;https://www.cnblogs.com/yyhh/p/5140852.html 官方文档&#xff1a;https://www.telerik.com/support/fiddler Fiddler 调式使用 (一) --- 深入研究&#xff1a;https://www.cnblogs.com/tugenhua0707/p/4637771.html Fiddler 实战 --- 深入研究(二)&#…

Cassandra集群配置

版本&#xff1a;apache-cassandra-1.0.6机器1:10.16.233.27机器2:10.16.233.41机器3:10.16.233.45机器4:10.16.233.36机器5:10.16.233.39机器6:10.16.233.66机器1和机器2作为seed_providerjava jdk已经安装并且设置过JAVA_HOMEssh已经设置1.解压 apache-cassandra-1.0.6-bin.t…

云计算行业报告:2018, 风起云涌

来源&#xff1a;物联网智库摘要&#xff1a;依托弹性扩展、费用低、速度快的优势&#xff0c;云计算颠覆了传统IT架构&#xff0c;未来将成为主流的IT架构。多优势助力云计算颠覆传统IT服务架构经过十几年的发展&#xff0c;云计算已经形成了较为完善的生态系统&#xff0c;构…

charles 简单使用

From&#xff1a;https://www.cnblogs.com/wenjun145/p/12995535.html 1、下载安装 1. 下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 2. 下载之后安装。按照默认next 即可&#xff0c;然后选择路径。 3. charles 。PJ&#xff1a;https://ww…

文本框输入限制,数字,字母,下划线

1.文本框只能输入数字(小数点也不能输入) <input name"txt1" οnkeyup"this.valuethis.value.replace(/\D/g,)" onafterpaste"this.valuethis.value.replace(/\D/g, )"> 2.只能输入数字,能输小数点. <input name"txt1" οnk…

Facebook、谷歌、微软利用“黑暗模式”诱骗用户交出数据

来源&#xff1a;网络大数据摘要&#xff1a;挪威消费者委员会指出&#xff0c;Facebook、谷歌以及微软等科技巨头正在使用“黑暗模式”&#xff0c;或用户界面来诱骗用户交出自己的数据&#xff0c;以此推动用户被动选择不利于自身隐私保护的选项。据称&#xff0c;谷歌和Face…

Python 大规模异步新闻爬虫、google翻译、百度翻译、有道翻译、百度指数

参考&#xff1a;https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html url_pool.py # -*- coding: utf-8 -*- # Author : 佛祖保佑, 永无 bug # Date : # File : url_pool.py # Software: PyCharm # description : XXXimport time import redis import pick…

字字珠玑!任正非最新内部演讲:高科技急不来,股市为了圈钱夸大太多

来源&#xff1a;综合自中国企业家杂志、心声社区摘要&#xff1a;“科学研究&#xff0c;没有浪费就不可能有成功。华为公司走到今天&#xff0c;我们在产品研究的成功率应该还没有超过50%&#xff0c;相当于我们每年有几十亿美金被浪费了&#xff0c;但是培养了一大批高级将领…

table数据表 边框特效

本文针对用table显示数据&#xff0c;主要是table的线条颜色处理。 1.下面的这个方法&#xff0c;比较试用于单一的table不适用于table 套着table。这样的话在某些浏览器上浏览是有差别的。table套table 有可能会出现线条加粗的情况。 <style type"text/css"> …

新的一年了

新的一年了 和朋友喝酒聊天 回首一下2011 想想了去年定的计划 目标 好像很多都没有完成 但是新的一年又来到 而且还是2012 哎&#xff5e;今天想做的事情还是很多 一年一年的就这样过去了 今年要写详细的计划书 把每天都当成最后一天来过&#xff5e;加油 2012转载于:https://w…

jQuery 教程

菜鸟教程 --- jQuery 教程&#xff1a;https://www.runoob.com/jquery/jquery-tutorial.html jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 jQuery 简介 什么是 jQuery &#xff1f; jQuery 是一个 JavaScript 函数库。 jQuery 是一个轻量级的"…

世界首条柔性人造触觉神经诞生,有望应用于义肢感触等领域

来源&#xff1a;中国青年报摘要&#xff1a;如果能让机器人拥有触觉&#xff0c;可以感知温度、压力&#xff0c;甚至具有神经活动&#xff0c;那么它们将“解锁”更多新技能。如果能让机器人拥有触觉&#xff0c;可以感知温度、压力&#xff0c;甚至具有神经活动&#xff0c;…