《传智博客struts开发.ppt》由会员分享,可在线阅读,更多相关《传智博客struts开发.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、北京传智播客教育 ,Struts开发,讲师:方立勋,北京传智播客教育 ,TIP:为什么学习Struts,MVC设计模式 基于MVC设计模式的Servlet+Jsp+JavaBean的WEB应用程序的工作流程。 基于Strus的web应用程序的工作流程。 为什么要用strus,它给我们带来了什么?,北京传智播客教育 ,TIP:Struts开发快速入门,用户注册(使用struts完成),步骤: 1、编写register.jsp表单页面,表单提交RegisterUser.do处理。 2、在web工程中导入struts开发包,在web.xml文件中配置struts框架提供的ActionServlet,
2、使其处理所有以.do为结尾的请求。 3、在/WEB-INF/目录下编写ActionServlet工作时使用的配置文件struts-config.xml,配置当ActionServlet收到RegisterUser.do请求时,调用一个名称为RegisterUse的Action处理。 4、编写ActionRegisterUse,在其excute方法内编码,采用传统方式获取数据,并调用service完成用户注册,然后转发给相应的jsp页面。,北京传智播客教育 ,TIP:让struts自动封装请求数据,Struts的ActionServlet的功能非常强大,我们只需要在它的配置文件( struts-
3、config.xml文件)中配置一下,它就可以自动把请求数据封装到用户指定的formbean中。并且,struts在调用开发人员编写的action时,会把封装了数据的formbean传给action。这样,可以省去开发人员在action中手工获取客户端提交的数据,减轻编码工作量。, ,注意:用于封装数据的formbean要继承struts的ActionForm。,北京传智播客教育 ,TIP:让struts转发请求,用户在编写action时,无须在action内手工编码进行请求转发。struts的ActionServlet在调用action.execute方法时,可以根据它的返回值,决定调用哪个
4、JSP页面响应用户请求。 Action.execute方法的返回值ActionForward代表一个转发对象, struts的ActionServlet在收到Action.execute方法的返回值ActionForward后,会取出该对象封装的转发地址,进行请求转发。,Action,ActionServlet,ActionForward,JSP,北京传智播客教育 ,TIP:让struts根据配置实现转发,在struts的配置文件struts-config.xml文件中,可以配置forward标签,它用于封装一个转发地址。如: Struts的ActionServlet在调用action时,会把
5、action的配置信息封装一个ActionMapping对象中,并传递给action。 因此,开发人员在编写action时,无须硬编码指定转发地址,可以通过ActionMapping对象,获得配置文件中配置的转发地址,从而实现转发。如下图:,北京传智播客教育 ,TIP:让struts根据配置实现转发,ActionServlet,action,ActionMapping,Struts-config.xml ,请求,封装配置信息,*.do,actionServlet,Struts-config.xml,action,formbeam,actionMapping,actionforward,jsp,
6、Web服务器,Web.xml,ActionServlet,Action,ActionFrom,1、web服务器收到请求后,把请求派发给struts的servlet进行处理。 2、ActionServlet读取配置文件,根据请求的path创建相应的action实例对象, 3、根据配置文件创建封装请求参数的ActionForm对象。 4、创建代表当前Action配置信息的ActionMapping对象。 5、调用Action实例的execute方法,并把ActionForm和ActionMapping对象传递进去。 6、ActionServlet根据execute方法的返回值ActionForwa
7、rd封装的转发信息,把请求转发到相应的JSP页面显示。,Struts-config.xml,ActionMapping,ActionForward,ActionForward,JSP,北京传智播客教育 ,TIP:读struts源码,分析struts工作流程,Struts的控制器组件主要包括(课后一定读源码) ActionServlet对象:Struts 的核心类 RequestProcessor对象:由ActionServlet调用,负责处理用户请求 Action对象:用户自己编写的类 Struts处理请求的流程: 当 ActionServlet 接收到 HTTP 请求后,在 doGet 或
8、doPost 方法中都会调用process()方法处理请求 在 ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它 RequestProcessor实例的process()方法调用ProcessActionCreate()方法,先判断是否在 Action 缓存中存在Action实例,如果不存在,就创建一个Action实例,把它保存在 Action 缓存中 RequestProcesso
9、r实例的process()方法调用Action实例的execute()方法,北京传智播客教育 ,TIP:Struts配置文件常用属性, ,指定action处理的地址,指定处理请求的Action的完整类名,指定使用哪个formbean封装请求参数,指定把formbean存放到哪个域对象中,默认session,指定formbean存储的key,不设默认为name属性的值,指定把formbean的数据是由哪个页面提供的,提 供此属性的目的在于formbean校验失败时,程序方便 跳回formbean的输入页面,显示校验失败信息。,指定收到请求时,跳转到相应的jsp页面,如果配 置了此属性,则acti
10、on将不再被调用。相当于ServletUI,指定收到请求时,进行页面包含。,如果action把该属性设置为true,则它可以处理客 户机发出的所有无效的.do请求,默认值为false,用于处理错误页面,配置action参数,调用actioMapping.getParameter方 法可以获得这里配置的参数。,标签和所有的配置信息使用哪个对象封装, 默认值为ActionMapping对象。,请求参数封装到formbean中后,是否让struts自动 调用formbean的validate方法进行数据校验。默认true,北京传智播客教育 ,TIP:补充知识点,严格按照MVC设计模式改进注册用例,需
11、求: Web应用程序若要严格按照MVC设计模式,所有客户端的请求都需要发送给servlet处理,servlet再转发到JSP显示。 因此,对于上述案例中的register.jsp页面,也要禁止用户直接访问,而应把它放在web-inf目录中保护起来,由用户访问servlet后,servlet再转发到register.jsp页面上。 传统做法和Struts的做法。 在首页上挂上注册功能 标签的好处:也有坏处 使用不用关心web应用程序的名称。 可以自动附加jsessionid参数进行url重写。 可以对参数信息进行url编码。 标签常用属性:paramID、paramName、name、prope
12、rty。,北京传智播客教育 ,TIP:补充知识点,标签示例:,北京传智播客教育 ,TIP:借助struts完成表单校验,表单数据提交后,在服务器端编程校验数据合法性,是一个很常见的需求。所以struts的ActionServlet在把数据封装到formbean后,会自动调用formbean的validate方法对数据进行校验,并根据validate方法的返回值,决定转发到哪个jsp页面处理。 Stuts的这种处理方式,可以让开发人员少死点脑细胞,开发人员只需要在validate方法中写代码进行数据校验就OK了,调用方法的事由struts的actionServlet去做了,并且,调用方法完后,如
13、果有错误,跳转的事,也由struts根据配置文件做了。 注意:若想struts的actionServlet把数据封装到formbean后,调用其validate方法,需要在struts-config.xml文件中把action的validate属性设置为true,默认值为true。,北京传智播客教育 ,TIP:借助struts完成表单校验,Struts调用formbean.validate方法后,其规则为: 如果validate返回的ActionErrors对象为空或null,则Struts认为表单验证通过,struts进而继续调用Action处理请求。 如果validate返回的Action
14、Errors不为空,并且封装了数据,则认为校验失败,Struts将自动跳转回表单输入页面。(input属性指定) 因此用户若想校验失败,只需要创建ActionErrors对象,并调用其方法: ActionErrors.add(String key,ActionMessage message) 向ActionErrors对象中加入相应的错误消息,返回给struts即可。示例代码:,北京传智播客教育 ,TIP:在JSP中显示校验信息,Struts在收到Formbean的返回值ActionErrors后,会将其存储到request域中,进而带给表单页面,以便开发人员在表单页面中显示校验失败的错误信息
15、(这点建议读读struts的源码)。 在JSP页面中开发人员可以编码显示错误信息:,注意上面的代码取request的errors对象时为什么用“org.apache.struts.action.ERROR”,这个值从何来? 显示消息时有需要在struts-config.xml文件中配置一个资源文件 ,北京传智播客教育 ,TIP:使用显示校验消息,在JSP页面中手工编码获取errors对象中保存的数据很麻烦,因此Struts编写了标签,它用于封装JSP页面中用于获取消息的java代码。 用户使用标签可以很轻松获取到errors中保存的校验信息,示例。 标签也可以以ActionMessage中封装
16、了key为关键字,从资源文件中检索数据予以显示,如下所示:,取消false,html:errors标签在显示ActionMessage封装的消息时,将以ActionMessage的key为关键字从资源文件中检索数据显示,看看标签源码,看errors标签是如何以关键字检索资源文件数据的。 注意:errors标签工作时需要资源文件。,北京传智播客教育 ,TIP:ActionMessage,ActionMessage封装消息的方式很灵活,后面两个构造函数中的value参数,用于替换消息文本中的占位符:,对应资源文件内容:errors.required=0不能为空,北京传智播客教育 ,TIP:练习,完
17、成对Register.jsp页面的完整校验,北京传智播客教育 ,TIP:练习,private String username; private String password; private String password2; private String gender; private String birthday; private String income; private String city; private String preference; private String email;,北京传智播客教育 ,TIP:练习,注意事项: 日期校验不要采用DateFormat,而应
18、采用: DateLocaleConverter dlc = new DateLocaleConverter(); Date d = (Date) dlc.convert(this.birthday,yyyy-mm-dd); 对于页面中的数据,可采用枚举类表示,对枚举值的校验可采用如下类似方式: Gender.valueOf(this.gender);,北京传智播客教育 ,TIP:使用Struts标签完成表单数据回显,Struts提供了很多表单相关的自定义标签,如: 这些标签除用于生成相应的html标签外,最大的好处在于它在产生html标签时,会自动检索相应formbean的数据予以显示,这样,
19、当表单校验失败时,表单数据的回显struts帮我们干了,开发人员就不需要再编码去取了。,北京传智播客教育 ,TIP:使用Struts标签完成数据回显,使用Struts的html标签完成数据回显时注意的问题: html标签回显数据时,会以org.apache.struts.taglib.html.BEAN为关键字,从各个域中查找bean,找不到则抛空指针异常。所以使用html标签时域中须有以org.apache.struts.taglib.html.BEAN为关键字的对象。 这个工作可以交给html:form标签做,html:form标签在执行时,会查找域中已有的formbean,并以org.a
20、pache.struts.taglib.html.BEAN为关键字把formbean存在域中。如果html:form标签在域中找不到formbean,则html:form标签会实例化一个空bean,然后存储到域中。因此,为了在页面中使用struts的html标签回显数据,这些标签需要配合html:form标签使用。(查看html:form标签的源文件可以看到这点)。 对于复选框中的数据,Html:checkbox标签不能完成数据回显,复选框的数据回显需要使用html:multibox。 Struts中的html:password标签也会回显数据,如果不想password回显,需要把其redis
21、play属性置为false。 补充:formbean的reset方法,北京传智播客教育 ,TIP:请求数据的中文乱码问题,解决方案: 过滤器 重写ActonServlet 重写RequestProcessor,北京传智播客教育 ,TIP:防止表单重复提交,什么情况下会发生表单重复提交 刷新 网络延时,多次点击 后退、前进 防止表单重复提交的原理 表单应由一个程序产生,程序在产生表单时: 生成一个随机值,并附在表单的一个隐藏输入项中。 把随机值存储在session域中。 表单在提交时,服务器程序客户机带过来的随机值和session域中保存的随机值是否一致,如果一致则允许提交,否则认为是重复提交。
22、,北京传智播客教育 ,TIP:使用struts防止表单重复提交,Struts的标签除了可以生成标签、协助其它html标签完成数据回显外,它还提供了防止表单重复提交的功能。 标签在生成表单时,会检查session域中是否存在token,如果存在则自动使用token生成隐藏字段。 Struts为方便开发人员生成token,在action中提供了saveToken方法,调用这个方法就可以在session域中保存一个token。 Struts为方便开发人员在action中校验用户是否为重复提交,因此它在action中也提供了isTokenValid方法,该方法会自动判断表单是否为重复提交。 防表单重复
23、提交在struts中的做法: 1、用户先访问Action,Action中调用saveToken方法,然后派发到表单页面。 2、在表单页面中使用标签, 标签会自动为表单生成一个带随机值的隐藏字段。 3、在表单提交的Action中调用isTokenValid方法,就可以判断出表单是否为重复提交,从而可以根据情况决定如何处理。 isTokenValid方法返回true,则为允许提交,处理提交后,要记得调用reset清除token。,北京传智播客教育 ,TIP:使用beanUtils转换表单数据,表单校验通过后,需把formbean的数据封装到实体bean中,此时应采用beanUtils框架,并注册相
24、应的转换器。 为避免在多个Action中重复注册转换器,可采用listener在web应用启动时就注册转换器。,北京传智播客教育 ,TIP:表单数据业务逻辑校验,表单数据校验通过后,在action中可能会对数据进行业务逻辑验证,例如检查当前注册用户是否已经被别人注册过了,这种验证称为业务逻辑验证。 业务逻辑验证如果失败,其相应的信息也应显示在页面上。,北京传智播客教育 ,TIP:表单数据业务逻辑校验,很多网站也会提供如下图所示的验证方式:,北京传智播客教育 ,TIP:使用struts修改数据,程序取出数据库中的数据,显示在一个表单页面上,以便于用户修改数据,这也是开发中经常需要实现的功能。实现
25、此功能需要注意的问题: 为回显数据方便,通常在页面中都会使用struts的html标签。 而程序调用dao取出的数据通常放在实体bean中,要想在页面中使用html标签取出数据显示,此时应把实体bean的数据又转换到表单bean中,对于复杂类型的数据,此时就需要在beanutils框架中注册数据的双向转换器了。 数组类型是比较特殊的类型,进行类型判断是可以采用如下方式: clazz.equals(Object.class) 获取到的 Bean为在页面中显示,还需要把bean存放在request域中,存放的关键字可以使用action上配置的formbean的名称。 注意:在action如果向re
26、quest域存formbean,这个formbean想在jsp页面中显示,配置文件中的scope要配成request,不然页面会先从 session找,而session中有一个空bean。,北京传智播客教育 ,TIP:struts文件上传,文件的上传操作: JSP 页面: 表单使用 POST 提交方式, 添加 enctype=multipart/form-data 属性 ActionForm 中使用 org.apache.struts.upload.FormFile 类型定义文件字段 导入 struts-1.3.8libcommons-fileupload-1.1.1.jar 和 common
27、s-io-1.1.jar 在 Action 的 execute() 方法中使用 InputStream is = file.getInputStream(); 方法得到文件的输入流 再使用 io 的方法对文件进行上传操作.,北京传智播客教育 ,TIP:struts文件上传注意事项,在formbean中定义FormFile类型的成员变量接收浏览器上传的文件。只要在Formbean中定义一个FormFile类型的变量,struts框架会自动把文件上传的内容变成FormFile对象并注入进来,即使没有上传文件,对应的FormFile变量也会有值,只是得到文件名为”和文件大小为0。 中文文件上传问题
28、过滤器解决 设置上传文件的最大值:在配置文件里面配置 注意:如果上传文件超出了最大值, struts不会把上传数据封装到FormFile中,即c为null,程序根据FormFile是否为空,就可提示用户文件是否超出大小。 多文件上传问题 DownloadAction提供下载。,北京传智播客教育 ,TIP:DispatchAction,需求:客户端每个请求都对应服务器端一个Action,会导致服务器端action过多,维护困难。 在Struts中允许多个请求对应一个Action,例如对Book对象的增删改查操作,可以交给一个Action处理,Action根据请求地址中附加的参数信息,再派发到相应
29、的方法,例: 增加书籍 修改书籍 查找书籍 删除书籍,北京传智播客教育 ,TIP:DispatchAction,Struts中的DispatchAction提供了此类功能,它可以根据请求的参数,调用不同的方法,但要注意的是开发人员在声明参数对应的方法时,方法的签名需要与execute() 方法一致。例:,注意Struts中的DispatchAction并不知道用户的参数是以什么名称提交的,因此若想DispatchAction能正常调用到用户自定义的方法,用户需要在action的配置文件中通过parameter属性告诉给struts。 课后看看源码:分析DispatchAction是如何调用用户
30、自定义方法的,北京传智播客教育 ,TIP:DispatchAction,注意事项: DispatchAction是Action的子类,它重写了Action的execute方法,因此用户继承DispatchAction时,若想使用DispatchAction提供的分发功能,切记不可覆盖其execute方法。 DispatchAction位于struts的扩展包中,即struts-1.3.8libstruts-extras-1.3.8.jar。,北京传智播客教育 ,TIP:MappingDispatchAction,MappingDispatchAction是DispatchAction的子类,它
31、提供的功能和DispatchAction功能类似,它也允许多个请求对应一个Action,但它的实现方式更加灵活,如图:,MappingDispatchAction可以配置到多个地址上,比DispatchAction更加直观,并且也可使用不同的formbean,但缺点是使配置文件过于复杂。 补充知识点:让struts拥有多个配置文件。,北京传智播客教育 ,TIP:动态FormBean,Struts允许开发人员在配置文件中声明一个formbean,而无须手工针对每一个表单设计一个Formbean。步骤: 1、配置一个元素, 将type属性设置为 DynaActionForm。 2、的子元素用来设置
32、动态ActionForm的属性。 元素的name属性指定属性名, type指定属性类型 3、使用 DynaActionForm 类的 public Object get(String name); 访问字段的值,北京传智播客教育 ,TIP:集成FckEditor,FCKeditor是一款非常优秀的HTML在线编辑器,功能也可以定制. 也支持多种浏览器, 遵循LGPL版权。最新版本的FCKeditor(2.3.2)同时兼容绝大多数主流浏览器,包括: IE 5.5及以上版本 (windows), 火狐Firefox 1.0及以上版本, 遨游Mozilla 1.3及以上版本,网景7.0及以上版本。
33、集成步骤参看fckeditor的例程 1、在web工程下新建JS目录,并拷贝fckeditor到该目录中。 2、导入fckeditor.js文件。 3、在表单中加入如下代码:, var oFCKeditor = new FCKeditor( resume ) ; /重要, fckeditor产生的输入项名称 oFCKeditor.BasePath=$pageContext.request.contextPath /js/fckeditor/; oFCKeditor.Height= 300 ; oFCKeditor.Value=; oFCKeditor.Create(); ,数据回显问题,北京传
34、智播客教育 ,TIP:Struts-Validate框架,Validator(验证器)框架是一个 Struts 插件,它支持采用声明式的方式对表单进行校验,而不需要用户编写一行Java代码。集成validate框架 ,Struts那哥们他帮你校验了表单,而且客户端也校验,比如javascript校验他也帮你校验了使用 Validator 框架的好处: 更好的可维护性 校验实现标准化 正确的实现 更少的代码重复 自动客户端验证,北京传智播客教育 ,TIP:Struts-Validate框架,解压Struts的例子struts-cookbook-1.3.8,部署到web服务器中,查看例子体验。 在
35、工程中集成validate框架,你需要查看org.apache.struts.validator包下的validator-rules.xml文件,它是validate框架的校验规则文件,这个文件说明了如何在struts工程中集成validate框架: 1、在struts-config.xml文件中配置validate插件。 2、创建资源文件,并复制validate框架工作需要的信息。 3、把struts-cookbook-1.3.8例程自带的、validate框架的配置文件validation.xml,复制到当前web工程的WEB-INF目录下。 validate框架环境搭建好后,就可以采用配
36、置的方式对formbean的属性进行校验,但需要注意: 1、formbean要想使用validate框架校验,不能直接继承 ActionForm, 而要继承其子类 ValidatorForm。 2、如果是DynaActionForm,就必须要继承DynaValidatorForm,北京传智播客教育 ,TIP:Struts-Validate框架(valiate-rule), ,为校验器指定名称,校验器使用的类,使用该校验器时,调用 校验器的什么方法,方法的参数,校验失败的错误提示 信息,此信息为关键 字,其值从资源文件 中获取。,北京传智播客教育 ,TIP:validation.xml文件示例代
37、码,北京传智播客教育 ,TIP:Validation.xml文件详解,元素:为表单配置验证规则,它的 name 属性指定了表单的名字.元素可以包含一个或多个子元素 元素:配置表单中字段的验证规则 property:指定 ActionForm Bean 中需要进行验证的字段的名字 depends:指定字段的验证规则,多个验证规则之间以逗号隔开 元素:指定验证规则对应的消息文本。该消息文本将替代在 validator-rules.xml 文件中为验证规则配置的默认的消息文本 name:指定验证规则的名字 key:当 resource 为 true 时,该属性指定消息 key,该消息 key 应该在
38、 Resource Bundle 中存在,当 resource为 false 时,该属性直接指定消息文本 resource:当该属性为true时,表明使用来自于 Resource Bundle 的消息;如果为 false,表明 直接在 key 属性中设置消息文本,默认为 true arg 元素:替换符合消息中的参数 name,key,resource 元素同上 position 元素:指定替换符合消息中的参数的位置 var 元素:向验证规则传递参数 元素也可以访问元素,语法为$var:var-name,北京传智播客教育 ,TIP:Struts-Validate客户端验证,Validator 框
39、架也可以进行浏览器客户端验证,示例:,注意:的formName指定表单的名称。onsubmit事件的值也必须为return validate表单名(this),北京传智播客教育 ,Struts中的异常处理,在Action中抛出一个ArithmeticException异常,并由Web容器去处理这个异常,在web.xml文件中如何配置? 以Struts的配置方式处理异常 全局异常:指定全局异常时,注意必须要指定key,配置key后,会从资源文件中获取消息。 局部异常,北京传智播客教育 ,struts问题:面试题,1 、Action是单实例和线程不安全的。和 servlet一样的 2、能区分ActionMapping与Action的区别吗? 3、配置文件中的action元素中有哪几个属性必须设置 4、在action中可不可以直接向浏览器输出内容?可以 5、struts配置文件中的action元素的attribute属性的作用? 6、struts配置文件中的action元素的input属性的作用? 7、全局forward的配置,
限制150内