antlr-2.7.2.jar commons-beanutils-1.6.jar commons-chain-1.1.jar commons-logging-1.0.4.jar commons-logging-api-1.1.jar commons-validator-1.3.0.jar freemarker-2.3.8.jar ognl-2.6.11.jar oro-2.0.8.jar struts-core-1.3.5.jar struts2-codebehind-plugin-2.0.11.1.jar struts2-config-browser-plugin-2.0.11.1.jar struts2-core-2.0.11.1.jar struts2-jasperreports-plugin-2.0.11.1.jar struts2-jfreechart-plugin-2.0.11.1.jar struts2-jsf-plugin-2.0.11.1.jar struts2-pell-multipart-plugin-2.0.11.1.jar struts2-plexus-plugin-2.0.11.1.jar struts2-sitegraph-plugin-2.0.11.1.jar struts2-sitemesh-plugin-2.0.11.1.jar struts2-spring-plugin-2.0.11.1.jar struts2-struts1-plugin-2.0.11.1.jar struts2-tiles-plugin-2.0.11.1.jar tiles-api-2.0.4.jar tiles-core-2.0.4.jar tiles-jsp-2.0.4.jar xwork-2.0.4.jar
commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar struts2-core-2.0.11.jar xwork-2.0.4.jar
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <include file="example.xml"/> <!-- Add packages here --> </struts>
struts.xml 位置:classes下 配置 Action
struts对配置的组织结构 类似于java package 属性: * name : 包的名字,唯一标示 extends: 继承 namespace:命名空间 abstract: 抽象申明
1 default namespace "" 2 root namespace "/" 3 action 搜索的顺序 当前namespace ---一级一级向上搜索 Web应用的请求路径被视为namespace 4 访问 /aaa.action的时候的搜索的顺序 "/" ---> "" 5 namespace 没有目录信息 6 package 包含0 - N 个 action <pre> ;Action:<pre> name: 唯一标示 name.action ---> action name class:实现类 继承actionsupport的类 method:调用方法 动态调用的方法名称
name: 用来匹配action的返回值 type: 是result-type 进行预定义的/自定义的 常用dispatcher,转发 <result-types> <result-type name="dispatcher" class ="" default="true" ></result-type> </result-types> 特殊位置: <global-results> <result name=""></result> .... </global-results> 特殊参数: <result name="next_opertor" >${var_name}</result> var_name 必须是action里面的一个私有属性,并且有get/set方法 必须符合bean的命名规则: 小写开头 set/get大写开头的属性
只能放在struts 标签的下一级 用来引入其他的struts配置文件 file = " " 被他引入xml文件是一个标准的struts配置
interceptors = > 拦截器
<interceptors> <interceptor name="" class=""/> <intercptor-stack name=""> <interceptor-ref name=""/> <interceptor-ref name=""/> </interceptor-stack> <interceptors> <default-interceptor-ref name=""> <action。。。。。。> <interceptor-ref name="" />
<constant name="" value="" /> 可以完成 struts.properties 所完成的工作 可以完成 constant 所完成的工作
struts.properties
配置struts特性(动态方法调用,虚拟机)
struts-default.xml struts...jar里面,----〉零配置 struts-default.vm 模板
注册Interceptors: <interceptors> <interceptor name="name_1" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> ....... </interceptors> 注册Interceptor-stack: <interceptor-stack name="stack_name_1"> <interceptor-ref name="name_1"/> ....... </interceptor-stack> 使用Interceptor-stack 在package中定义 : <default-interceptor-ref name="stack_name_1"/> 在Action中定义 <action .......> <interceptor-ref name="stack_name_1"/> </action> <pre> ##系统自带拦截器 ###Alias Interceptor ####转换参数名,内容不变<pre> name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"
name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"
name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"
name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"
name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"
name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor"
name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"
name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"
name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"
基本的 struts2的 類庫 (commons-logging-1.0.4.jar日志記錄 ,freemarker-2.3.8.jar 模板實現 ,ognl-2.6.11.jar onnl語言支持 ,struts2-core-2.0.11.jar struts2的核心類庫,xwork-2.0.4.jar struts2的基礎類庫) apache upload 組件 (commons-fileupload-x.xxxx.jar) apache io 組件 (commons-io-x.xx.xx.jar)
;struts.properties : 在該文件中需要修改臨時文件存儲路徑,文件的大小 struts.multipart.saveDir= /upload 保存目录,值得是realpath struts.multipart.maxSize=209715200 上传文件的大小限制 struts.multipart.parser=jakarta 解析上传文件信息(multipart/form-data, 上传文件时的form数据类型一定是这种情况) ;struts.xml : 在该文件中配置文件类型,以参数的形式放置在fileUpload拦截器引用中 <interceptor-ref name="fileUpload"> <param name="allowedTypes"> image/png,application/pdf </param> </interceptor-ref>
在Action 中,直接使用 MultiPartRequestWrapper 来获取上传的文件及参数 (文件上传的时候 , 通过正常的参数获取渠道---params拦截器无法的到我们需要的参数,因为该拦截器无法解析multipart 类型的请求) 这个时候 我们通过ServletActionContext得到的Request本身就是一个MultiPartRequestWrapper的实 例,我们通过前置类型转换的到该对象。 multipartInfo.getParameter("") 得到我们需要的普通参数 multipartInfo.getFiles(""); 得到我们需要的文件对象(但我们得到该文件的时候,文件 已经被上传,并且保存在struts.properties中所定义的目录中,该 Request被返回给客户端的时候, 临时文件会被删除)
struts.custom.i18n.resources 定义文件名称(包含路径信息,包含路径信息的时候,路径的分隔符用.) struts.locale=zh-cn 定义缺省的Location 实际读取的文件: 文件名称+Locale的值+.properties 如果该文件找不到,会读取 文件名称+.properties 如果该文件依旧找不到,显示key的值 在所有的struts ui tag(用于界面显示的标签 都有一个key属性,可以直接读取消息文件中key对对应的值 当出现非ASCII CODE的时候,我们需要 先使用本地语言编码编写文字内容,然后使用jdk提供的 native2ascii工具转码,成为iso8859-1编码的文本文件,否则会出现乱码,该操作与IDE(Eclipse)所设 定的缺省字符集,文件字符集等 无关
在struts中的Text标签也是调用该方法 在Action中的父类ActionSupport中已经定义了该方法,可以直接使用 在Action中(不包含jsp页面、模板页面),不需要定义package.properties文件,但是可以直接读取该文件中的key-value对应信息, package.properties 局部消息文件 struts.custom.i18n.resources 全局消息文件 定义了局部消息文件后,局部消息文件会首先被读取。 文件名的定义不变 filename_local.properties
参数是 java.util.Locale的实例 设置方式: ActionContext.getContext().setLocale(locale参数) 可以通过其它方式来设定locale,或者自我实现,但都不是Struts2的实现方式。
引用文件的字符集 (jsp有三个: jsp自己 两个:contentType中的charset和 pageEncoding, html 一个: meta 中的contentType中的charset,模板文件根据模板实现不同,但是与jsp方式类似),预定义不符合,或者三个字符集不一致。 服务器返回给客户端的数据编码与客户端请求不符合 消息文件本身是乱码:不一定是编写的乱码,而是读取的时候使用的字符集与文件本省的字符 集不一直,缺省情况下读取的时候使用操作系统自己的缺省字符集读取,单独xp本身就有四种(其中三种是unicode,unicode的不同类型互补兼容--ASCII例外) 解决方式: 1、转码或过滤器,可以注册使用apache提供的字符集过滤器() 2、更新本地消息文件字符集、编码内容,(另存为新的字符集文件 转成新的字符集编码的文件 或者使用 java提供的 native2ascii转换成iso8859-1的字符集) 3、修改jsp/模板文件中的有关字符集定义,如果jsp自己定义的两个charset不一直,编译本身就会出错,只需要修改一致,如果修改一致后依旧是乱码,可以一起替换成新的字符集 事实上,会涉及字符集只有:utf-8 / iso8859-1 / gbk CJK字符集 : 中日韩 字符集 JPN-xxxx;外包项目开发的时候才会遇到
返回的错误集合以 key为 "fieldErrors"的一个数据对象保存在request中,如果使用模板技术, 该错误信息会显示在该控件的下部(具体位置由模板控制),如果不使用模板技术,我们可以使用Struts2 Tag 读取"fieldErrors"的值进行显示.
校验代码: 配置文件struts.xml中的Action必须要有<result name="input"> </result> 校验代码中需要有 addfieldError方法(尽量在该方法中使用I18N代码,以方便国际化显示,因为这段代码是硬编码,不便于修改) 需要添加 @Override public void validate() { addfieldError(....); } 方法到Action中,所有的验证操作在该方法中实现.
Struts field user.name user.password ----> 在action中寻找一个属性,名称为user if find set user.name to user.name's value set user.passwordto user.name's password else DEBUG:打印消息 -----> After Find it: 数据类型转换: 得到属性 user的实例 (如果为null,通过class创建实例,注意field对应的类、bean需要包含无参构造方法) 调用set方法,给该对象赋值 【在这个地方完成数据类型转换】 【在这个地方完成数据类型转换】 基本数据类型 <----> String 引用数据类型 <----> String 比如: 在数据类型转换中,Date需要单独处理,原因是格式的问题: Date 请求的 Locale 对应的 DateFormat 的 short 格式 手动转换类型(日期): 转换方式, 1 重写Struts的 StrutsTypeConverter 2 注册在Struts中 ActionName-conversion.properties [针对Action] xwork-conversion.properties [针对Struts App] 3 非 Struts 类型自定义转换 @interface,就是jdk5之后的注释 在程序中注册过的日期类型可以自动被调用,无需干涉。
class A implement x class B implement x interface x xxxFactory xxxFactory.get(parameter);
在调用之前,被调用的类是未知的。
在这种方式的基础上 使用接口实现的形式对已经实现的类进行非浸入方式的注入,从而达到不修改实现类的情况下完成比原有代码更多的工作,直接后果就是延缓接口的实现,在接口实现之前可以添加代码。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean id="" class=""> <property name ="Field_Name" > <ref local ="another_bean_id" /> </property > <property name ="Field_Name" > </propertie> </bean> </beans>
<action name="CatchIocDataMethod" class="com.baoding.Action.CatchIocDataMethod"> 成為: <action name="CatchIocDataMethod" class="ActionClassId in ApplicationContext">
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> </context-param>
【struts.properties】 struts.objectFactory = spring //去掉改行注釋 【struts.xml】 <constant name="struts.objectFactory" value="spring" /> 所有的在struts.properties文件中出現的常量都可以使用這種方式在struts.xml中進行覆蓋
Initializing Struts-Spring integration ** struts2-spring-plugin 被使用后的提示信息 Bean factory for application context ..... Spring Ioc容器成功初始化后的信