在培训是辅导给我们将的一个struts1的串讲,最近在修改一个项目,在系统项目中使用的是struts1.3,俗话说"临阵磨枪,不快也光"吗?现在给自己一个时间来再次回顾一下。
一、下载struts1.x
在Apache官网上找到struts的主页,找到struts的下载页面,现在的最新版本是struts-2.0.14-all.zip.将struts1.x下载下来。
二、了解struts1.3x构成
1.struts运行需要的包commons-digester.jar
用于解析配置文件
commons-fileupload.jar
用于实现文件上传
commons-logging.jar
用于日志处理
commons-beanutils.jar
用于pojo的属性赋值
commons-validator.jar
用于表单验证jar包.
2、struts标记库文件(tld)
(1)struts-bean.tld
(2)struts-html.tld
(3)struts-logic.tld
(4)struts-nested.tld
(5)struts-tiles.tld
3、配置文件Struts-config.xml
1
<?xml version="1.0" encoding="UTF-8"?>23struts-config PUBLIC4 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"5 "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">6789101112131415161718192021
4、资源文件 (代码测试)
使用资源文件的步骤:
(1)确认资源文件的jar导入
(2)引入标记库
三、struts1.3x核心控制流程
1。主要组件
.ActionServlet组件:充当struts框架的中央控制器。
.RequestProcessor组件:充当每个子应用模块的请求处理器
.Action组件:负责处理一项具体的业务。
2。ActionServlet
(1)Struts的启动通常从加载ActionServlet开始(如果没有其他Servlet的加载优先级比它高)。ActionServlet在应用一加载时即会被实例化并调用其init方法。
(2)init方法所做的主要工作有:
1)加载struts配置文件,并创建用于封装配置信息的ModuleConfig对象
2)加载资源文件,并创建用于封装资源文件的MessageResources对象。
另外,如果有相应配置的话,init方法还将初始化数据源和PlugIn
注意:
1)如果web.xml有多模块配置,将创建多个ModuleConfig对象和MessageResources对象分别用于封装各个模块的struts配置文件和资源文件。
eg.多模块
1
2config3/WEB-INF/struts-config.xml4567config/ma8/WEB-INF/ma/struts-config.xml91011config/mb12/WEB-INF/mb/struts-config.xml1314 或者1516config17/WEB-INF/struts-config.xml181920config/catalog21/WEB-INF/ma-struts-config.xml222324config/authorize25/WEB-INF/mb-struts-config.xml2627
2)针对各个模块所创建的ModuleConfig对象和MessageResources对象将存储在ServletContext中,对应的属性名中有该模块名称的相应标识。
(3)ActionServlet的process()方法的主要工作有:
1)根据请求信息获知所请求的模块名称,从ServletContext中获得与请求模块对应的的
ModuleConfig对象,并存储到request中。
2)根据模块信息获得相应的RequestProcessor对象,一个模块对应一个RequestProcessor
对象,RequestProcessor对象将关联与所属模块对应的ModuleConfig对象。
3)调用RequestProcessor对象的process方法,将request和response作为参数传递给它。3、RequestProcessor类
(1)Struts框架只允许应用中存在一个ActionServlet类,但每个应用程序模块都有各自的RequestProcessor类实例。
(2)RequestProcessor对象的process方法的主要工作:
1)调用自己的processPreprocess(request, response)方法,该方法不进行任何操作,用于
子类重写扩展其功能。
2)获得与请求地址所匹配的ActionMapping对象,AcionMapping对象用于封装一个特
定acion的配置信息。
3)根据ActionMapping中的配置信息获得ActionForm对象(该对象将缓存到request
或session中),并将表单数据填充到ActionForm中,然后根据ActionMapping的配置决
定是否验证ActionForm,如果验证,将调用ActionForm的validate方法,若其返回的
ActionErros对象中包含ActionMessage对象则表示验证失败,将转向action配置信息input
属性所指示的地址。
4)如果ActionForm无需验证或验证通过将创建并缓存与请求地址匹配的Action对象,
将ActionMapping对象、ActionForm对象、request和response作为参数调用其execute
方法。
5)根据Action对象的execute方法返回的ActionForward对象,将请求转发或重定向到
该ActionForward所封装的地址。
4、Action类
(1)Action类是用户请求和业务逻辑之间的桥梁
(2)ActionServlet对所有的请求作集中的统一处理,每个不同的Action类具体处理不同的请求。
(3)每个Action类都需要实现execute()方法,RequestProcessor类创建一个Action实例后,就会调用其execute()方法。
(4)struts-config.xml:
1
2type=”Action类的名称(包名.类名)”4name=”该Action关联的ActionForm的名称”58attribute=” 缓存ActionForm对象的名称(key),不写key就是name的值”9scope=” 缓存ActionForm的范围(request|session)默认是session”10validate=”是否要验证true|false”1114input=”” 和validate=”true” 联用,表示验证失败后,FC把请求转向的地址15parameter=”” 是一个附加的属性,对于不同的Action可能有不同的意义1617path=””地址必须以“/”开头 redirect=””表示是否重定向/>19… … …202122
5、内置的Struts Action类
(1)目的
1)减少Action类的数目
2)便于代码的维护
(2)DispatchAction
1)特点:
①DispatchAction类是Action类的子类;
②共享同一个Action的路径;
③共享一个ActionForm,多个不同action path,可以在同一个类中。
2)DispatchAction的写法:
1
publicclassMyDispatchActionextendsDispatchAction{23ActionForward login(ActionForm form,HttpServletRequest request,45
HttpServletResponse response,ActionMapping mapping)throwsException{67returnmapping.findForward(“sucess”);89}1011}1213注意:不要覆盖execute()方法
3)DispatchAction的配置文件:
1
23456
注意:parameter属性是和表单中隐藏域的名字相对应的
4)DispatchAction页面:
(3)MappingDispatchAction
1)特点:
①MappingDispatchAction类是DispatchAction的子类
②可以匹配多个action路径
③可以不共享同一个ActionForm
2)MappingDispatchAction的写法
1
publicclassMyMappingDispatchActionextendsMappingDispatchAction{23ActionForward login(ActionForm form,HttpServletRequest request,45
HttpServletResponse response,ActionMapping mapping)throwsException{67returnmapping.findForward(“success")89}1011}1213
3)MappingDispatchAction的配置文件
parameter=“login">
注意:parameter属性是指定调用方法的名字
4)MappingDispatchAction页面
注意:在JSP页面中不需要再使用隐藏域来传递参数了,在form中的action就可以
直接使用xxx.do匹配了。
(4)LookupDispatchAction
1)特点:
①LookupDispatchAction类也是DispatchAction类的子类。
②解决一个表单的多个同名提交按钮的问题。
③通过使用资源文件,用submit按钮的value来作为资源文件中的key所对应的值,通
过这个值来找到对应的key,再使用这个key来获得指定Map中所对应的值,这个值就
是要调用的方法名。
注意:在继承LookupDispatchAction时,要覆盖getKeyMethodMap()方法,并定义Map,
向Map中放入指定的键值对。
2)LookupDispatchAction的写法
1
publicclassTestLookupDispatchActionextendsLookupDispatchAction{23publicActionForward login(ActionMapping mapping, ActionForm form,45
HttpServletRequest request, HttpServletResponse response)throwsException{67returnmapping.findForward("success");89 }1011publicActionForward register(ActionMapping mapping, ActionForm form,1213
HttpServletRequest request, HttpServletResponse response)throwsException{1415returnmapping.findForward("register");1617 }1819
publicMap getKeyMethodMap(){2021 Map map=newHashMap();2223//key 为资源文件的key 值,value 为action 中的方法名。2425 map.put("submit.login","login");2627 map.put("submit.register","register");2829returnmap;3031 }3233}3435
3)LookupDispatchAction资源文件
MessageResource.properties文件中
submit.login=login
submit.register=register
4)LookupDispatchAction的配置文件:
1
2345678911type="action.TestLookupDispatchAction"parameter="submit">121314151617181920212223
5)LookupDispatchAction页面:
1
3styleClass="lookupForm">45 userName:
67 password:89
10111213141516171819202122232425
注意:页面中的property="submit"与struts-config.xml中action的parameter元素值相同
四、ActionForm
1、为什么使用form?
(1)用户提交的数据封装成对象
(2)表单数据的缓存。
(3)表单信息验证(服务器端验证)
2、ActionForm的生命周期
(1)ActionForm Bean有两种存在范围:request和session
1)如果存在于request范围,它仅在当前的请求/响应生命周期中有效
2)如果存在于session范围,同一个ActionForm实例在整个Http会话中有效
注意:在struts配置文件中,元素的scope属性用来设置ActionForm的范围,
默认值为session。
3、配置ActionForm
(1)action和form的关系是:一对多
(2)struts-config.xml
… … …
(3)在某一个Action的配置中可以写:
4、Form验证
(1)验证:
1)表单级验证:(不访问数据库)
①JavaScript做的是客户端验证,可以减少服务器端的负担,但不够安全
②在服务器端的Form验证避免跳过客户端的校验
2)业务逻辑验证:
由Action负责完成
(2)validator()方法
1)调用的条件:
①Form继承ActionForm,并且为ActionForm配置了Action映射,即元素的name属性和元素的name属性匹配。
②元素的validate属性为true
2)validate()方法
该方法返回ActionErrors对象,如果返回的ActionErrors对象为null,或者
不包含任何ActionMessage对象,就表示没有错误,数据验证通过。如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误。
3)validate()方法主要负责检查数据的格式和语法,而不负责数据是否符合业务逻辑。
(3)Validator框架(验证框架)
1)validate()方法验证的局限性:
①必须通过程序代码来实现验证逻辑,如果验证逻辑发生变化,必须重新编写和编译
程序代码
②当系统中有多个ActionForm Bean,并且它们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm Bean进行重复编程,完成相同的验证逻辑,这会降低代码的可重用性。
2)主要依赖的jar文件:
①jakart-oro.jar:提供了一组处理文本的类,具有文本替换、过滤和分割等功能
②commons-validator.jar:提供了一个简单、可扩展的验证框架,包含了通用的验证方
法和验证规则。
3)条件:
①validator-rules.xml validation.xml
②struts-config.xml写plug-in
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
③Form必须继承ValidatorForm(ActionForm子类)
4)validator-rules.xml中规定了常见的验证需求。一般不需要改变。
5)validation.xml是form验证的配置文件。
切记:Validator框架不能用于验证标准的ActionForm类。如果要使用Validator框架,
应该采用ActionForm类的两个子类:DynaValidatorForm(支持动态ActionForm)和ValidatorForm(支持标准ActionForm)。
5、动态ActionForm
(1)ActionForm的缺点:表单的改动会触发FormBean的大量改动(应用程序停器,而且
FromBean维护量大)。
(2)动态FormBean是指,Struts已提供给我们DynaActionForm(是ActionForm的子类),我们只需通过配置文件进行配置。
(3)DynaActionForm的写法:
①struts-config.xml
type="org.apache.struts.action.DynaActionForm">
注意:Type表示属性类型,注意若为基本类型时要用其包装类。
type="action.TestDynaActionFormAction" scope="request">
path="/jsp/testDynaActionForm_success.jsp">
②TestDynaActionForm.jsp
测试DynaActionForm
姓名:
年龄:
③TestDynaActionFormAction.java
public class TestDynaActionFormAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping,
ActionForm form,HttpServletRequest request,
HttpServletResponse response) throws Exception {
DynaActionForm daf = (DynaActionForm) form;
String name = (String)daf.get("name"); //取daf中的值
Integer age = (Integer)daf.get("age");
System.out.println("name:" + name + " <===> age:" + age);
return mapping.findForward("success");
}
}
④testDynaActionForm_success.jsp(取DynaActionForm的值)
测试动态ActionForm
姓名:${dynaActionForm.map.name }
年龄:${dynaActionForm.map.age }
(3)访问动态ActionForm与访问普通ActionForm的最大区别:属性的访问方式不同。
1)普通ActionForm——getter setter方法。
2)动态ActionForm——DynaActionForm把所有属性保存在Map中。
public Object get(String name)
public void set(String name, Object value)
注意:DynaActionForm的校验不太方便。需要继承DynaActionForm,但是写了代码又不能满足动态的功能了。
五、异常处理:
1、处理流程:
(1)Actionthrow Exception
(2)Action ServletExceptionHandler
(3)ExceptionHandler处理Exception ExceptionHandler会读配置文件
ActionMessage -> request Attribute
ActionForward
(4)ActionServlet ActionForward
2、配置struts的异常处理
全局的异常处理
....
在exception标签中的key,也就是在出现异常时会封装在ActionErrors中,也就是可以在页面中使用。
ActionError(String key, Object value0),可以通过在构造ActionError时,指定不同的key值来对异常进行分类,并且在html:error标签的自己构造ActionErrors并使用下面的方法发送void saveErrors(HttpServletRequest request,ActionErrors errors)这个方法用以把封装了异常的ActionErrors的key存储到request中。
六、Struts标签库
1、html标签库
(1)
对应html中的,使用会将表单中的属性自动封装成Form,他的action属性可以直接写struts的配置文件中的path(2)、、、、
、、、、
以上者写标签的使用是和html中的form相对应的。
(3)这个标签用来表示一组选择项
java.util.ArrayList list=new java.util.ArrayList();
list.add(new org.apache.struts.util.LabelValueBean("show value","value"));
list.add(new org.apache.struts.util.LabelValueBean("show value1","value1"));
pageContext.setAttribute("vlauelist" list);
%>
2、Bean标签库
(1)bean标签库,是用来访为JavaBean的属性或者是为Bean的属性赋值,创建JavaBean,类似于JSP中的jsp:useBean动作的功能。
(2)bean标签库中的标签中大部分都有以下的属性:
1)id="xxx"指定Bean的名字标识,Bean在被读出后将引用保存在以这个id命名的对象中,也就是在JSP中使用的变量的引用。
2)name="xxxx"指定要读取Bean的名字
3)property="xxxx"
4)scope="page|request|session|application"
(3)资源读取标签
1)读取资源文件
2)使用这个标签可以对Cookie进行操作
3)读取header信息
eg.
if(testcookie.getValue.equals("emptyValue")){
javax.servlet.http.Cookie cook=
new javax.servlet.http.Cookie("/taglib/beancookie","taglib cookie");
cook.setComment("test");
cook.setMaxAge(3600);
response.addCookie(cook);
}
%>
(4)将资源写到页面的标签
1)将Bean的属性加入到输出流中
name属性是要加入的资源,也就是先前在其他资源标签中的
id属性定义的名字
2)定义变量
eg.
3)读取消息,可以根据key读取消息。
eg.
posted on 2010-05-05 01:22 ohgrateboy 阅读(708) 评论(0) 编辑 收藏 所属分类: struts框架