Struts2知识宝库
struts2 | ||||
参考书 | 《javaweb程序设计与项目实践》古乐声 | |||
版本说明 | 以struts2.3.8为例 | |||
项目配置步骤 | 一、必备的jar文件(这里只针对struts2.3.8版本),导入到\WEB-INF\lib目录,这11个jar文件包括: asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ognl-3.0.6.jar struts2-core-2.3.8.jar xwork-core-2.3.8.jar (若需其它更多功能,可能需要更多的jar文件) 二、影响web.xml:配置核心Filter过滤器类为StrutsPrepareAndExecuteFilter; 三、建立struts.xml:是struts自己的配置文件,主要用于管理业务控制器Action; 其DTD标签<!DOCTYPE…>中的如http://struts.apache.org/dtds/struts-2.1.dtd指定了所用DTD版本 四、编写action类; …… | |||
主
要
功
能 | 实现MVC | Controller:主要指struts.xml文件和action类产生的控制作用 | ||
Model: 主要指action类中的方法去调用的其它业务逻辑相关的组件服务 | ||||
View: 主要指struts.xml文件指定的目标页面 | ||||
类型转换(基于OGNL) | 功能: 页面String与action类属性之间的相互转换 | 内置转换 | 1.String<——>基本数据类型、基本数据类型包装类; 2.String<——>Date 3.request.getParameterValues(…)<——>String[]、基本数据类型[]、基本数据类型包装类[]、Collection<String>、Set<String> | |
自定义转换器 | 步骤如下: 1.自定义转换器类 建议继承Struts TypeConverter类; 也可继承其父DefaultTypeConverter。(更上层接口TypeConverter) 2.注册局部或全局类型转换器 局部:aciton类名-conversion.property文件(aciton类目录) 全局:xwork-conversion. property文件(class目录) 内容:键值对:action类属性名=自定义转换器类名 | |||
类型转换出错时,信息的输出 | 类型转换出错时,程序员应去影响该属性相关的FieldError变量。以便<s:fllederror name= "属性名"/>能输出出错提示。 程序员可以自定义该属性相关的出错提示,即影响FieldError变量。如果程序员没有定义出错提示,系统会自行影响FieldError变量(此时<s:fllederror name= "属性名"/>会输出:Invalid field value for field "属性名")。 1、程序员自定义出错提示,影响FieldError变量的手段 (1)全局定义:所有属性共用一套提示 在class目录下的struts.xml添加: <constant name="struts.custom.i18n.resources" value="国际化资源文件名前缀"></constant> 国际化资源文件名_后缀.properties内容为: xwork.default.invalid.fieldvalue={0}提示信息 {0}会被系统用属性名替代 需用native2ascii命令处理国际化资源文件 (2)局部定义:可专门为某个属性指定出错提示 aciton类名.property文件(aciton类目录) 内容:invalid.fieldvalue.属性名=错误提示信息 2、系统默认影响FieldError变量的办法,会使<s:fllederror name= "属性名"/>输出:Invalid field value for field "属性名" | |||
输入校验 | 自定义校验代码 | action类需继承ActionSupport类,改写validate()方法,执行校验,若要添加出错信息可选用 1.addActionError("")。 (影响ActionError变量) 2.addFieldError("键",值) 。(影响FieldError变量。这会覆盖类型转换出错时对FieldError变量的影响) 这两个方法都会导致跳转到<result name="input">指定的页面。选用哪个要根据需要。 | ||
显示出错信息的方式 | 1.<s:actionerror/> 能取出之前addActionError("")被执行时加入的字符串 2.<s:fielderror><s:param>键名</s:param></s:fielderror> 能取出之前addFieldError("键",值)为键名设置的字符串。多用于表单。 3.表单form的标签整体用struts2的。 (既替代了表单的输入标签,又能回显上次的已输入信息--参见P173,又能显示field的出错信息--参见P175。十分强大。) 如<s:textfield name=”age” lable=”年龄”></s:textfield > | |||
使用校验框架 | 校验规则文件:aciton类名-validation.xml(风格:字段优先和校验器优先) 内置校验器:满足大部分的校验需求。说明文件在xwork-core-x.x.x.jar的 /com/opensymphony/xwork2/validator/validators/default.xml | |||
动态校验 | 略 | |||
拦截 (核心机制) | 自定义拦截器开发步骤 | 一.自己的拦截器类必须扩展 Interceptor接口或Abstract Interceptor类(适配器),改写intercept()。 决定一:如果拦截器欲调用下一个拦截器,则必须 return invocation.invoke()。//将把后续拦截器的结果作为返回值
决定二:如果拦截器欲结束调用后续拦截器,则仅需返回一个String值, 返回值将在struts.xml中的: <result name="String值">/目标页面地址</result> 起作用。该值需使用Action接口的常量,如: SUCCESS = "success";NONE = "none";ERROR = "error"; INPUT = "input";LOGIN = "login";
二.配置struts.xml的拦截参数 1. 拦截器名与拦截器类的关联 <package>下的<interceptors>下的<interceptor> 2. 拦截器栈名与拦截器名的关联 <package>下的<interceptors>下的<interceptor-stack>、<interceptor-ref> 3. 拦截器(栈)名与aciton类的关联 <package>下的<action>下的<interceptor-ref>
三.配置struts.xml的目标页面地址(针对于拦截器的返回值) <result name="String值">/目标页面地址</result> | ||
使用内建拦截器(栈) | 内建拦截器说明文档在:struts-default.xml,其中有很多拦截器可被选使用,当然也包括系统默认拦截器栈defualtStack | |||
系统默认的拦截器(栈)defualtStack | "defualtStack"的功能依次是:…文件上传、…、类型转换、输入校验、…。 欲使用defualtStack,可: 法一:<action>下添加<interceptor-ref name="defualtStack" 法二:把默认拦截器栈"defualtStack"加入到自定义的拦截器栈中 | |||
为多个action类配置默认拦截器(栈) | struts.xml文件中, 在<interceptors>节点后,所有<action>节点前,添加节点: <default-interceptor-ref name="拦截器(栈)"名></default-interceptor-ref> 这样,该拦截器(栈)会拦截所有action请求。 | |||
为拦截器传入参数的时机以及覆盖效果 | 本单元格中,">"是覆盖的意思,"定义"是指在节点<interceptors>下配置拦截,"使用"是指在<action>下使拦截生效。 (a)定义拦截器时 (b)使用拦截器时>a (c)定义拦截器栈时为某拦截器指定param,一旦该栈被使用,就>a; (d)使用拦截器栈时,为其中的某拦截器指定param,就>c; 格式<param name="拦截器名.参数名"> | |||
重要类及对象 | 1.ActionInvocation: 是AbstractInterceptor接口的intercept(ActionInvocation invocation) 方法中的参数,该参数可调用getInvocationContext()来得到ActionContext,接着一步步地去抓取与Servlet有关的各对象。 2.ActionContext:Action运行的上下文;可调用getSession()来得到Action自己的session,该session实际上是一个Map对象。
另外,ActionContext与 ServletActionContext,ActionContext的session与HttpSession的联系,以及互相操作、获取、线程安全性,请见相关资料。 | |||
国际化 |
|
| ||
文件上传 |
|
| ||
struts标签库Taglib |
|
| ||
其它一些知识点 | ||||
1、ActionError其实是ArrayList结构,addActionError("")可以往其中加入很多个字符串。 2、FieldError其实是Map结构,addFieldError("键",值) 可以为某个"键"多次的add值,这些值会自动用换行符连接起来。 | ||||
action类通常去扩展的类/接口:ActionSupport类、Action接口。(其中ActionSupport实现了Action和其它接口) | ||||
配置struts.xml的节点有这些:根<struts>、<package>、<action>、<result>、<interceptors>、<constant>等 | ||||
执行顺序:validate() 在 execute()之前 | ||||
请求既可以是表单提交,也可以是点击链接 | ||||
类型转换失败、输入校验出错(执行了addActionError("")或addFieldError("键",值))、execute()返回input,
都会使页面跳转到<result name="input">指定的页面 | ||||
目标页面取action类属性的办法 (1)EL表达式:${param.属性名} (2)struts标签:<s:property value="属性名"/> | ||||
表单提交信息回显的办法 (1)${param.name名} (2)struts标签如“<s:textfield…>…</s:field>”具有回显功能 |