1、Struts初级,重点,回顾model1和model2 了解Struts; 了解Struts的运行机制; 了解Struts的基本组件; 动手写一个基础的Struts程序;,Model1回顾,JSP 页面接收客户端请求,并直接直接作出响应。其间辅以JavaBean实现相关的业务逻辑。JSP担任View和Controller两种角色 优点:实现简单,适合快速开发小型项目 缺点:但是由于分工不够明确,当相关的控制逻辑变得越来越复杂时,控制逻辑和表现层逻辑混杂在一起,导致代码重用性和可扩展性下降、维护困难。,经典MVC设计模式,MVC(Model-View Controller)模式的核心思想是将程序
2、代码分成相对独立、而又能协同工作的三个组成部分: 模型(Model):业务逻辑层。 视图(View):显示层。 控制器(Controller):控制层控制业务流程控制,实现View 和Model 的协同工作。,JSP设计模式 Model2,基于MVC架构 采用只包含控制逻辑的Servlet作为前端控制器,接收客户端请求,再转发到对应的JSP页面处理显示逻辑。辅以JavaBean实现具体的业务逻辑。 由于引入了MVC设计模式,Model 2实际上实现了基于组件的开发,在整个软件开发过程中实现了清晰的逻辑划分,能够有效的区分不同的角色,这就更适合于大规模系统的开发和管理。当然与此同时,也增加了应用
3、开发的复杂程度。,JSP 设计模式 Model2(续),JSP 设计模式 Model2(续),优点:适用于大规模系统的开发和管理 缺点:增加了应用开发的复杂程度,原来一个简单的JSP页面就能实现的应用现在被分解成多个协同工作的成分,开发者需要花些时间才能真正的掌握其设计和实现的过程,Struts的源起,Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。 Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫“Struts“,是为
4、了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。,软件开发架构的意义,Web应用开发架构FrameWork 组件的复用,可重用,模块化,扩展性好Open source,什么是架构(Framework),架构:对被验证为有效的、相同类型问题的解决方案进行抽象,提取而成的应用程序框架结构。 通常在Framework结构中都会包含一个“命令和控制”组件(“command and control” component),类似于生活中各种机构的“指挥中心”,开发人员可以通过它很容易的控制、扩充和实现该Framework上开发结构,Struts的体系结构,MVC与Struts映射
5、,Struts的体系结构实现了MVC设计模式的概念 Controller部分:包括ActionServlet和ActionActionServlet是Struts的核心控制器,该类继承自javax.servlet.http.HttpServlet类,因此它就是一个普通的Servlet,可以接收客户端浏览器的请求,然后执行相应的业务逻辑,在把相应结果返回给客户端。Action 对象是开发者定义的类。该类必须继承自org.apache.struts.action. Action类。在继承该类的过程中开发者可以加入具体的业务逻辑,或者调用业务逻辑模块。Struts框架中提倡Action对象只用来决定
6、“做什么”,相当于一个底层的控制器,因此将Action作为控制器的组成部分,MVC与Struts映射,Model部分: Struts中的Model部分一般有ActionForm和JavaBean及EJB组成 ActionForm对象可以用来接受用户表单的数据.可以将它看作是模型和视图的中介.一般用来保存从视图中获取的数据,并提供给其他的模型和视图使用 使用JavaBean提供具体的业务逻辑,既“怎么作” 对于复杂系统可以使用EJB来实现业务,MVC与Struts映射,View部分: Struts中的View部分依然采用JSP来实现. 此外,Struts还提供了丰富的自定义标记库,在JSP中使用
7、这些自定义标记可以实现于Model部分的有效交互并增强显示功能,看一个例子:,相应的提示页面,创建View组件,Jsp技术 Struts标签 国际化,Viewindex.jsp,姓 名:密 码:,Viewerror.jsp,“My JSP error.jsp starting page错误的用户名和密码,请重新登陆 如果不选择重新登陆,3秒钟后界面自动跳转到登陆界面,Viewright.jsp,“ My JSP right.jsp starting page 你是一个合法的用户! ,创建Controller组件,配置一个ActionSerlvet的实例 处理请求的serlvet是org.apa
8、the.struts.action.ActionSerlvet 初始化:config指定你的配置文件路径 配置ActionSerlvet映射/*.do,Web.xml,actionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmlaction*.doindex.jsp,例子:配置ActionServlet,在Web.xml中配置ActionServletactionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmla
9、ction*.do ,创建ActionForm组件,ActionFormBean类 一般和JSP页面用的Form表单标记中的元素相对应; 类似于一个普通的JavaBean,有私有属性以及getter和setter方法; 必须继承org.apache.struts.action.ActionForm类或其子类; 可以重写validate()方法对接收的数据进行验证;,例:ActionFormBean,public class LoginFormBean extends ActionForm private String userName; private String userPwd; publ
10、ic String getUserName() return userName; public void setUserName(String userName) this.userName = userName; public String getUserPwd() return userPwd; public void setUserPwd(String userPwd) this.userPwd = userPwd; ,Action类,主要工作是处理请求,然后返回一个标识JSP页面的actionForward对象进行页面跳转; 必须继承org.apache.struts.action.A
11、ction; 必须重写public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception 方法,Action类的execute方法,参数 ActionMapping mapping所有ationForard对象集合; ActionForm form邦定的该action的表单对象; HttpSerlvetRequest request用户请求; HttpSerlvetRespon
12、se response -用户响应;,Execute方法,返回值 得到一个ActionForward对象,此对象可以是全局的.也可以是该action局部的;,例:Action,public class LoginAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception /得到与action邦定的formbean LoginF
13、ormBean lf = (LoginFormBean) form; String userName = lf.getUserName(); String userPwd = lf.getUserPwd(); ActionForward forward = null; if(userName.equals(“sinosoft“) ,FormBean和Action与struts-config.xml,我们定义完action和formbean后,必须到struts-config.xml文件中去详细配置; 所有的actionForward对象只需要在struts-cofnig.xml文件中配置,在a
14、ction中调用即可;,Struts-config.xml配置,配置所有的表单实体(FormBean);配置所有的全局跳转页面;配置所有的处理对象(Action),元素, 属性: name调用实例名; type具体类的完整类名(包名+类名); 例:,元素, 属性: nameforward元素名,Action中使用此标识来查找确定目标相应页面; path具体指向路径; redirect跳转方式;,元素, 属性: path访问该Action的页面的相对路径(不包括.do的后缀);该相对路径必须以“/”开头; type该Action的完整类型名(包名+类名); input访问该action的原路径;
15、 name邦定的formBean的实例名,必须和前面声明的FormBean名称一致; scopeActionForm的生命周期; validate是否做数据校验; 例:,子元素,所有子元素都是该action的局部实例,其它action无法访问;的用法跟全局的forwards下的子元素用法是相同的,只是这里的forward只能被其父标记action访问;,完整的struts-config.xml,创建JavaBean组件,按照严格的MVC模式要求,action中只能调用JavaBean中的业务方法,而不做出现解决业务问题的代码; JavaBean实体bean(项目实体描述)和daoBean(数据持久化);,Struts的工作流程,Thank You,