版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十讲Struts原理与应用,主讲人田雪松,第十讲第一部分,Struts基础知识 背景 MVC模式 Struts组件分类 View组件 Controller组件 部署描述文件 流程,背景,Jakarta Struts项目是Apache软件基金会的一个开放源码项目,旨在创建一种MVC模式的服务器端应用的Java实现框架。 Struts最早是由Craig McClanahan在2000年5月提出的,自那以后Apache组织就开始接管并不断地完善Struts 由于Struts结构清晰,结合了JSP与Servlet及JavaBean和各自优点,很快就得到了世界各地程序员的认可,并在实际项目中广泛应用,
2、背景,简单来说,Struts就是实现了MVC模式的Java服务器端应用框架 MVC模式是由面向对象语言的鼻祖Smalltalk最早提出的 MVC包括三个组件,即模型(Model)、视图(View)、控制器(Controller)。,MVC模式,Model 模型代表底层数据 View 视图是模型在屏幕上的显示,代表了模型当前的状态 Controller: 定义用户界面对用户输入的响应方式,MVC模式,M V C通过建立一个“订购/通知”协议来分离视图和模型。 视图必须保证它的显示正确地反映了模型的状态。一旦模型的数据发生变化,模型将通知有关的视图,每个视图相应地得到刷新自己的机会。 这种方法可以
3、为一个模型提供不同的多个视图表现形式,也能够为一个模型创建新的视图而无须重写模型,MVC模式,Struts组件,Struts实现了MVC模式,具体来说它的三个组件分别是: Model:Struts没有定义统一的模型组件,在不同的情况下组件是不同的,一般都是由一个JavaBean来代表 View:视图组件是由JSP页面来实现的,Struts专门定义了一些标记 Controller:控制器组件是由org.apache.struts.action.ActionServlet实现的,它接收用户发来的所有请求,并决定这些请求将分派给谁,Struts组件,控制器是整个Struts的核心,但是它并不真正处理
4、用户请求,它只决定请求将分派给谁处理 最后处理用户请求的是程序员自定义的一个扩展了org.apache.struts.action.Action的Action类 ActionServlet是根据用户请求的URI来决定请求分派的去向的,Struts组件,一个Struts应用,需求:根据用户输入的股票代号,查询当前股票价格 需要的页面有两个,一个请求用户输入股票代号的页面,一个是返回股票价格的页面,一个Struts应用,View组件,Index.jsp页面源码 Wiley Struts Application ,View组件, 索引标识: ,View组件,由于使用了taglib引入TLD文件,所以
5、还应该在web.xml文件中指定tld的存储位置: /WEB-INF/struts-html.tld /WEB-INF/tld/struts-html.tld ,View组件,标记 标记的含义是将表单内容写入到一个wiley.LookupForm类型的FormBean中,这个FormBean的名称为lookupForm 所以还必须要定义一个FormBean,FormBean,FormBean是一个扩展了org.apache.struts.action.ActionForm类的JavaBean,它与一个HTML的Form表单相对应 当一个Form提交后,其中的input元素将与FormBean相
6、匹配。 与表单对应的FormBean要定义相应的属性及getter及setter方法,它们的名称要符合JavaBean规范,FormBean,只要使用了html:form标记,就要定义FormBean 1、定义所有与表单相对应的属性 2、为所有属性定义相应的getter方法与setter方法 3、定义reset方法 4、定义validate方法,这个方法是可选的,它是否执行,可以在部署文件指定,FormBean,FormBean的调用流程: 1、当html:form提交后,Struts会在指定的作用域中寻找name属性指定FormBean,如果没有找到则根据type属性创建一个新的FormBe
7、an并加到作用域中 2、调用FormBean的reset方法 3、调用相应的setter方法 4、调用FormBean的validate方法,FormBean,package wiley; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class LookupForm extends ActionForm private String symbol = n
8、ull; public String getSymbol() return (symbol); public void setSymbol(String symbol) this.symbol = symbol; public void reset(ActionMapping mapping, HttpServletRequest request) this.symbol = null; ,FormBean,FormBean中定义了一个reset方法,这个方法是在每一次请求时都会最先调用的方法,用来清空FormBean中的属性 为了使FormBean可用,还必须要在一个名为struts-con
9、fig.xml的文件中加入元素,并在这个元素体中加入元素,FormBean,struts-config.xml: ,FormBean,这里的定义实际上会导致服务器在启动时创建一个FormBean的Bean池,每次用户提交时服务器会从Bean池中取出一个Bean来匹配提交的表单 注意:FormBean只是Struts中提交数据的对象化,可以认为是模型的一种,控制器,在Struts中,控制器是两部分组成的: ActionServlet 接收所有客户端请求,并根据请求的URI将它们分派给不同的Action对象,它一般是由org.apache.struts.action.ActionServlet直接
10、完成的 Action Action是一个扩展了org.apache.struts.action.Action的类,它是最后完成对请求处理的类,封装了业务逻辑。,控制器,在大部分的Struts应用中,只需要一个ActionServlet,但需要多个Action类来处理用户的不同请求 ActionServlet类就是一个简单的Servlet类 Action类中包含了一个execute方法,这个方法是最后处理请求,并指定页面转向的地方(1.0版本时,是perform方法) Action类是一个Servlet吗?,ActionServlet,ActionServlet相当于一个总控制器,接收所有请求,
11、请思考如何让一个Servlet接受所有请求? ActionServlet是不需要程序员自己编写的,而是通过部署描述文件来配置的,这个文件就是web.xml 在web.xml文件中可以指定ActionServlet的属性,这些属性包括config、mapping、debug等等,它们统一由init-param指定,web.xml,在部署描述文件中加入三类内容: 1、ActionServlet的初始化信息、映射关系 2、欢迎页面名称列表 3、TLD文件存储位置及URI,web.xml, action org.apache.struts.action.ActionServlet config /WE
12、B-INF/struts-config.xml ,web.xml, mapping webshopping.ProductActionMapping debug 5 1 ,web.xml, action *.do Login.jsp ,web.xml, /tags/struts-bean /WEB-INF/struts-bean.tld /tags/struts-html /WEB-INF/struts-html.tld /tags/struts-logic /WEB-INF/struts-logic.tld ,Action类,Action类必须要实现的方法是execute方法,这个方法必须要
13、返回一个ActionForward对象 ActionServlet会主动调用Action的execute方法,并传入四个参数ActionMapping、ActionForm、HttpServletRequest、HttpServletResponse execute方法执行结束后,必须要返回ActionForward对象给ActionServlet,Action类,用户自定义的Action类必须要扩展org.apache.struts.action.Action类 在org.apache.struts.action.Action中定义了几个比较重要的内置对象 defaultLocale :代表
14、系统默认的本地对象 servlet :代表了调用当前Action类的ActionServlet类的引用 经常使用servlet对象来获取上下文环境,例如 ServletContext context = servlet.getServletContext(); DataSource ds = (DataSource) context.getAttribute(Globals.DATA_SOURCE_KEY);,Action类,package wiley; import java.io.IOException; import javax.servlet.ServletException; imp
15、ort javax.servlet.http.*; import org.apache.struts.action.*; public class LookupAction extends Action protected Double getQuote(String symbol) if ( symbol.equalsIgnoreCase(SUNW) ) return new Double(25.00); return null; ,Action类,public ActionForward execute(ActionMapping mapping, ActionForm form, Htt
16、pServletRequest request, HttpServletResponse response) throws IOException, ServletException Double price = null; / Default target to success String target = new String(success); if ( form != null ) / Use the LookupForm to get the request parameters LookupForm lookupForm = (LookupForm)form; String sy
17、mbol = lookupForm.getSymbol(); price = getQuote(symbol); ,Action类,/ Set the target to failure if ( price = null ) target = new String(failure); else request.setAttribute(PRICE, price); / Forward to the appropriate View return (mapping.findForward(target); ,struts-config,为了能够让ActionServlet知道用户请求的URL与
18、Action的对应关系,Struts提供了一个XML文件struts-config.xml,用来提供这些信息。 ,struts-config,其中, action-mappings元素就是用来指定URL与Action类之间的映射关系的。它实际上是用来配置ActionMapping类的 ,struts-config,需要添加的内容为: ,struts-config, ,struts-config, ,控制器,控制器处理的请求的流程是这样的: 1、所有的请求均发送给ActionServlet 2、ActionServlet根据用户的URI将请求转给相应的Action类,并调用其中的execute方
19、法 3、execute方法返回一个ActionForward对象给ActionServlet 4、ActionServlet从返回的ActionForward对象中得知应转向的地址,并将页面转向相应的页面。,响应页面,quote.jsp页面源码: Wiley Struts Application ,响应页面, 当前价格 : ,流程,1、html:form表单提交到Lookup.do 2、容器从web.xml文件中得知*.do地址均要匹配到名为action的Servlet上,这个Servlet就是ActionServlet 3、ActionServlet在接收到请求后,从struts-confi
20、g.xml文件的action元素的type得知接收Lookup.do地址的Action类 4、生成Action类并将请求传给Action类的execute方法 5、execute方法处理结束后返回ActionMapping对象,ActionServlet根据这个对象得到转向页面,流程,总结,概括起来,使用Struts开发应用系统时要: 1、使用html:form标记 2、在使用了html:form时,必须要定义FormBean 3、为表单指定的路径定义相应的Action类 4、在struts-config.xml文件中指定每一个.do路径的具体信息,第十讲第二部分,国际化 定义资源包 使用be
21、an:message,国际化,什么是国际化? 实现国际化需要做哪些工作? 在Struts中实现国际化非常方便,只要先定义一个资源包,然后在页面中使用bean:message来读取这些信息就可以了,资源包,Struts中定义资源包是采用properties文件的方式 Properties文件就是一个以.properties为扩展名的文本文件 在这个文件包含的是键与值对 形式为: key=value 同样,也要定义基包和扩展包,什么是基包?,资源包,app.title=商城后台 app.userName=用户名 app.password=密码 ductId=产品标识号 app.nam
22、e=产品名称 app.description=产品介绍 app.price=产品价格 app.category=产品类别 app.role=操作功能 app.imageURL=图片URL app.digit=数码产品 app.books=图书 app.bh=百货 app.other=其它,资源包,资源包定义完后,如果包含了汉字或其它非UNICODE编码,还必须要使用native2ascii将资源包转为UNICODE编码 native2ascii是JDK自带的工具,专门用于转码的工作,格式为: native2ascii encoding 编码类型 inputfilename outputfile
23、name 如果没有转码必将出现乱码,资源包,在转码结束后,还要在struts-config.xml文件中指定资源包的位置和基名 你认为定义资源包的properties文件应该存储在什么位置? 你认为struts-config.xml文件应该存储在什么位置?,bean:message,为了能够在页面中使用properties文件定义的资源包,需要在页面中引入bean标记 应该在web.xml文件中加入: /tags/struts-bean /WEB-INF/struts-bean.tld 并在JSP页面上引用标记: ,bean:message, ,bean:message, : : ,bean:
24、message,还可以指定参数,例如: 在资源包中定义: errors.login.unknown=无法识别用户 : 0 在页面中使用时可以写成: 最多可以指定五个参数,总结,概括起来,在Struts中实现国际化的步骤是什么?,第十讲第三部分,错误处理 validate方法中处理错误 execute方法中处理错误,validate,Validate方法主要用于检查提交的数据是否正确,如果不正确就会出现错误处理的问题 validate方法是ActionServlet主动调用的,并传给它ActionMapping和HttpServletRequest参数,返回类型为ActionErrors,val
25、idate,如果想要使用validate方法必须要设置action元素的validate属性为true,并设置input属性,如 ,validate,package wiley; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.*; import org.apache.struts.action.ActionMapping; public class LookupForm extends ActionForm private String symbol = null; public St
26、ring getSymbol() return (symbol); ,validate,public void setSymbol(String symbol) this.symbol = symbol; public void reset(ActionMapping mapping, HttpServletRequest request) this.symbol = null; public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) ActionErrors errors = new Ac
27、tionErrors(); if (symbol = null) | (symbol.length() = 0) errors.add(symbol, new ActionError(errors.symbol.required); return errors; ,validate,当发生错误时,页面将自动返回到input所指向的页面 如果在这个页面上包含了标记,则这个标记将会把错误信息打印出来 还必须要在资源包中加入: errors.symbol.required=Symbol reqired! errors.symbol.unknown=Symbol unkown:0 errors.hea
28、der= Errors List: errors.footer=,execute,如果在execute方法中需要返回错误信息时,必须要生成一个ActionErrors对象 在向ActionErrors对象加入错误信息后,还必须要主动将它存储在请求作用域中,例如: if ( price = null ) target = new String(failure); ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(errors.symbol.unknown,
29、 symbol); if(!errors.isEmpty() saveErrors(request, errors); ,ActionError,ActionError代表了一个错误信息,它有6个构造函数: public ActionError(java.lang.Stringkey) public ActionError(java.lang.Stringkey, java.lang.Objectvalue0) public ActionError(java.lang.Stringkey, java.lang.Objectvalue0, java.lang.Objectvalue1) publ
30、ic ActionError(java.lang.Stringkey, java.lang.Objectvalue0, java.lang.Objectvalue1, java.lang.Objectvalue2) public ActionError(java.lang.Stringkey, java.lang.Objectvalue0, java.lang.Objectvalue1, java.lang.Objectvalue2, java.lang.Objectvalue3) public ActionError(java.lang.Stringkey, java.lang.Object
31、values),ActionErrors,ActionErrors代表一组错误,它的add方法原型为: public void add(java.lang.Stringproperty, ActionErrorerror) 如果是在validate方法中的与提交参数相关错误,则property必须是一个提交参数名 如果是在execute方法中,则property应该是ActionErrors.GLOBAL_ERROR,总结,Struts中可能返回错误信息有几个地方,它们是如何处理错误的?,第十讲第四部分,自定义ActionMapping 为什么要自定义ActionMapping? 自定义Act
32、ionMapping的方法,ActionMapping,ActionMapping对象的作用是向ActionServlet惟一地描述一个Action类 在struts-config.xml文件中,action-mappings的子元素action描述了ActionMapping的属性 在许多时候这些属性是不够的,所以需要自定义ActionMapping,并向其中添加属性 这些属性可以在action元素中,通过set-property元素指定,自定义ActionMapping,1、扩展ActionMapping类 2、加入需要的新属性 3、生成一个公共无参的构造函数,并在构造函数加入super() 4、为新添加的属性设置相应的getter方法及setter方法,例子,package wiley; import org.apache.struts.action.ActionMapping; / 第一步:扩展ActionMapping public class WileyActionMapping extends ActionMapping / 第二步:添加新属性 prote
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 珠宝行业智能零售管理平台开发方案
- 协商采购价格达成共识函6篇
- 高级行政管理人员文件守秘管理指导书
- 重庆市江北区2026届初三下学期模拟检测试题语文试题含解析
- 财务预算编制与执行报告模板成本控制型
- 浙江省上杭县2025-2026学年初三入学调研物理试题(2)试卷含解析
- 凝心聚力共促发展承诺书8篇范文
- 2026届四川省遂宁市射洪中学初三(语文试题文)4月第一次综合练习试卷含解析
- 建筑行业安全生产操作指南手册
- (正式版)DB32∕T 2641-2014 《靖江香沙芋生产技术规程》
- 2025年初中劳动技术教师招聘考试测试卷及答案
- 2026广东中山市神湾镇神湾社区居民委员会招聘1人考试备考试题及答案解析
- 《红领巾相约中国梦》课件2025-2026学年湖南文艺版音乐三年级下册
- 2026江苏徐州地铁集团下属运营公司招聘笔试备考题库及答案解析
- 2026甘肃平凉华亭市招聘社区工作者10人考试参考试题及答案解析
- 优先内部采购制度
- 国开2026年春季《形势与政策》大作业答案
- 2026年南京机电职业技术学院单招职业技能考试题库及答案详解(历年真题)
- (高清正版)JJF(浙)1090—2014薄片千分尺校准规范
- 屏柜安装施工方案.
- 湘教版四年级下册《生命与健康常识》教案
评论
0/150
提交评论