第1讲 搭建Struts2环境与简单应用开发_第1页
第1讲 搭建Struts2环境与简单应用开发_第2页
第1讲 搭建Struts2环境与简单应用开发_第3页
第1讲 搭建Struts2环境与简单应用开发_第4页
第1讲 搭建Struts2环境与简单应用开发_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1讲 搭建struts2环境与简单应用开发1. struts2框架l struts2由传统的struts1和webwork两个经典mvc框架发展而来l struts2是一个非常优秀的mvc框架2. mvc思想概述mvc思想将应用中各组件按功能进行分类,不同的组件使用不同技术充当,甚至推荐了严格分层,不同组件被严格限制在其所在层内,各层之间以松耦合的方式组织在一起,从而提供良好的封装。model1(jsp+javabean):jsp页面接收处理客户端请求,对请求处理后直接做出响应。用少量的javabean来处理数据库连接、数据库访问等操作。jsp页面身兼view和controller两种角色,

2、将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性低,增加了应用的扩展和维护的难度。model2(jsp+servlet+javabean):属于mvc架构的设计模式。mvc思想将一个应用分为三个基本部分:model(模型)、view(视图)、controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性和维护性。mvc有如下特点:l 多个视图对于一个模型,一旦模型发生变化,易于维护;l 模型返回的数据与显示逻辑分离;l 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性;l 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因

3、此,控制层可以说是包含了用户权限的概念;l mvc更符合软件工程化管理的精神。3. struts2的下载和安装下载并搭建struts2环境:(1). 下载struts2.2.1;(2). 找到开发struts2应用需要使用到的jar文件;(3). 编写struts2的配置文件;(4). 在web.xml中加入struts2框架的启动配置。开发struts2最少需要的jar文件:(1). struts2-core-.jar:struts2框架的核心类库;(2). xwork-core-.jar:xwork类库,struts2在其上构建;(3). ognl-3.0.ja

4、r:对象图导航语言(object graph navigation language),一种功能强大的表达式语言,主要用于读写对象的属性;(4). freemarker-2.3.16.jar:struts2ui标签的模板使用freemarker编写;(5). commons-fileupload-1.2.1.jar:文件上传组件,2.1.6以后版本必须加入此文件;(6). commons-io-1.3.2.jar:io输入输出流组件,主要完成文件的读写功能;(7). javassist-3.7.ga.jar:javassist是一个开源的分析、编辑和创建java字节码的类库。编写struts2

5、的配置文件struts2默认的配置文件为struts.xml,该文件需要存放在web-inf/classes下在web.xml中加入struts2框架的启动配置<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter</filter-class></filter><filter-mapping><filter-na

6、me>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>struts2框架是通过filter启动的,在web.xml中配置。在strutsprepareandexecutefilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。注意:struts2读取到struts.xml的内容后,以javabean的形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件

7、。4. strus2简单应用开发4.1 helloworld目标:点击超链接,发出请求,在请求中存数据,在另一个页面中显示存入的数据。l jsp+servlet实现l struts实现总结:l package用来管理action,主要用于管理一组业务功能相关的action。l name属性:必须有并要求name属性值唯一,它不对应java的类包。l namespace属性:定义包的命名空间,命名空间是访问该包下action的路径一部分。l 只有当包都继承了struts-default包,才可以使用struts2的核心功能。l abstract="true"表示该包为抽象包,

8、不能包含actionl struts2中action的默认后缀为.action目标:struts如何实现简单转发 - action配置的各项默认值。l 如果没有为action指定class,默认是actionsupport;l 如果没有为action指定method,默认执行action中的execute()方法;l 如果没有指定result的name属性,默认值是success4.2 登录目标:输入用户名、密码,成功跳转到成功页面,失败返回登录页面。l jsp+servlet实现l 表单+actionl struts标签+actionl 国际化总结:l 添加国际化配置<constant

9、 name="struts.custom.i18n.resources" value="mess"/>l 添加国际化文件perties、mess_zh_cn.properties、mess_en_us.propertiesl 修改internet选项第2讲 struts2处理流程与常规配置1.struts2应用开发步骤(1). 在web.xml文件中定义核心filter来拦截用户请求。(2). 如果需要以post方法提交请求,则定义包含表单数据的jsp页面。如果仅仅只是以get方式发送请求,则无须此步骤。(3). 定义处理用户请求的

10、action类。(4). 配置action。(5). 配置处理结果和物理视图资源之间的对应关系。(6). 编写视图资源。如果action需要把数据传给视图资源,则可以借助于ognl表达式。2.struts2的处理流程l 控制器包括核心控制器和业务控制器l 业务控制器与物理视图解耦:若需要将某个视图名映射到不同视图资源,无须修改xxxaction的代码,只需修改配置文件。3.struts常量配置l struts.i18n.encoding:指定web应用的默认编码集,相当于request.setcharacterencoding()。l struts.custom.i18n.resources:

11、指定国际化资源文件的basenamel struts.action.extension:需要struts处理的请求后缀,默认值为action,可以指定多个l struts.server.static.browsercache:设置浏览器是否缓存静态内容,默认值为true,开发时应设为falsel struts.configuration.xml.reload:当struts的配置文件修改后,系统是否自动重新加载该文件,开发时应设为truel struts.devmode:设置struts2应用是否为开发模式,打印出更详细的信息备注:l 哪些常量是有效的?在struts2-core2.2.1.j

12、ar压缩文件的orgapachestruts路径下的perties文件中定义。l struts2默认会加载struts.xml、struts-default.xml、struts-plugin.xml三个配置文件n struts.xml是开发者定义的默认配置文件n struts-default.xml是struts框架自带的配置文件n struts-plugin.xml是struts插件的默认配置文件n 加载顺序为struts-default.xml、struts-plugin.xml、struts.xmll struts2常量配置有三种方式n 通过struts.xml配

13、置文件n 通过perties文件n 通过web.xml文件l struts2的所有配置文件(包括用户自定义配置文件)都可以用来配置常量,推荐struts.xmll struts2搜索常量的顺序为struts-default.xml、struts-plugin.xml、struts.xml、perties、web.xml,如果在多个文件中配置了同一个struts2常量,则后一个会覆盖前一个4.包含其他配置文件l 为了避免struts.xml文件过于庞大,提高struts.xml文件的可读性,可以将一个struts.xml文件分解成多个配置文件,在strut

14、s.xml中包含其他配置文件l <include file=”struts-part1.xml”/>第3讲 实现和配置action1.action接口和actionsupport类l action类里的属性,不仅可用于封装请求参数,还可用于封装处理结果l 为了让用户开发的action类更规范,struts2提供了一个action接口l actionsupport类是action接口的实现类,如果开发者的action继承了actionsupport类,则会大大简化action的开发l actionsupport类是action的默认处理类2.action访问servlet apil

15、action访问servlet api是必要的l web应用中经常访问的servlet api有httpservletrequest、httpservletsession和httpservletcontext,对应于jsp内置对象request、session、applicationl struts2提供了一个actioncontext类,用于action访问servlet apin object get(object key):request.getattribute(string name)n map getapplication():返回一个map对象,该对象模拟了servletcont

16、ext实例n map getsession():返回一个map对象,该对象模拟了httpsession实例n static actioncontext getcontext():获取系统的actioncontext实例l 实例:测试action访问servlet apin 实现登录功能,返回success或errorn 用application实现简单计数器n 用session保存用户名n 用request保存提示信息(tip)l action既可以彻底与servlet api分离,也可以用简单的方式操作request、session、application范围的属性3.action直接访问s

17、ervlet apil 为了在action中直接访问servlet api,struts2提供了如下接口:n servletcontextaware:实现接口的action可以直接访问servletconext实例n servletrequestaware:实现接口的action可以直接访问httpservletrequest实例n servletresponseaware:实现接口的action可以直接访问httpservletresponse实例l 实例:通过httpservletresponse为系统添加cookie对象,实现自动登录l 即使获得httpservletresponse对象

18、,也不要尝试直接在action中对客户端生成响应4.使用servletactioncontext访问servlet api5. 配置actionl 包和命名空间n struts2使用包来组织action,action是struts2的基本“程序单位”n 配置<package />元素时必须指定name属性,该属性是引用该包的唯一标识n extends属性值必须是另一个包的name属性n 因为struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义n 命名空间主要是为了处理同一个web应用中包含同名action的情形。同一个命名空间里不能有同名的action,不同命名空间

19、里可以有同名的actionn struts搜索命名空间的顺序u 命名空间只有一个级别。如果请求的url是/bookservice/search/get.action,系统将先在/bookservice/search的命名空间(存在)下查找名为get的action,如果在该命名空间内找到名为get的action,则由该action处理用户请求;如果在该命名空间内没有找到名为get的action,系统将直接进入默认的命名空间中查找名为get的actin,而不会在/bookservice的命名空间下查找名为get的action。u 默认命名空间和根命名空间的区别:默认命名空间可以处理任何命名空间下的

20、action请求,根命名空间只会处理根命名空间下的请求。l action的基本配置n 定义<action />元素时,需要指定name属性,name默认不允许使用“/”,如果想使用“/”,需要设置struts.enable.slashesinactionnames=truel 使用action的动态方法调用n 动态方法调用允许在一个action内包含多个控制处理逻辑n 使用动态方法调用,应该确保struts.enable.dynamicmethodinvocation = truefunction regist()var myform = document.forms0;myfor

21、m.action = "login!regist"<input type="submit" value="注册" onclick="regist()"/>l 指定method属性及使用通配符n 使用method属性实现一个action包含多个处理逻辑n 使用通配符简化struts.xml配置n 通配符可以在method、class和result中使用n 不建议超链接直接连接到某个视图资源,建议将所有请求都交给struts框架处理n <action name=”*”><result>

22、;/1.jsp</result></action>第4讲 配置result和异常处理1.配置resultl 理解处理结果n <result/>元素定义逻辑视图和物理视图之间的映射关系n 浏览者、控制器和视图资源之间的顺序图如下:l struts2支持的结果类型n dispatcher:指定使用jsp作为视图的结果类型(默认值)n redirect:直接跳转到其它url的结果类型n redirectaction:直接跳转到其它action的结果类型n plaintext:用于显示某个页面的原始代码的结果类型l plaintext结果类型n location:指

23、定实际的资源视图n charset:指定输出页面时所使用的字符集<result name="source" type="plaintext"><param name="location">/xxx.jsp</param><param name="charset">utf-8</param>不设置该选项易出现中文乱码</result>l redirect结果类型与dispatcher的区别:n 重定向会丢失所有的请求参数、请求属性和action处

24、理结果n 重定向地址栏会发生变化l redirectaction结果类型:直接将请求重定向到另一个actionn actionname:指定重定向的action名n namespace:指定重定向的action所在的命名空间n 包括同一命名空间的重定向和不同命名空间的重定向l 全局结果n 使用<global-results/>标签定义n 如果一个action包含了与全局结果同名的结果集,则action里的局部result会覆盖全局result。2. 异常处理l 在action中手动处理异常,缺点:异常处理与代码耦合,一旦需要改变异常处理方式,必须修改代码!l struts2中的声明

25、式异常:以声明式的方式管理异常处理n action接口中execute方法签名n 在struts.xml中配置异常处理n 前提:打开struts2的异常处理功能<interceptor name="exception" class="erceptor.exception mappinginterceptor"/><interceptor-stack name="basicstack"><interceptor-ref name="except

26、ion"/>.</interceptor-stack>l 声明式异常捕获n 在struts.xml文件中配置<exception-mappting/>元素u exception:指定异常类型u result:指定逻辑视图名n 异常映射u 局部异常映射:<action />元素的子元素u 全局异常映射:<global-exception-mappint/>元素的子元素n 实例:u 抛出myexception和sqlexception<global-results><!- 定义当sql、root两个逻辑异常都对应ex

27、ception.jsp页 -><result name="sql">/exception.jsp</result><result name="root">/exception.jsp</result></global-results><!- 定义全局异常映射 -><global-exception-mappings><!- 当action中遇到sqlexception异常时,系统将转入name为sql的结果中-><exception-mapping

28、 exception="java.sql.sqlexception" result="sql"/><!- 当action中遇到exception异常时,系统将转入name为root的结果中-><exception-mapping exception="java.lang.exception" result="root"/></global-exception-mappings><action name="login" class="org

29、.crazyit.app.action.loginaction"><!- 定义局部异常映射, 当action中遇到myexception异常时,系统将转入name为my的结果中-><exception-mapping exception="org.crazyit.app.exception.myexception"result="my"/><!- 定义三个结果映射 -><result name="my">/exception.jsp</result><r

30、esult name="error">/error.jsp</result><result name="success">/welcome.jsp</result></action>n 全局异常映射的result属性值通常不要使用局部结果,局部异常映射的result属性值既可以使用全局结果,也可以使用局部结果l 输出异常信息n <s:property value=”exception”/>n <s:proterty value=”exceptionstack”/>第5讲 str

31、uts2的国际化1. 加载全局资源文件l 配置basename:<constant name="struts.custom.i18n.resources" value="sandy"/>2. 访问国际化消息l 用<s:text/>输出国际化消息. <s:text name="key"/>l 用表单元素输出国际化信息(key属性)l 在action中输出国际化消息. actionsupport类的gettext方法3. 输出带占位符的国际化消息l 在jsp页面中填充国际化消息里的占位符<s:te

32、xt name="title"><s:param><s:property value="username"/></s:param> <s:param><s:property value="username"/></s:param></s:text>l 在action中填充国际化消息里的占位符. gettext(string atextname,list args). gettext(string key, string args)4. 加载资源文

33、件的方式l 包范围资源文件. 在包的根路径下建立多个文件名为package_lauguage_perties的文件. action优先使用包范围的资源文件l action范围资源文件. 在action类所在路径建立actionname_language_perties文件. action优先加载action范围资源文件. action范围的资源文件,允许不同action使用相同的key表示不同的字符串l 临时指定资源文件. 借助于<s:i18n/>标签,在jsp页面输出国际化消息时指定国际化资源的位置. <s:i18n name=”

34、basename”></s:i18n>第6讲 struts2的类型转换1.问题的提出l struts2框架需要解析http请求参数,并将请求参数传给控制器组件。l 问题:http请求参数都是字符串类型,action中定义的是java数据类型,struts2框架必须将这些字符串参数转换成相应的数据类型。2.struts2内建的类型转换器l boolean和booleanl char和characterl int和integerl long和longl float和floadl double和doublel date:日期格式使用用户请求所在locale的short格式l 数组:

35、在默认情况下,数组元素是stringl 集合:在默认情况下,假定集合元素类型为string,创建一个新的arraylist封装所有的字符串l com.opensymphony.xwork2.conversion.impl.xworkbasicconverter(内置类型转换类)3.基于ognl的类型转换l username 赋值给action中属性名为username的属性l bean.firstname 赋值给action中属性名为bean对象的firstname属性4.自定义类型转换器l 需求:实现username,password与user类型之间的转换l 自定义类型转换器需要继承def

36、aulttypeconverter类/类型转换器必须重写convertvalue方法,该方法需要完成双向转换public object convertvalue(map context, object value, class totype)/当需要将字符串向user类型转换时if (totype = user.class )/系统的请求参数是一个字符串数组string params = (string)value;/创建一个user实例user user = new user();/只处理请求参数数组第一个数组元素,/并将该字符串以英文逗号分割成两个字符串string uservalues

37、= params0.split(",");/为user实例赋值user.setname(uservalues0);user.setpass(uservalues1);/返回转换来的user实例return user;else if (totype = string.class )/将需要转换的值强制类型转换为user实例user user = (user) value;return "<" + user.getname() + ","+ user.getpass() + ">" return null

38、;5. 注册类型转换器l struts2支持三种方式来注册类型转换器. 注册局部类型转换器:仅仅对某个action的属性起作用. 注册全局类型转换器:对所有action的特定类型的属性都会生效. 用注解来注册类型转换器:通过注解方式来注册类型转换器l 局部类型转换器. 注册局部类型转换器使用局部类型转换文件指定. 局部类型转换文件的文件名应为actionnperties形式. 类型转换文件应该和action类文件放在相同的位置. 内容:<propname>=<converterclass>l 全局类型转换器. 全局类型转换器对指定类型

39、的属性起作用. 文件名:perties. 放在web-inf/classes路径下. 内容:<proptype>=<converterclass>l 用注解注册类型转换器. typeconversion(converter="com.xawx.web.converter.hyphenconverter")6. 基于struts2的自定义类型转换器l struts2提供了一个strutstypeconverter抽象类,该抽象类是defaulttypeconverter的子类,strutstypeconverte

40、r类简化了类型转换器的实现public class userconverter extends strutstypeconverter /实现将字符串类型转换成复合类型的方法public object convertfromstring(map context, string values , class toclass)/创建一个user实例user user = new user();/只处理请求参数数组第一个数组元素,/并将该字符串以英文逗号分割成两个字符串string uservalues = values0.split(",");/为user实例赋值user.se

41、tname(uservalues0);user.setpass(uservalues1);/返回转换来的user实例return user;/实现将复合类型转换成字符串类型的方法public string converttostring(map context, object o)/将需要转换的值强制类型转换为user实例user user = (user) o;return "<" + user.getname() + ","+ user.getpass() + ">"第7讲 struts2的输入校验1.关于输入校验l

42、为什么学习输入校验?. 输入校验是所有web应用必须处理的问题。. 通过输入页面收集的数据既有正常用户的误输入,也有恶意用户的恶意输入。. 健壮的系统必须将这些非法输入阻止在应用之外,防止非法输入进入系统。l 输入校验:捕获异常输入时,应用程序直接返回,提示浏览者必须重新输入。l 输入校验分为客户端校验和服务器端校验。. 客户端校验:过滤正常用户的误操作,主要通过javascript代码完成。. 服务器端校验:通过在应用中编程实现,是整个应用阻止非法数据的最后防线。2.基于xml配置方式的输入校验l 使用struts的校验框架进行校验,无须对程序代码进行任何改变,只需编写校验规则文件即可,校验

43、规则文件指定每个表单域应该满足怎么的规则。l 需求:表单验证. name和pass只能是字母、数字和下划线,且长度必须在4到25之间;. age必须在1-150之间;. birth必须在1900-01-01 2050-02-21之间。l 为action指定校验文件. actionclassname-validation.xml. 保存在与action class文件相同的路径下l 编写输入校验文件:com.opensymphony.xwork2.validator.validators下的default.xml中找到<?xml version="1.0" encodi

44、ng="gbk"?><!- 指定校验配置文件的dtd信息 -><!doctype validators public "-/opensymphony group/xwork validator 1.0.3/en""<!- 校验文件的根元素 -><validators><!- 校验action的name属性 -><field name="name"><!- 指定name属性必须满足必填规则 -><field-validator type=

45、"requiredstring"><param name="trim">true</param><message>必须输入名字</message></field-validator><!- 指定name属性必须匹配正则表达式 -><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><

46、message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message></field-validator></field><!- 校验action的pass属性 -><field name="pass"><!- 指定pass属性必须满足必填规则 -><field-validator type="requiredstring"><param name="trim">true</param><mes

47、sage>必须输入密码</message></field-validator><!- 指定pass属性必须满足匹配指定的正则表达式 -><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><message>您输入的密码只能是字母和数字,且长度必须在4到25之间</message></field-validator></fi

48、eld><!- 指定age属性必须在指定范围内-><field name="age"><field-validator type="int"><param name="min">1</param><param name="max">150</param><message>年纪必须在1到150之间</message></field-validator></field><!-

49、指定birth属性必须在指定范围内-><field name="birth"><field-validator type="date"><!- 下面指定日期字符串时,必须使用本locale的日期格式 -><param name="min">1900-01-01</param><param name="max">2050-02-21</param><message>生日必须在$min到$max之间</messa

50、ge></field-validator></field></validators>l 校验过程. 当输入校验失败后,struts2将返回名为“input”的逻辑视图,因此需要配置。. 校验成功后,执行action中相应的方法。l 显示校验错误. <fielderror/>l 提示. 类型转换失败的提示消息,输入校验的提示消息都被封装成fielderror,并被放入actioncontext中,并且校验失败后都返回“input”逻辑视图,都可以使用<fielderror/>标签输出错误提示。. 如果开发者使用了struts2标签

51、来生成表单,则表单标签会自动输出错误提示。. 以上校验规则对action中所有处理逻辑有效。3.国际化提示消息l 为<message />标签指定key属性,该属性指定的是国际化提示消息对应的key。. <message key="name.requried"/>. <message>$gettext("name.requried")</message>4.短路校验器l <field-validator/>元素可以指定short-circuit属性,这个属性指定该校验器是否是短路校验器,默认值为

52、false。l 对应同一个字段内的多个校验器,如果一个短路校验器失败,其他校验器都根本不会继续校验。5.校验文件的搜索规则l 一个action中可能包含多个处理逻辑,struts2允许为不同的处理逻辑指定不同的校验规则l 例如:一个action既处理login又处理registerl 为校验规则文件名增加actionalias来指定需要校验的具体处理逻辑. actionclassname-actionalias-validation.xml. registeraction-login-validation.xmll struts2搜索校验规则文件的顺序为. baseactionclassnam

53、e-validation.xml. baseactionclassname -baseactionalias-validation.xml. actionclassname-validation.xml. actionclassname-actionalias-validation.xml. 自上而下,起作用的校验规则是所有校验规则之和,如果两个校验规则文件中指定的校验规则冲突,则使用下面文件中的校验规则6.内建校验器l struts2提供了大量的内建校验器,可以满足大部分应用的校验需求l 必填校验器required:指定的字段必须有值<field name="name&quo

54、t;><field-validator type="required"><!配置必填校验器 -><message>name must not be null</message><!指定校验失败的提示消息-></field-validator></field>l 必填字符串校验器requirestring:字段值必须非空且长度大于0<field name="name"><field-validator type="requiredstrin

55、g"><param name=”trim”>true</param><message>name is required</message><!指定校验失败的提示消息-></field-validator></field>l 整数校验器int:包括int,short,long,要求字段的整数值必须在指定的范围内<field name="age"><field-validator type="int"><param name=”m

56、in”>5</param><param name=”max”>150</param><message></message><!指定校验失败的提示消息-></field-validator></field>l 日期校验器date:要求字段的日期必须在指定的范围内<field name="birth"><field-validator type="date"><param name="min">1900

57、-01-01</param><param name="max">2050-02-21</param><message></message><!指定校验失败的提示消息-></field-validator></field>l 字段表达式校验器fieldexpression:要求指定字段满足一个逻辑表达式,当表达式返回true时,通过校验,否则校验失败。<field name="pass"><field-validator type="

58、fieldexpression"><param name=”expression”><!cdata(pass=rpass)></param><message></message><!指定校验失败的提示消息-></field-validator></field>l 邮件地址校验器email:要求字符串如果非空,则必须是合法的邮件地址<field name="email"><field-validator type="email"

59、><message></message><!指定校验失败的提示消息-></field-validator></field>l 网址校验器url:要求字符串如果非空,则必须是合法的url地址<field name="url"><field-validator type="url"><message></message><!指定校验失败的提示消息-></field-validator></field>l 转换校

60、验器conversion:检查被检查字段在类型转换过程中是否出现错误。<field name="age"><field-validator type="conversion"><!指定类型转换失败后,返回输入页面依然保留原来的错误输入-><param name=”repopulatefield”>true</message><message></message><!指定校验失败的提示消息-></field-validator></field&

61、gt;l 字符串长度校验器stringlength:被检查字段的长度必须在指定的范围之内<field name="user"><field-validator type="stringlength"><param name=”minlength”>4</param><param name=”maxlength”>20</param><message></message><!指定校验失败的提示消息-></field-validator></field>l 正则表达式校验器regex:被检验字段是否匹配一个正则表达式<field name="user"><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><message></message><!指定校验失

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论