1.Struts1和Struts2区别和联系
本质上是不同的框架,...
servetAPI 解耦 ActionContext
ServletActionContext
2.Struts2 action
2.1 可以使用POJO作为请求的处理Action对象;
2.2 可以实现Action接口,但相比POJO只是提供编码的规范度;
2.3 可以集成ActionSupport类,ActionSupport为action提供更多的Struts2请求处理的特性;
此外,通过实现ServletRequestAware接口,可以让Struts2注入一个ServletRequest对象,使用到HttpServletRequest的特性;
2.4 Struts2提供多种Action访问定位到方法的机制
2.4.1 在Struts.xml配置Action中,使用 method="useReqLgn"指定请求到useReqLgn()方法;
2.4.2 通过在页面请求的URL中,使用"!"连接请求的Action和具体的方法名:namespace/Action!MethodName.action;
2.4.3 可以使用dmi的动态方法解析执行的方式,是在Struts.xml配置Action中使用*占位符,被替换的位置使用{*num},Struts.xml配置Action配置信息可以被jsp页面的url参数替换;
2.5 在Action或Interceptor中对Struts2上下文(ActionContext)的使用,包括访问request、session等作用域的机制(封装成了Map集合)
3. Struts.xml配置文件package的基本参数:name、namespace、abstract、extends 的含义
4. struts的action中绑定页面值到属性的方法
4.1 基本方式:属性同名表单自动绑定
4.2 使用javaBean的模式转换
4.2 使用struts2的模态转换器,实现ModelDriven<T>接口
5. struts拦截器
5.1 基本工作原理:有中心控制器(Filter)StrutsPrepareAndExecuteFilter去根据配置调用拦截器处理请求;
5.2 常见的系统拦截器,在struts-core-2.x.x.jar中struts-default.xml去查
5.3 自定义拦截器:
5.3.1 继承于AbstractInterceptor拦截器拦截整个action对象中的所以处理请求的方法
5.3.2 继承于MethodFilterInterceptor的拦截器可以通过<param>参数excludeMethods/includeMethod指 定被过滤的方法名
5.4 拦截器执行的顺序
5.5 拦截器以及拦截器栈的配置与引用
5.6 在拦截器处理方法中的(ActionInvocation arg0) ActionInvocation对象的使用
6. struts2 返回值类型
常用
6.1.dispatcher
--应用服务器跳转,forward到一个页面jsp、html、freemarker
6.2.redirect
--response.redirect
6.3.chain
--应用服务器跳转,forward到一个Action,如果是转发的别的包下,
需要配置两个参数:
<!-- 跨package的action链导航时,只需添加namespace和actionName两个参数 -->
<param name="namespace">othrsp</param>
<param name="actionName">stk04</param>
struts2.1与struts2.2的区别:Action1--(过完所以拦截器后)-->Action2,
在2.2中Action1---->Action2--->(过完所以拦截器)
6.4.redirectAction
--response.redirect到另一个Action
6.5.stream类型
--用于文件的下载:
6.1.在struts.xml中配置的action :type="stream"
<result name="down" type="stream">
6.1.2. <!-- 处理流的方法:inputName代表处理流的方法的getter的名字 -->
<param name="inputName">inptFile</param> --inptFile对应的getter为--> InputStream getInptFile()
6.2. 所以流的处理都在action的getInptFile()方法中写定
return new FileInputStream(new File("C:/tmp/"+fname));
6.3. 在action处理请求的方法中设置中文文件名:
ServletActionContext.getResponse().setHeader("Content-Disposition", "attachment; filename="+new String(fname.getBytes("GBK"),"iso-8859-1"));
6.4.在页面上正确传递请求下载的文件名到action的fname属性
--上传文件
--上传文件使用Struts2提供的拦截器
6.1.页面上使用post提交表单,表单编码为多媒体:multipart/form-data,被上传的文件使用input-file类型
6.2.在action 使用一个File或一个File[]封装表单的file类型;
2.1 在action的处理请求的方法上使用输入、输出流处理文件
6.3.写配置struts.xml
6.3.1设置 <!-- 设置struts2上传总文件的大小50M,默认只有2M -->
<constant name="struts.multipart.maxSize" value="52428800" />
6.3.2在处理请求的Action上应用fileUpload拦截器(如果是多方法的Action,注意使用includeMethods参数指定需要拦截的方法),记住添加上默认的completeStack拦截器栈
<!-- 配置负责上传的Struts2拦截器 ,只对upload方法拦截-->
<interceptor-ref name="fileUpload">
<param name="includeMethods">upload</param>
<!-- 单个上传文件的大小为30M -->
<param name="maximumSize">31457280</param>
</interceptor-ref>
<interceptor-ref name="completeStack"/>
7--Struts_html-lable
form的主题theme:
simple:simple主题里的模板把UI标签翻译成最简单的Html对应元素,并忽视行标属性
xhtml:默认,使用一个布局表提供了一种自动化的排版机制。
css_xhtml:很像xhtml.使用css来进行排版和布局
ajax:以xhtml为基础,增加了高级的Ajax功能.
<s:checkboxlist/> 标签的使用:
1.在页面上使用list="{... }"
2.在页面上使用action的属性List<String>集合
3.在页面上使用action的属性List<javaBean>集合,使用listkey,listValue属性
<s:radio/>标签的使用:
1.在页面上使用list="#{'k':'v',...}"键值对
2.在页面上使用Action的Map属性里的键值对
<s:select/>标签的使用
1.在页面上使用list="#{'1':'v','2':'v',...}"键值对
2.在页面上使用action的属性List<javaBean>集合
3.在页面上使用action的静态Map<Integer, String>键值对,并使用
<s:optgroup/>做缩进选项
<s:doubleselect/>标签做级联下拉单
注意 name和doubleName的区别以及
list="{'中国', '美国', '法国'}" 和
doubleList="top == '中国' ? {'北京', '上海', '广州'}:(top==''?{...}... : '默认值')的
语法,在三元运算符中 第一个“:”后---->结束有"()";
8. Struts2的验证器:
8.1 重写ActionSuport的validate()方法
可以this.addActionError(String errmsg)方法添加错误信息;当然错误信息可以this.getText("消息资源文件的key")去取国际化错误消息。
8.2通过配置xwork的验证器直接使用现有的验证器
1.创建一个与Action同名+"-validation.xml"验证配置文件;
2.在验证配置文件中去调用com.opensymphony.xwork2.validator.validators的default.xml配置的验证器
3.在配置验证器的时候,可以<message>${getText(消息资源文件的key)}</message>去取国际化错误消息。
8.3显示错误信息可以使用 <s:actionerror>和< s:fielderror>标签
可能性错误: struts2.2与struts2.1的区别:default.xml文档定义改成:1.0.2
9.Token 防止表单重复提交
9.1 需要在表单请求页面 <s:token/>标签
9.2 在配置struts.xml中action时添加 <interceptor-ref name="token">拦截器
9.3 在配置struts.xml中增加一个错误导航:<result name="invalid.token">....</result>
9.4 可以修改token默认错误消息,在消息资源文件中添加struts.messages.invalid.token
10.转换器
10.1 可以直接使用Struts2提供的默认数值转换器以及日期转换器;
10.2 也可以通过继承StrutsTypeConverter自定义验证器,重写String-Object/Object-String两个方法即可;
10.3开发好转换器后需要配置使用:
10.3.1 局部Action使用的转换器:【被使用的action名称】-conversion.properties
Action中属性名=转换器名称(包名+类名)
10.3.2 全局转换器
在src[classpath]下创建xwork-conversion.properties中配置:
【实体对象名】 = 转换器名称
通过这样配置,当系统中的任意Action使用【实体对象名】申明属性时,就好默认调用该转换器。
11.国际化I18n
I18n拦截器是默认拦截器栈中的拦截器。
页面通过html类标签的key属性直接可以取得消息资源文件的值;
纯文本信息可以使用<s:text name="key">取得消息资源文件的值;
在action中可以使用ActionSuport的getText("key")取得消息资源文件的值;
在struts配置文件中可以使用${getText(消息资源文件的key)}取得消息资源文件的值;
Struts2中可以通过ActionContext.getContext().setLocale(Locale locale)设置浏览器的默认语言。
可能性错误: struts2.2与struts2.1的区别:submit标签 的key不能使用"."命名
或: ognl.OgnlException: source is null for
getProperty(null, "point.exec.sbmt.key")的 解决办法 . 添加name="submit"
12.Exception处理
在struts2中出现的异常可以通过配置
<exception-mapping result="error"
exception="java.lang.ArithmeticException"></exception-mapping>
来指定什么Exception有哪个result处理,result的值将有系统去匹配完成出错时的导航。
通过这样的配置机制,我们在开发时可以同时抛出特定异常由不同的页面/action链完成错误处理。
13.Action的配置
可以使用org.apache.struts2.convention.annotation.*;下提供的annotation配置Action达到跟xml配置一样的效果;
使用元数据方式时注意:com.yu.action包名要以action结尾!!!