Struts1.x 学习笔记系列

###########################################
## Date: 2007-11-12
## Description: Struts FrameWork day2
## Author: yejf
############################################

如何开发一个Struts 的 ActionForm?

1. 继承于org.apache.struts.action.ActionForm 类

2. 依据请求页面中的form的表单项来写对应的属性

3. 提供默认构造方法和 setter/getter 方法.


如何在 struts-config.xml 文件当中来配置自定义ActionForm?



type="com.tarena.struts.form.LoginForm"/>



注:ActionForm Bean 又叫值对像: VO [Value Object]
它只负责封装请求参数,不做任何的业务相关的动作

POJO: 又叫业务对像: BO [Bussiness Object]
它对应数据库. 后台处理

所以,中间会有一个: BO <==> VO 的互相转换
public class Converter {
public static BO converter(VO vo) {
BO bo = new BO();
bo.setUname(vo.getUname());
bo.setPwd(vo.getPwd));
}
}

----------------------------------------------------
开发一个 完整 Struts 基本应用的步骤:
1. 建立一个WEB应用的目录层次结构

2. 拷贝 $STRUTS-HOME/lib/*.jar 到你的应用的 /WEB-INF/lib 目录下, 并把 *.tld 也拷贝到 /WEB-INF 目录中
如果要使用 struts 标签和EL, 请拷贝 $STRUTS-HOME/contrib/struts-el/lib/*.jar 到你的应用的 /WEB-INF/lib 目录下
*.tld 文件也要拷贝到 /WEB-INF 目录下.

3. 修改 web.xml 文件, 配置一下 Struts的 ActionServlet

4. 再写一个文件 struts-config.xml

// 可选 操作
5. 写一个属性文件, 用来实现国际化,
类似与 JSTL中的 fmt 操作

6. 在struts-config.xml 中配置

指向属性文件所在路径

7. 创建 ActionForm, 并在 struts-config.xml 文件中配置 form-bean
在 ActionForm 中,可以指定验证逻辑. 重写 validate 方法
如果验证成功, 把ActionForm 传到Action中的 execute() 方法中
如果失败,则直接跳转到在标签中 input属性值.

方法调用顺序: 查找或创建 Form, (如果有的话,就不再创建了)
[首先在当前的session范围查找name所指定 attribute, 如找到,就直接返回。
否则,创建一个ActionForm Bean对像,并且把它绑定到scope所指定的范围

再调用 reset 方法
再调用相应的 set 属性方法
最后调用 validate 方法进行验证
=============================================
For each ActionForm bean defined in struts-config.xml file, Controller (ActionServlet)will
Check session scope for an instance of ActionForm bean if the form bean saved as a session scope attribute
If not exists, controller creates one and save it as a corresponds scope attribute
Call corresponding setter method of ActionForm bean for every request parameter whose name corresponds to the name of a property of the bean
If validation required, controller call validate
If validation is correct, controller pass the updated ActionForm bean as a parameter to execute() method of Action class
If validation failed, controller dispatch request to the input jsp

8. 创建自定义的 Action 类, 并在它的 execute 方法中
调用业务逻辑方法. 并catch 业务异常, 做出相应的回应

9. 在struts-config.xml文件中配置 action

10. 重启服务,进行测试


注意事项:
===============================================================================================
如何保持多线程安全?
Struts Action 同Servlet一样,也存在着线程安全问题.
在内部,Struts会维护并重用ACTION 实例去服务于请求.
Action's execute( )方法极可能是同时被多个并发请求线程共享,
你也许想尝试去同步execute() 方法,但是应该避免这种尝试,
因为同步execute() 方法 将大大降低执行效率. (因为有很多业务方法是没有同步问题的.)
所以说:在你的应用中,你需要同步的行为,但最好在服务层(业务层[biz/service] 来执行同步.
=====================================================================================


=================================
chapter 04: Struts Tag Library
struts 中有五大类的标签:
bean 标签
1.访问HTTP请求信息或JSP隐藏对象的Bean标签
cookie
id: 定义一个javax.servlet.http.Cookie类型的变量,存放在page范围
name:指定Cookie的名字
value:指定Cookie的默认值,如果指定的Cookie不存在,就使用此默认值
header,
id: String 类型,存放在 page 范围
name: 指定要检索的 Header 信息,如; Accept-Language
--- param, paramValues
id: String 类型,存放在 page 范围
name: 指定请求参数名.
value: 请求参数的默认值
multiple: 任意字符, 表示可以接收一个字符数组
pageContext
id:定义一个引用隐含对象的变量,存放在 page 范围
property: 指定隐含对象的名字,从 application,config,request,response,session中选一个
2.用于访问Web应用资源的Bean标签

key: 指定在 资源文件中的key
bundle: 可选
name: 可选
property: 可选

id:
name: 指定WEB资源的路径
input:任意字符.表示结果是字符还是 java.io.InputStream


id:
formbean:
forward:
mapping:

相似.

3. 用于定义或输出JavaBean的Bean标签

输出某个bean或它的属性的内容
获得Map 或 Collection 集合的长度


html 标签
*
*














logic 标签
1. 进行比较运算的Logic标签






2. 进行字符串匹配的Logic标签


3. 判断指定内容是否存在的Logic标签


判断指定的安全角色,用户,Cookie,HTTP请求Header
或JavaBean是否存在?


注:当把 message=true,设为true时, name属性指定的值是无效的,
此时它的key=Globals.MESSAGE_KEY.
否则的话,在request中检索,并以name的值为KEY,如果没有指定name,
则默认的属性KEY为Globals.ERROR_KEY


4. 进行循环遍历的Logic标签


5. 进行请求转发或重定向的Logic标签

name指定的值与中的指定一样



tiles 标签

nested 标签

struts Tag 与 JSTL


操作技巧: 请直接使用 uri 来绝对定位,不再使用如下的方式

为防止在 /WEB-INF 目录中存在过多的文件,可以把struts相关的*.tld
文件存放在一个子目录中,这样方便管理和维护
在 web.xml 文件中 加入以下的 配置
...

/WEB-INF/struts-html.tld
/WEB-INF/struts/struts-html.tld

...

=================================================
chapter 05: Internationalization I18N 国际化支持
步骤:
1. 创建一个属性文件, ApplicationResources.properties

2. 然后为你要支持的各种语言提供一个 ApplicationResources_xx.properties
文件,注意,此文件要使用 native2ascii 命令转换成 unicode 编码格式.
xx 代表第一种语言的代号,如 zh 表示中文. en 表示英文.

3. 在 struts-config.xml 文件中进行配置:


4. 然后在 你的JSP页面中就可以使用: ,
标签进行读取了.

=========================================

四,异常处理
业务逻辑的验证
1. 方式一 [编程式]
自已在 Action当中来做,生成 ActionMessages
并调用 saveErrors 方法来完成

2. 方式二 [申明式 异常处理]。
在Action当中,直接抛出异常
并在struts-config.xml当中来配置这个异常。
如下:
标签中 配置一个
来表明如果 Action中的execute方法抛出异常,则由Struts提供的一
个默认的异常处理类: ExceptionHandler 来处理.
key: 在资源文件中配好的一个KEY,用来指定产生异常的字符串
type: 在execute 方法中抛出的异常类型
path: 需要跳转去的页面
scope: 产生的异常信息存放的范围

Struts异常处理的分析?
Struts提供了一个默认的异常处理类:
ExceptionHandler
它有一个 execute 方法,如下:
public ActionForward execute(
java.lang.Exception ex,
ExceptionConfig ae,
ActionMapping mapping,
ActionForm formInstance,
HttpServletRequest request,
HttpServletResponse response)
throws javax.servlet.ServletException


1. ActionServlet
| RequestProcessor
-----> .process(request,response)
| . . .
| processActionPerform
----------> Action
| .execute 方法
--------|
|抛出异常
|
<----------------------------------
\ RequestProcessor会使用Struts提供的
| 默认的异常处理类:ExceptionHandler
| 并且调用它的execute方法来处理异常
|--------
.processException
.getExceptionHandler
.execute

开发一个自定义的异常处理类:

1. 继承于Struts的默认的异常处理类:ExcpetionHandler

2. 重写execute 方法

3. 在配置异常时,使用 handler属性来指定自定义的
异常处理类

你可能感兴趣的:(SSH)