1、Struts原理,Struts Web应用运行过程,控制器组件: ActionServlet,视图组件: JSP,模型组件: Biz,数据库,控制器组件: Action,控制器组件: Action,模型组件: DAO,视图组件: JSP,Struts原理,Struts原理,ActionServlet,JSP,JavaBean,数据库,AddAction,AddForm, ActionMapping,1,2,3,4,5,6,开发时只需关注: 两个核心组件: ActionForm AddAction 一个配置文件,1、页面提交的数据封装到ActionForm中 2、通过请求路径查找Struts-c
2、onfig.xml中Action的配置,找到并调用对应的Action,Controller (控制器),Model(模型),View(视图),查找ActionMapping,找到正确的JSP页面,并转发,Struts框架的初始化流程,对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到ActionMapping对象中。,Struts框架响应客户请求的工作流程,Struts框架响应客户请求的工作流程,(1)如果ActionMapping实例不存在,就
3、创建一个ActionMapping对象,它包含了把请求转发给哪个Action的信息。(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。 (3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。 (4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。 (5)ActionServlet根据配置信息决定将请求转发给哪个Action。如果相应的Action实例不存
4、在,就先创建这个实例,然后调用Action的execute方法。 (6)Action的execute方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。 (7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。对于以上流程的步骤(4),如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Actio
5、n对象并调用Action的execute方法。,进一步理解Struts控制流,Struts框架初始化流程,Servlet容器会在ActionServlet被加载后立即执行它的init()方法,以下是ActionServlet的init()方法完成的初始化操作: (1)调用initInternal()方法,初始化Struts框架内在的消息资源,如与系统日志相关的通知、警告和错误消息。 (2)调用initOther()方法,从web.xml文件中加载ActionServlet的初始化参数,如config参数。 (3)调用initServlet()方法,从web.xml文件中加载ActionServ
6、let的URL映射信息。此外,还会注册web.xml和Struts配置文件所使用的DTD文件。这些DTD文件用来验证web.xml和Struts配置文件的语法。,Struts框架初始化流程,(4)调用initModuleConfig()方法,加载并解析默认子应用模块的Struts配置文件,创建ModuleConfig对象,把它存储在ServletContext中。 (5)调用initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源,创建MessageResources对象,把它存储在ServletContext中。 (6)调用initModuleDat
7、aSources()方法,加载并初始化默认子应用模块的数据源。如果在Struts配置文件中没有定义元素,就忽略这一步骤。 (7)调用initModulePlugins()方法,加载并初始化默认子应用模块的所有插件。 (8)当默认子应用模块被成功的初始化后,如果还包括其他子应用模块,将重复步骤(4)到步骤(7),分别对其他子应用模块进行初始化。,多应用模块,Struts框架初始化流程,Struts框架响应客户请求的流程,ActionServlet的doGet()或doPost()方法,Servlet容器,ActionServlet的process()方法,RequestProcessor的pro
8、cess()方法,Action的execute()方法,Action类的execute()方法,public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException ;,Action类的execute()方法的参数和返回值,execute()方法包含以下参数: ActionMapping:包含了这个Action的配置信息,和struts-confi
9、g.xml文件中的元素对应。 ActionForm:包含了用户的表单数据,当Struts框架调用execute()方法时,ActionForm中的数据已经通过了表单验证。 HttpServletRequest:当前的HTTP请求对象 HttpServletResponse:当前的HTTP响应对象Action类的execute()方法返回ActionForward对象,它包含了请求转发路径信息。,快速开始一个Struts项目,第一个项目,实现用户登录操作 用户将看到一个登录页面,要求用户输入用户名以及密码 如果用户名以及密码都是admin,提示登录成功 否则提示登录失败 1、用Eclipse创建
10、一个J2EE Web应用项目,如右图所示 2、下载并解压Struts项目*从Apache网站下载struts最新版*将压缩包解压到一个目录,此目录为STRUTS_HOME目录 3、将STRUTS_HOME/lib目录下的所有.jar文件拷贝到刚创建的web项目的WebContent/WEB-INF/lib目录下 4、配置ActionServlet:修改web项目的web.xml文件,添加如下Servlet映射配置(转下一页),web.xml 的配置,actionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.
11、xml2action*.do,我们将需要创建如下文件,一个ActionForm LoginActionForm.java 一个Action LoginAction.java struts-config.xml文件 三个页面 登录页面 login.jsp 登录成功提示页面 login_success.jsp 登录失败提示页面 login_error.jsp,创建LoginActionForm.java,ActionForm是一个JavaBean,需继承org.apache.struts.action.ActionForm类,它捕获通过HTTP请求传送的参数 ActionForm针对每个HTML表
12、单中的字段具有一个对应的属性 ActionServlet匹配请求中的参数和ActionForm中的属性,并调用ActionForm中的setter方法,将参数传入ActionForm 我们的login.jsp有username和password两个表单字段(下面将会看到),所以,我们需要定义ActionForm中相应的setter方法:setUsername和setPassword方法 ActionForm中的getter/setter方法,可以通过Eclipse集成环境,自动生成 ActionForm中的内部属性全部定义为私有的(private),并通过公共(public)的getter/s
13、etter方法来访问,package com.bjsxt.strutstest; import org.apache.struts.action.ActionForm;public class LoginActionForm extends ActionForm private String username;private String password;/* return Returns the password.*/public String getPassword() return password;/* param password The password to set.*/pub
14、lic void setPassword(String password) this.password = password;/* return Returns the username.*/public String getUsername() return username;/* param username The username to set.*/public void setUsername(String username) this.username = username; ,创建LoginAction.java,Action是一个Java类,需继承org.apache.stru
15、ts.action.Action类 ActionServlet将会组装ActionForm,并将它传递给Action Action 通常负责: 输入校验 调用业务逻辑类执行业务逻辑操作 决定返回哪个ActionForward 我们的LoginAction做了如下事情,这些是一个Action通常都会做的最典型的事情: 将输入的ActionForm强制转换为LoginActionForm 从LoginActionForm对象中获取用户名以及密码的数据信息 执行用户名及密码的逻辑判断操作(在通常的情况下,要将这些业务逻辑交给专门的类去处理,这里这样做是为了演示的需要) 根据业务逻辑执行的结果,决定返
16、回哪个ActionForward,我们在这里使用success这个标识来表示登录成功页面,用error标识来表示登录失败页面,public class LoginAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception /将ActionForm强制转换为LoginActionFormLoginActionForm loginF
17、orm = (LoginActionForm)form;/从LoginActionForm中提取从页面表单传递过来的参数String username = loginForm.getUsername();String password = loginForm.getPassword();/根据这些参数,执行业务逻辑操作if(“admin“.equals(username) ,创建Struts配置文件struts-config.xml,在WebContent/WEB-INF目录下创建struts-config.xml文件 并添加如下内容(空白的struts-config.xml),紧接着,我们将
18、往这个空白的配置文件中添加其它配置信息struts-config.xml文件,是由ActionServlet读取的配置文件,它定义了所有关于Action、ActionForm、ActionForward等的详细信息,添加ActionForm配置,配置LoginActionForm,我们在struts-config.xml文件中,在标签的内部,添加如下配置:标签内部可以包含多个标签 标签必须指定name和type属性 name属性是给此ActionForm一个标识名称 type属性指定了此ActionForm是哪个类,必须是全路径的类名,添加Action配置,配置LoginAction,我们在s
19、truts-config.xml文件中,紧接着标签的下面,添加对LoginAction的配置 标签可以配置的重要属性包括: path-从页面上通过一个什么样的URL路径来访问Action(不包含.do) type 访问这个URL的时候,调用哪个Action类,这是Action的全路径类名 name 这个属性用来标识哪个ActionForm将被创建,并将提交的表单组件给它 scope FormBean的作用域范围,可以取值为session和request,一般取值都是request,创建login.jsp,在WebContent目录下创建login.jsp文件,如右边所示 添加一个表单,acti
20、on为login.do,这个login.do的意思,将会告诉struts的ActionServlet,它将需要调用哪个Action来处理这个表单的请求 添加输入域username,这个username的表单字段,必须跟LoginActionForm中的属性一致 添加密码输入域password,请登录请输入用户名: 请输入密码: ,创建login_success.jsp和login_error.jsp,login_success.jsp登录成功欢迎您,您已经成功登录!您创建的第一个Struts应用程序已成功运行!,login_error.jsp登录失败您的登录失败了,可能原因是用户名或密码不正确
21、,请返回重新输入 返回登录页面,启动Tomcat并运行login.jsp,运行login.jsp之后,能看到如下所示的登录表单输入用户名admin和密码admin,将能看到登录成功的界面输入其它用户名或密码,将能看到登录失败的界面,在这个简单的应用程序背后发生了什么?,当你从浏览器输入地址:http:/localhost:8088/Struts-Test/login.jsp,Tomcat将按通常情况来处理这个JSP并返回浏览器 当你提交表单,实际上是提交到了这样一个URL地址:http:/localhost:8088/Struts-Test/login.do,Tomcat将会根据web.xml
22、的配置,将这个请求发送给相应的Servlet,在我们的应用中,Tomcat将会把这个请求发送给org.apache.struts.action.ActionServlet这个类(请参看web.xml的配置) 然后ActionServlet根据struts-config.xml的配置信息,调用LoginAction对象去处理这个请求,在此之前,它会将页面表单的请求数据封装到LoginActionForm对象中,并传递给LoginAction LoginAction返回一个ActionForward对象,包含了将要转向的路径信息 ActionServlet根据这个ActionForward对象所包含的路径信息,调用相应的页面去执行响应 流程图请参考下一页,LoginAction应用程序的流程图,页面之间数据的传递,如何将数据从Action中传递到下一个JSP页面? 一般使用request.setAttribute方法: 在Action中,使用request.setAttribute(String name,Object data)方法往request中设置参数 在JSP中,使用request.getAttribute(String name)来获取相应的参数 在原来LoginAction的基础上编写相应的代码,测试页面数据传递 传递登录成功者的帐号信息到成功页面,并显示,