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?

<form-beans>

<form-bean name="loginForm"
type="com.tarena.struts.form.LoginForm"/>

</form-beans>

注: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 中配置
<message-resources parameter=""/>
指向属性文件所在路径

7. 创建 ActionForm, 并在 struts-config.xml 文件中配置 form-bean
在 ActionForm 中,可以指定验证逻辑. 重写 validate 方法
如果验证成功, 把ActionForm 传到Action中的 execute() 方法中
如果失败,则直接跳转到在<action input="xxx.jsp"...>标签中 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标签
<bean:cookie/> cookie
id: 定义一个javax.servlet.http.Cookie类型的变量,存放在page范围
name:指定Cookie的名字
value:指定Cookie的默认值,如果指定的Cookie不存在,就使用此默认值
<bean:header/> header,
id: String 类型,存放在 page 范围
name: 指定要检索的 Header 信息,如; Accept-Language
<bean:parameter/> --- param, paramValues
id: String 类型,存放在 page 范围
name: 指定请求参数名.
value: 请求参数的默认值
multiple: 任意字符, 表示可以接收一个字符数组
<bean:page/> pageContext
id:定义一个引用隐含对象的变量,存放在 page 范围
property: 指定隐含对象的名字,从 application,config,request,response,session中选一个
2.用于访问Web应用资源的Bean标签
<bean:message/>
key: 指定在 资源文件中的key
bundle: 可选
name: 可选
property: 可选
<bean:resource/>
id:
name: 指定WEB资源的路径
input:任意字符.表示结果是字符还是 java.io.InputStream

<bean:struts/>
id:
formbean: <form-beans><form-bean></form-beans>
forward: <global-forwards><forward></global-forwards>
mapping: <action>

<bean:include/> 与 <jsp:include/>相似.

3. 用于定义或输出JavaBean的Bean标签
<bean:define id="" name="" value="" property=""/>
<bean:write/> 输出某个bean或它的属性的内容
<bean:size/> 获得Map 或 Collection 集合的长度


html 标签
<html:errors/> *
<html:messages/> *

<html:html/>
<html:form/>
<html:text/>
<html:password/>
<html:radio/>
<html:checkbox/>
<html:select>
<html:option/>
<html:options />
</html:select>
<html:file/>
<html:link/>

logic 标签
1. 进行比较运算的Logic标签
<logic:equal>
<logic:notEqual>
<logic:greaterEqual>
<logic:greaterThan>
<logic:lessEqual>
<logic:lessThan>
2. 进行字符串匹配的Logic标签
<logic:match>
<logic:notMatch>
3. 判断指定内容是否存在的Logic标签
<logic:empty>
<logic:notEmpty>
<logic:present> 判断指定的安全角色,用户,Cookie,HTTP请求Header
或JavaBean是否存在?
<logic:notPresent>
<logic:messagePresent>
注:当把 message=true,设为true时, name属性指定的值是无效的,
此时它的key=Globals.MESSAGE_KEY.
否则的话,在request中检索,并以name的值为KEY,如果没有指定name,
则默认的属性KEY为Globals.ERROR_KEY
<logic:messageNotPresent>

4. 进行循环遍历的Logic标签
<logic:iterate>

5. 进行请求转发或重定向的Logic标签
<logic:forward>
name指定的值与<global-forwards>中的指定一样
<logic:redirect>
同 <html:link>

tiles 标签
<tiles:insert />
nested 标签

struts Tag 与 JSTL


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

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

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

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

3. 在 struts-config.xml 文件中进行配置:
<message-resources parameter="struts.conf.ApplicationResources"/>

4. 然后在 你的JSP页面中就可以使用: <html:errors/> 或 <html:messages id="" property=""/>, <bean:message/>
标签进行读取了.

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

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

2. 方式二 [申明式 异常处理]。
在Action当中,直接抛出异常
并在struts-config.xml当中来配置这个异常。
如下:
在<action> 标签中 配置一个 <exception key="" path="" type="" scope="" />
来表明如果 Action中的execute方法抛出异常,则由Struts提供的一
个默认的异常处理类: ExceptionHandler 来处理.
<exception 中的四个属性分别代表:
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属性来指定自定义的
异常处理类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值