第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 中的两个属性。标
记可以生成表单元素,但和普通的
本文档为【chap01 领略清晰的MVC流程----Struts讲解技术资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。