320 likes | 558 Views
Struts 概述. Struts 实质上就是在 JSP Model2 的基础上实现的一个 MVC 框架。 模型: JavaBean 、 EJB 组件 控制器: ActionServlet 视图: JSP 、 Struts 客户化标签. Struts 概述. ActionForm Bean. ActionForm Bean 也是一种 JavaBean ,除了具有一些 JavaBean 的常规方法,还包含一些特殊的方法,用于验证 HTML 表单数据以及将其属性重新设置为默认值。
E N D
Struts概述 • Struts 实质上就是在JSP Model2的基础上实现的一个MVC框架。 • 模型:JavaBean、EJB组件 • 控制器:ActionServlet • 视图:JSP、Struts客户化标签
ActionForm Bean • ActionForm Bean也是一种JavaBean,除了具有一些JavaBean的常规方法,还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。 • Struts框架利用ActionForm Bean来进行View组件和Controller组件之间表单数据的传递。 • Struts框架把View组件接受到的用户输入的表单数据保存在ActionForm Bean中,把它传递给Controller组件,Controller组件可以对ActionForm Bean中的数据进行修改 • JSP文件使用Struts标签读取修改后的ActionForm Bean的信息,重新设置HTML表单。
Struts框架的初始化流程 • 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet • ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到ActionMappings对象中。
Struts框架响应客户请求的工作流程 • (1)如果ActionMapping实例不存在,就创建一个ActionMapping对象,它包含了把请求转发给哪个Action的信息。 • (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。 • (3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。 • (4)如果ActionForm的validate()方法返回null或返回一个不包含ActionErrors对象,就表示表单验证成功。 • (5)ActionServlet根据配置信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute方法。 • (6)Action的execute方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。 • (7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。 • 对于以上流程的步骤(4),如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。
Helloapp应用 • helloapp应用包括如下需求: • 接受用户输入的姓名<name>,然后返回字符串“Hello <name> !” • 如果用户没有输入姓名就提交表单,将返回出错信息,提示用户首先输入姓名。 • 如果用户输入姓名为“Monster”,将返回出错信息,拒绝向“Monster”打招呼。
Helloapp应用的组成 视图:hello.jsp HelloForm Bean 控制器:ActionServlet、HelloAction struts-config.xml 模型:PersonBean
Struts-config.xml <struts-config> <form-beans> <form-bean name="HelloForm" type="hello.HelloForm"/> </form-beans> <action-mappings> <action path = "/HelloWorld" type = "hello.HelloAction" name = "HelloForm" scope = "request" validate = "true" input = "/hello.jsp" > <forward name="SayHello" path="/hello.jsp" /> </action> </action-mappings> <message-resources parameter="hello.application"/> </struts-config>
struts框架的组成部分 • struts-config.xml Struts配置文件 • ActionServlet 控制器 • Action Class Control与Model之间 的适配器(adapter)。包 含控制逻辑,是Control的 实现者。 • ActionForm 显示模块数据
struts框架的组成部分 • ActionMapping 帮助控制器将请求映射到操作 • ActionForward 用来指示操作转移的对象 • ActionError 用来存储和回收错误 • Struts标记库
struts框架的优势 • 良好的架构和设计 • 可重用,模块化,扩展性好 • Open source
struts-config.xml • Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握Struts-config.xml是掌握Struts的关键所在。
struts-config.xml (FormBean部分) <struts-config> <!-- Form Bean Definitions --> <form-beans> <form-bean name=“testform" type="com.cjea.test.TestForm" /> </form-beans>
struts-config.xml(全局转发部分) <!-- Global Forward Definitions --> <global-forwards> <forward name="failure" path="bad.jsp"/> <forward name="success" path="/good.jsp" /> </global-forwards>
struts-config.xml (action部分) <action-mappings> <action path=“/test/test.jsp" type=“com.cjea.test.testAction" name="testform" scope="request"> <forward name="success" path="/test/good.jsp" /> </action> <action-mappings> </struts-config>
ActionServlet • ActionServlet 是struts框架 MVC 实现的 controller 部分,它是这一框架的核心。 • ActionServlet 创建并使用 Action、ActionForm 和 ActionForward。
ActionServlet的基本功能 • 截获用户的Http请求 • 把这个请求映射到相应的Action类。 • 创建一个ActionForm bean实例,将form请求放入formbean的实例中
ActionServlet的基本功能 • 调用Action实例的perform()方法 • 将ActioForm bean,Action Mapping对象,request和response对象传给Action的perform()方法 • perform返回一个ActionForword对象,根据方法执行情况转到相应的jsp页面.
Action Classes • Action 类是业务逻辑的一个包装。Action 类的用途是将 HttpServletRequest 转换为业务逻辑。 • Action是Control和Model之间的一个适配器(adapter)。
ActionForm • ActionForm 维护 Web 应用程序的会话状态。 • ActionForm 是一个抽象类,必须为每个输入表单模型创建该类的子类。
假定有一个由 HTML 表单设置的 TestActionForm。 Struts 框架将执行以下操作: 检查 TestActionForm对象是否存在;如果不存在,它将创建该类的一个实例。 Struts 将使用 HttpServletRequest 中相应的域设置 TestActionForm的状态。 ActionForm的使用
Struts深度历险 • Struts执行顺序 • 在AddForm和AddAction中增加调试代码 • 运行程序查看控制台输出 ActionServlet调用AddForm的setter方法 然后调用AddAction 的execute方法 最后页面将Form中的值显示出来
Struts深度历险 • ActionForm和ActionMapping中有什么? • Action中execute方法的参数列表 • 设置断点,观察变量 AddAction.java • public ActionForward execute( • ActionMapping mapping, • ActionForm form, • HttpServletRequest request, HttpServletResponse response) 通过在excute方法中设置断点、观察变量,可以帮我们解决很多使用Struts中出现的问题
小结 • 结合下图,说说Struts的运行过程。
使用Struts开发“发布出租信息” • 使用Struts开发“发布房屋信息”功能 • 模型(Model)组件 • 典型的三层结构 • 面向接口编程 • 开发顺序: DAO Biz Form Bean JSP Action Bean struts-config.xml • 调试
post.jsp confirm.jsp PostAction userlist login error 使用Struts开发“发布出租信息” 1、如果未登录,转到login 2、如果isConfirmed为false,转到confirm;否则,保存数据,转到userlist 3 、如果出错,转到error • 业务流程
public ActionForward execute(...){ //如果没有登录,转发到登录页面 HttpSession session = request.getSession(false); USER user = null; if (session != null) { user = (USER) session.getAttribute("user"); } if(user == null){ return mapping.findForward("login"); } //如果还没有确认,转到确认页面 String confirm = request.getParameter("confirm"); if(null==confirm || !"yes".equals(confirm)){ return mapping.findForward("confirm"); } //调用业务逻辑方法,插入数据到数据库 try{ FwxxForm fwxxForm = (FwxxForm) form; FWXX fwxx = new FWXX(); fwxx.setTitle(fwxxForm.getTitle()); ... biz.post(fwxx); request.setAttribute("msg","发布成功!"); return mapping.findForward("index"); }catch(Exception e){ request.setAttribute("msg","出错啦:" + e.getMessage()); return mapping.findForward("error"); } } 使用Struts开发“发布出租信息” PostAction.java • 实现代码
使用Struts开发“发布出租信息” <form-beans> <form-bean name="fwxxForm" type="com.aptech.jb.entity.form.FwxxForm" /> </form-beans> <action-mappings> <action name="fwxxForm" path="/post" scope="request" type="com.aptech.jb.action.PostAction"> <forward name="affirm" path="/affirm.jsp" /> <forward name="userlist" path="/list.do?myrent=y" /> <forward name="login" path="/login.jsp" /> <forward name="error" path="/error.jsp" /> </action> </action-mappings> • 配置文件 演示示例:使用Struts开发“发布出租信息”功能
总结 • 如何使用Struts开发登录功能? • Action组件的作用是什么? • ActionForm组件的作用是什么? • struts-config.xml中都配置了哪些信息? • 回忆Struts架构图,讲述Struts是如何实现MVC模式的?