首页 chap01 领略清晰的MVC流程----Struts讲解技术资料

chap01 领略清晰的MVC流程----Struts讲解技术资料

举报
开通vip

chap01 领略清晰的MVC流程----Struts讲解技术资料 第1章 领略清晰的MVC流程(Struts讲解) Struts是学习轻量级的 J2EE框架必须了解的一个框架,它的各种优点使得它成为 了目前最流行的三个框架之一,它实现了MVC模式,本章主要对 Struts所实现的MVC 流程,Struts的配置,Struts标签进行介绍。 1.1 Struts的流程 本节将着重介绍 Struts的基本流程,并对个流程进行简单的分析。 Struts 的业务流程比较复杂,但仔细体会也不难理解,为了便于读者理解这里使 用一个流程图对 Struts的运行机制进行描述,如...

chap01 领略清晰的MVC流程----Struts讲解技术资料
第1章 领略清晰的MVC 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 (Struts讲解) Struts是学习轻量级的 J2EE框架必须了解的一个框架,它的各种优点使得它成为 了目前最流行的三个框架之一,它实现了MVC模式,本章主要对 Struts所实现的MVC 流程,Struts的配置,Struts标签进行介绍。 1.1 Struts的流程 本节将着重介绍 Struts的基本流程,并对个流程进行简单的 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 。 Struts 的业务流程比较复杂,但仔细体会也不难理解,为了便于读者理解这里使 用一个流程图对 Struts的运行机制进行描述,如图 1-1所示: 图 1-1 Struts业务流程图 下面针对上面的流程,做一些必要的讲评。 (1)第一步,一般情况下,用户所有的以 do结尾的请求都会被一个叫ActionServlet 截获。ActionServlet 是 Struts 中一个特殊的 Servlet,它本质上还是一个 HttpServlet, 只是它在 Struts中充当“门卫”的作用。 当有以 do结尾的 Http请求时,它会认为这 • 2 • 是在向它要服务。接下来,它要做的事情就是查找这个“服务”是否存在。也就是 Action。 ActionServlet 的存在体现了一种在门槛集中控制的思想。以使得后面的工作有序的进 行。 (2)第二步,这一步牵涉到一个配置文件,它叫 struts-config.xml。这个文件中 包含了 ActionForm,Action,Forward 等信息,它的存在主要有两个意义,第一,它告 诉人们这个系统“有什么”。第二,它告诉系统其它组件请求的服务“在哪里”。来自 第一步的 Http请求就会在这个文件中查找,判断其是否存在对应的 Action,如果有则 继续下去,否则进行错误处理,这就体现了“有什么”的意义。 下面步骤中会提到“在 哪里”的意义。总之,struts-config.xml起到一种站点地图的作用。 (3)第三步,在 Struts观点中,一个 JSP的后面应该跟着一个 ActionForm。尤其 是当这个 JSP包含表单的时候。于是当表单提交的时候,这个 ActionForm,就会调用 它的 Setter方法将字段进行填充。然后,一般是在 Action 部分调用 getter方法将字段内 容进行提取,起到这种作用的 Java组件,非 JavaBean莫属。所以 ActionForm本质上 就是一个 JavaBean,在视图和控制器中充当数据通信兵。 (4)第四步,这时候又需要查看 struts-config.xml。看来它还负责告诉系统组件 可以“做什么”。ActionForm把数据填充完毕后,正打算将这些数据打包传送给 Action, 但它不能这样自作主张,先要查看下 struts-config.xml确定下是否还有其它的事要做, 最典型的就是是否需要调用 validate对数据进检验。 (5)第五步,ActionForm 当前面的工作都顺利通过后,就可以顺理成章的将数 据打包给 Action了。Action会调用它的 execute方法,打算将封装在 ActionForm中的 数据移交到别的地方,从 struts 的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 思想来看,Action 最好不要一厢情愿的去对 ActionForm中的数据进行复杂的处理,因为那不是一个控制器应该做的。最好还是留 点事情给模型层做。 (6)第六步, Action把 ActionForm中的数据提交给模型层如此这般(业务逻辑) 后,还需要负责将处理的结果在视图层呈现出来,一个可行的做法是使用最原始的办 法在 Action中进行页面跳转,这时候就像编写古老的 servlet一样。但 struts认为所有 的页面跳转都可以统一起来管理,于是就有了 ActionForward 这个对象。通过这个对 象, Action 可以查找 struts-config.xml 文件来确定它所请求的页面的位置 (struts-config.xml “在哪里”的意义得以体现)。在实际开发中,我们也的确会体验 到这种集中管理的好处。 • 3 • 1.2 Struts的配置 1.2.1 struts-config.xml的配置 在讲述配置 struts-config.xml之前,需要讲解一下如何使得一个web应用具有 struts 能力。 在 MyEclicpse J2EE Development透视图中选择 MyEclipse|add struts capablitity命 令,打开“Struts support for MyEclipse Web Project”对话框,如图 1-2所示: 图 1-2 添加 Struts能力 ● Struts config path 表示 struts-config.xml文件存放的路径,当然 struts-confg.xml 本身文件名也是可以修改的。 ● Struts-specification表示使用 struts的版本 ● ActionServlet name表示的是在 web.xml中 servlet的名字 ● URL pattern 表示 Struts 截获的地址类型,默认情况下截获所有以 do 结尾的地 址。 ● Base package for new classes 表示资源文件存放的包路径和以后新建文件的一 个包路径,可以修改。 ● Default appliation resources表示默认资源文件的路径。 单击 Finish按钮后,一个空的 web project就会多出很多的导入包和一些标签文件, 如图 1-3所示。 • 4 • 图 1-3 具有 Struts能力的 web project 这时候,一个 web Project就具备了 Struts的能力 ,同时我们也看到了它自动生成 的 struts-config.xml文件,下面的工作就是针对这个文件而言的。 文件配置前的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 如下 下面的配置都逐一讲解各个元素的具体含义。 下面的配置将围绕一个实例展开,这个例子的背景是大名鼎鼎的登录。用户通过 JSP页面尝试登录系统,经过 ActionForm的数据提交,Action的逻辑判断,最终用户 成功登陆到一个成功页面或者是转到一个友好的错误页面。 • 5 • 1.2.1.1 ActionForm的配置 先通过 myeclipse 来创建一个 ActionForm 。双击 struts-config.xml 文件打开图形 化编辑器 在空白处右击,在弹出的快捷菜单中选择 new|Form命令,将出现如图 1-4的界面。 图 1-4新建 ActionForm向导 填写 usecase 并添加两个属性 usename和 password 其它的保持默认或者会默认生 成,如图 1-5所示。 • 6 • 图 1-5 新建 ActionForm完成 单击 Finish 按钮后,web 应用程序就会发生两个变化,一个是添加了一个 Java Class,代码如下: 该 Form类的对象存储了从页面提交的用户名和密码信息,并可进行验证。 /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ package com.yourcompany.struts.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; /** * MyEclipse Struts * Creation date: 09-10-2007 * * XDoclet definition: * @struts.form name="loginForm" */ //默认继承 ActionForm public class LoginForm extends ActionForm { • 7 • /* * Generated fields */ //密码 /** password property */ private String password; //用户名 /** username property */ private String username; /* * Generated Methods */ /** * Method validate * @param mapping * @param request * @return ActionErrors */ //验证方法,它是否执行取决于 对应 action中的 validate属性 ,如果为 true则执行, //否则不执行。 public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub //可以在这里添加验证代码 return null; } /** * Method reset * @param mapping * @param request */ //重置方法,它在 validate之前运行,一般用于数据类型转化 public void reset(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub } /** * Returns the password. * @return String */ public String getPassword() { return password; • 8 • } /** * Set the password. * @param password The password to set */ public void setPassword(String password) { this.password = password; } /** * Returns the username. * @return String */ public String getUsername() { return username; } /** * Set the username. * @param username The username to set */ public void setUsername(String username) { this.username = username; } } 另一个变化就是修改了 struts-config.xml文件,修改后的文件内容如下: 通过对比发现新的 struts-config.xml文件中 元素的内容不再是空了, 而是多了一项 事实上,每个 ActionForm都对应一个 from-bean元素,这个元素描述了这个 Form • 9 • 的名称和类路径信息。以便在其它地方引用的时候可以找到这个 ActionForm的具体位 置,同时体现了一种简单隐藏复杂的思想:给一个复杂的事务命上一个简单的名称。 1.2.1.2 Action的配置 当用户登录后 ActionForm 将用户名和密码信息包装后提交一个 Action。在 myeclipse 中这样配置 Action,先用新建 ActionForm的办法新建一个 Action,如图 1-6 所示。 图 1-6 新建 Action 将刚才新建的 ActionForm在 Form标签页中引用进来,这样这个将要建立的 Login Action 与 loginForm 就扯上了关系。单击 Finish 按钮后整个应用也会发生两个变化, 一个是新添加了一个 Java Class 内容如下: /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ package com.yourcompany.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; • 10 • import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.yourcompany.struts.form.LoginForm; /** * MyEclipse Struts * Creation date: 09-10-2007 * * XDoclet definition: * @struts.action path="/login" name="loginForm" scope="request" validate="true" */ //默认继承 Action public class LoginAction extends Action { /* * Generated Methods */ /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ //执行控制的方法。 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form; return null; } } 可以通过代码看到 execute 方法中添加了 LoginForm 的相关代码,也就是说这个 Action获得了 LoginForm的一个实例,通过这个 JavaBean的 getter方法就可以将用户 名和密码取出来,后面的事情就是进行验证等逻辑操作了。 另一个变化就是在 struts-config.xml中填加了如下内容: attribute="loginForm" name="loginForm" path="/login" • 11 • scope="request" type="com.yourcompany.struts.action.LoginAction" /> 类似于 ActionForm,每个 Action都会对应一个 action 元素,各属性的含义是: ● attribute:与此 Action 关联的 ActionForm在 request/session 内 key.值 通过它们 的 getAttribute()方法可以得到它。这个名称不一定要是前面出现过的ActionForm 的名称,虽然默认如此。 ● name:它不是 Action 的名称,而是它所关联的 ActionForm 的名称,且这个名 称必须实在中声明过了的。 ● path:ActionServlet 如何找到这个 Action 的呢?就是通过这个 path。它代表这 个 Action访问路径 ● scope:此 Action所关联的 ActionForm的存在范围。它是 request或者 session. ● type:代表当前 Action的类路径。 1.2.1.3 Forward的配置 Forward有两种,局部的和全局的,它都是相对于 Action而言。配置局部的 Forward 只要修改下某个具体的 Action 的配置。仍以上面的 LoginAction 为例,这里我们为它 添加一个 Forward。 做法是进入 struts-config.xml 的图形编辑界面,右击刚才建立的 LoginAction,在 快捷菜单里选择 property 命令,进入到开始创建时候的界面,在下面选择 forward 标 签页,单击“Add”按钮,为它添加一个 Forwad如图 1-7所示。 • 12 • 图 1-7 新建 Forward 确认添加后,发现 struts-config.xml 文件 loginAction 的相关部分发生了如下的变 化: 可以看出,内容多了一行 其含义是 自明的。 这个 forward只能被 loginAction使用,那么如何配置一个全局的 Forwad呢。通过 新建 Action或者 ActionForm的办法,新建一个 Forward,如图 1-8所示。 • 13 • 图 1-8新建一个全局 Forward 单击 Finish按钮后查看 struts-config.xml文件发现新添加了: 这样配置的 Forward不属于任何一个 Action,可以被所有的 Action使用。所以是 全局的。 综上可见,Forward的配置是很简单的。 1.2.1.4 struts-config.xml的其它配置 上面几小节介绍的都是 struts 配置中的常用元素,除此之外,还有一些非常用但在某 些场合下又非常有用的元素: 添加过渡引言 ● :配置数据源 ● :全局异常 ● :定义控制配置类 ● :消息资源配置 ● :插件配置 1.3 Struts的标签库 在了解完 struts的开发流程后,本节将开始学习 struts的标签技术,有人说“struts 就是一些标签”,这种说法虽然欠严谨,但也可以看出标签在 struts中的地位。本节不 再详述自定义标签技术细节,那是 JSP 所关注的内容。而是学习 Struts 中标签的具体 • 14 • 用法。Struts的主要三个标签库:HTML标签库,logic标签库,bean标签库。 1.1.1 html 标签库 这个标签库主要用于显示,它基本上只是对 HTML 标签进行简单封装,使得用 户使用更加方便,同时可以和 Struts其它组件很好的结合在一起,比如和 ActionForm的关系。 1.1.1.1 标签 这是最简单的标签,它的作用仅仅是在使用标签处产生 一个元素,可能还 包含一个 locale或者 lang属性。这个属性取决于 struts的版本,struts1.1为 locale属性, struts1.2为 lang。 用法分别为: 使用 myeclipse 创建一个 struts1.1模板的 JSP后默认代码如下: <%@ page language="java" pageEncoding="GB18030"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %> tag.jsp • 15 • 这是一个 Struts页面 This a struts page.
黑色加粗部分就是自动生成的标签。同时我们也可以了解到 struts1.1 支持的标签库列表。 1.1.1.2 标签 在上面的例子中还看到了一个标签。它的用法比较简单。就像使用 html 的 base标签一样。访问上面的 jsp。查看客户端代码: tag.jsp 这是一个 Struts页面
可见 标签的用法是在其出现的位置上添加一句 base 语句,并给其 href属性赋值。 1.1.1.3 标签 它本质上是在生成一个标签,下面通过不同的属性介绍它的作用。 连接一个外部的 URL地址,用法非常简单。如下: 本书作者博客 从这个意义上而言,它完全等价于 本书作者博客 • 16 • 如果是连接一个内部的文件,可以使用 page属性,用法如下: 首页 如果需要添加参数可以直接在后面以?开始进行添加和的用法一致。如 首页 如果说仅仅是具有上面一些鸡毛蒜皮的能力,那么我们就应该对他的 存在表示质疑了。还好,他没有让我们失望的是它的功能不仅仅如此。如果在 struts-config.xml文件中定义了一个全局的 Forward。比如: 那么可以通过 使用到这个 forward地址: 首页 效果等价于超级链接到这个页面。它的方便在于不用关心这个页面的可能长长的 绝对路径。 再来看的另一个功能。 假如在第一个 jsp文件中有如下内容: <% String test="this is a test string"; request.setAttribute("teststr",test); %> 那么在第二个 jsp 文件如果要将第一个 jsp 文件中的 test 值做为参数放在标签 的后面一般的做法是(前提是第一个 jsp对第二个 jsp文件有http请求操作比如 forward) <% String teststr=(String)request.getAttribute(“teststr”); %> ”> 为了减少代码量。可以直引用,用法如下: 首页 查看客户端代码: 首页 1.1.1.4标签 这个标签用来显示图片,用法简单,如下: 1.1.1.5标签 这个在前面已经接触过,现在进行详细讲解,并采用前面的代码 form.jsp: <%@ page language="java" pageEncoding="GB18030"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> • 17 • JSP for FutureForm form Name:
age :
这段页面代码中使用到了标签库中的标签做为表单元素,元素 包含姓名和年龄两个字段,它对应相应的 ActionForm 中的两个属性。标 记可以生成表单元素,但和普通的
标签有所不同。的含义比较单纯,它 的 action 属性只是一个 servlet 或者 jsp。但的含义会比较复杂一些。在它 的属性约束上可以得到体现: z action属性的书写形式往往以.do结尾 z action必须为 struts-config.xml中已经配置好了的 action名称 z 这个表单都对应一个 ActionForm。所以表单的填充域标签属性都不能随意。 用法: Action属性往往对应一个 Action类的 path路径,它在 Struts-config.xml中配置。 1.1.1.6标签 它用来生成一个文本框,往往出现在中,如果不在中会报 错。错误类似于如下代码: javax.servlet.ServletException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:82 5) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758) org.apache.jsp.MyJsp_jsp._jspService(MyJsp_jsp.java:76) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 其属性值与对应的 ActionForm属性值一致。 其用法如下: • 18 • 它必须出现在标签体里面。 1.1.1.7 标签 它用来在页面生成一个密码输入框,在这个框中输入的字符都以*显示。这个标签 必须与配合使用,也就是说它必须出现在标签体里面。否则会 出错。它的属性值必须是对应的 ActionForm中存在的属性名称。 用法如下: 标签和的区别是在输入的字符不会被 显示,一般以黑点呈现。 1.1.1.8 标签 它的用法和