学习内容

Ø 框架的概念

Ø Struts 1体系结构

Ø Struts 1运行流程

能力目标

Ø 了解MVC模式的优缺点

Ø 理解框架的概念

Ø 会使用MyEclipse进行Struts 1开发



本章简介

在上一阶段的学习中,我们通过使用MVC模式进行了多个项目的开发。在MVC模式中,JavaBean实现业务逻辑,Servlet实现流程控制,JSP负责数据显示,这样的设计使程序的层次更加清晰,项目分工更加明确,代码耦合度也大大降低。但是在实际应用中,MVC模式也逐渐暴露出了诸多缺陷:开发效率低、结构不一致、难以重用等等。

Struts框架的诞生可以在很大程度上弥补这些缺陷。框架(framework)是某种应用的半成品,是一个可重用、可定制的组件。通过使用框架,我们可以更加简单、高效的进行开发,并且能够保证程序具有良好的健壮性、重用性和扩展性。

本章将重点学习基于MVC模式的Struts 1框架,包括Struts 1的体系结构和运行流程,最后会介绍如何使用MyEclipse进行Struts 1开发。

核心技能部分

1.1 MVC模式的优缺点

MVC是Model、View、Controller的缩写,分别代表了三个组成部分:模型、视图、控制器。在上一阶段的学习中,我们使用JavaBean作为Model实现业务逻辑,使用JSP作为View实现数据显示,使用Servlet作为Controller实现流程控制,我们把这种开发模型称之为Model2。显然,Model2开发模型是基于MVC模式的。大家可以通过图1.1.1复习一下Model2的工作原理。

Struts 1基础入门_j2ee架构 

图1.1.1 Model2工作原理

MVC是一种软件设计模式,它把应用程序分割成了模型、视图、控制器三个部分,每个部分各司其职,这种设计使得视图和业务实现了分离,代码耦合性大大降低,有利于工程化项目管理。

MVC模式具有组件化特点,适合大规模应用的开发,但是在实际应用中,特别是在WEB开发中,MVC模式逐渐暴露出了开发效率低、结构不一致、难以重用等等诸多缺陷,而Struts框架的诞生可以在很大程度上弥补这些缺陷。

1.2 初识框架

框架这个词最早出现在建筑领域,指的是在建造房屋的前期构建建筑骨架。在软件开发中,框架的意义与此类似。框架(framework)是某种应用的半成品,是一个可重用、可定制的组件。它凝结了前人或大师们的经验和智慧,使用框架就等于是站在了巨人的肩上。框架可以使我们的开发更加简单和高效,并且能够保证程序具有良好的健壮性、重用性和扩展性。

框架一般具有以下几个优点:

Ø 框架一般设计良好,能够增强程序的健壮性和可扩展性

Ø 框架封装了大量的底层操作,提高了重用性,使开发人员能够更加简单、高效的进行开发

Ø 使用框架有利于项目管理和分工

Ø 框架结构统一,便于学习和维护

目前比较流行的WEB框架主要包括Struts、Hibernate、Spring等,这三个框架也是我们本阶段学习的重点内容。


1.3 Struts框架

1.3.1 Struts框架简介

Struts 是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并于2001年发布Struts 1.0版本。Struts是一个采用 Servlet/JSP 技术,基于MVC设计模式的应用框架,后来成为MVC设计模式中的一个经典产品。

2006年,致力于WebWork 与Struts这两个优秀框架的团体,合作共同开发了一个新的、整合了 WebWork 与 Struts 优点,并且更加优雅、扩展性更强的框架,命名为 Struts 2,原Struts的1.x 版本产品称为Struts 1。因此,现在Struts项目并行提供与维护两个版本的框架产品——Struts 1 与 Struts 2。

Struts是一个开源框架,从一开始就得到了全世界范围内开发者的推崇,经过这么多年的发展,Struts 已经成为了世界上使用最广泛的MVC框架,拥有丰富的开发人群。现在使用Java技术新开发的WEB软件应用基本上都使用Struts 2,但是之前也有很多已经投入使用的软件工程用的是Struts 1。Struts的官方网站是http://struts.apache.org/,目前Struts 1的最新版本是Struts 1.3.10,Struts 2的最新版本是Struts 2. 3.4.1。

 Struts 1基础入门_j2ee架构_02

图1.1.2 Struts官方网站

1.3.2 Struts 1体系结构

前面我们讲过Struts是基于MVC模式的应用框架,所以MVC模式中的控制器、视图和模型在Struts中都存在,详见图1.1.3所示的Struts1体系结构。


Struts 1基础入门_业务逻辑_03 

图1.1.3 Struts 1体系结构


Ø 模型(Model)

Struts 1的模型由JavaBean组成,一般可以分为两类:实体类和业务逻辑类。实体类用来存储和传递数据,业务逻辑类封装底层的业务逻辑,例如数据库操作。

Ø 视图(View)

Struts 1的视图通常由JSP实现,但是Struts 1提供了丰富的标签库,可以最大限度的减少Java脚本的使用,并增强了视图功能。另外,Struts 1中的ActionForm也属于视图,它一般对应表单,用来封装客户端请求的参数。

Ø 控制器(Controller)

Struts 1的控制器由两部分组成:核心控制器和业务逻辑控制器。核心控制器就是图1.1.3中的ActionServlet,由Struts 1框架提供。该控制器继承自HttpServlet类,用来负责拦截所有来自客户端的请求,并根据Struts配置文件(struts-config.xml)把请求转发给相应的业务逻辑控制器(Action)或视图(JSP)。

业务逻辑控制器就是图1.1.3中的Action,该控制器通常由开发人员创建,并通过调用相应的模型(Model)来处理客户端请求。

1.4 Struts 1快速上手

1.4.1 使用Struts 1实现登录功能

下面我们以登录为例介绍开发Struts 1应用程序的基本步骤。用户首先访问登录页面,当用户输入的用户名和密码都正确时跳转到主页面,否则跳转到错误提示页面。

(1) 创建WEB工程并导入Struts 1框架的Jar包

课程统一使用Struts 1.3.8版本,我们可以从Struts官方网站上下载相应版本的Jar包,解压后把lib文件夹中的文件复制到工程的lib文件夹中。更简单的方法是通过MyEclipse来实现,MyEclipse集成了Struts框架,并通过插件为开发人员提供了完美的Struts支持。在WEB工程上单击右键弹出快捷菜单,如图1.1.4所示。

Struts 1基础入门_model1_04 

图1.1.4 导入Struts

在右键快捷菜单中依次单击【MyEclipse】→【Add Struts Capabilities…】弹出如图1.1.5所示的对话框。

 Struts 1基础入门_ssh_05

图1.1.5 配置对话框

Ø 图中①处用来设置Struts配置文件的路径,通常采用默认值放在WEB-INF文件夹中

Ø 图中②处用来选择Struts的版本,这里选择Struts 1.3

Ø 图中③处用来设置ActionServlet的名字和拦截以哪个扩展名结尾的HTTP请求,通常采用默认设置即可

Ø 图中④处用来设置包名,可以自定义,但是要注意命名规范

Ø 图中⑤处用来设置资源文件名,会在后面讲解,这里暂时不作介绍

Ø 图中⑥处暂时不要选中,以后会进行介绍

另外还需要导入Oracle所需的Jar包,按照上述说明配置好后单击【Finish】按钮就可以看到如图1.1.6所示的项目结构。

 Struts 1基础入门_业务逻辑_06

图1.1.6 项目整体结构

通过上图可以看到MyEclipse已经把Struts所需的Jar包导入到了项目中,并且自动生成了配置文件struts-config.xml。我们在图1.1.5中进行的配置已经以代码的形式在web.xml中自动生成,如示例1.1所示。

示例1.1

<?xml version="1.0" encoding="UTF-8"?>
<servlet>
<!--Servlet名称-->
<servlet-name>action</servlet-name>
<!--Servlet类 -->

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<!--加载Struts配置文件 -->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!--配置Servlet映射 -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>



通过上一阶段的学习,我们知道web.xml是Java Web应用程序的配置文件,可以配置欢迎页面、Servlet、过滤器等。在进行Struts开发时,我们需要在这个文件中配置Struts的核心控制器ActionServlet及其映射。上述代码中配置的ActionServlet负责拦截所有扩展名为“.do”的请求。

(2) 创建模型(Model)

本示例需要两个JavaBean,一个是实体类Admin.java,另一个是操作数据库的业务逻辑类AdminDao。示例1.2给出了实体类的参考代码。

示例1.2

package com.yourcompany.struts;
public class Admin {
private int id; //登录ID
private String name; //登录名称
private String pwd; //登录密码
public Admin() {
}
public Admin(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
//省略Getter/Setter方法
}



实体类Admin对应了数据库中的管理员表,该类比较简单,不再多述。

(3) 创建实现数据库操作的Dao类,代码如示例1.3所示。

示例1.3

public class AdminDao {
public boolean checkLogin(String name,String pwd) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
boolean jg=false;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String connURL="jdbc:oracle:thin:@localhost:1521:orcl";
conn = DriverManager.getConnection(connURL, "system", "orcl");
stmt=conn.prepareStatement("select * from admin where name=? and
pwd=?");
stmt.setString(1, name);
stmt.setString(2, pwd);
rs=stmt.executeQuery();
if(rs.next()) {
jg=true;
}
} catch (Exception e) {
e.printStackTrace();
} finally{
//部分代码省略
}
return jg;
}
}



该类使用JDBC实现了登录验证功能,如果用户名和密码正确就返回true,否则返回false。

(4) 创建登录页面login.jsp,代码如示例1.4所示。

示例1.4

<form action="login.do" method="post" name="loginForm">
<table width="397" height="169" border="0" align="center">
<tr>
<td colspan="2" align="center">管理员登录</td>
</tr>
<tr>
<td width="163" align="right">登录名称:</td>
<td width="218"><input name="logname"type="text" class="txt"></td>
</tr>
<tr>
<td align="right">登录密码:</td>
<td><input name="logpwd" type="password" class="txt"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit"
value="提交"></td>
</tr>
</table>
</form>



该登录页面比较简单,但是需要注意表单中加粗斜体部分的代码。在​<form action="login.do" method="post" name="loginForm">​中的action="login.do"用来设置表单被提交至哪个程序进行处理,以扩展名“.do”结尾可以保证能被Struts核心控制器ActionServlet拦截。登录名称和登录密码表单元素的名字可以自定义,但是需要与下面第5步中ActionForm中的属性名保持一致。

(5) 创建ActionFrom,代码如示例1.5所示。

示例1.5

import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm{
private String logname;
private String logpwd;
public String getLogname() {
return logname;
}
public void setLogname(String logname) {
this.logname = logname;
}
public String getLogpwd() {
return logpwd;
}
public void setLogpwd(String logpwd) {
this.logpwd = logpwd;
}
}



LoginForm是我们创建的一个ActionForm,它继承了org.apache.struts.action.ActionForm类。ActionFrom的主要作用是自动封装表单数据。需要注意的是:该类中的属性名必须与表单中的元素名保持一致。当用户提交登录表单时,表单中的登录名称和登录密码会被自动封装并保存到LoginForm类的对应属性中,我们可以通过getter方法获得这些数据。

(6) 创建主页面和错误页面,代码如示例1.6所示。

示例1.6

//主页index.jsp
<%@ page language="java" import="java.util.*,com.yourcompany.struts.*" pageEncoding="utf-8"%>
<html>
<head>
<title>主页</title>
</head>
<body>
<%
Admin a=(Admin)request.getAttribute("admin");
%>
<center>登录成功,欢迎<%= a.getName() %>进入主页面</center>
</body>
</html>
//错误页面fail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>错误页面</title>
</head>
<body>
<center>登录失败,请重试!</center>
</body>
</html>



当用户登录成功后将跳转到主页面index.jsp,否则跳转到错误页面fail.jsp。

(7) 创建业务逻辑控制器,继承Action,并重写其execute方法,代码如示例1.7所示。

示例1.7

public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest req,HttpServletResponse res)
{
LoginForm lf=(LoginForm)form;
String logname=lf.getLogname();
String logpwd=lf.getLogpwd();
AdminDao ad=new AdminDao();
if(ad.checkLogin(logname, logpwd))
{
req.setAttribute("admin", new Admin(logname,logpwd));
return mapping.findForward("success");
}
else
return mapping.findForward("fail");
}
}


LoginAction类是我们创建的一个业务逻辑控制器,该类继承了org.apache.struts.action.Action并重写了execute方法,几乎所有的业务处理代码都放在该方法中。当客户端请求被ActionServlet配发到某个业务逻辑控制器时,Struts会自动调用该控制器中的execute方法进行业务处理。该方法有四个参数,详见表1-1-1所示。

表1-1-1 execute方法参数列表

参数名

参数说明

ActionMappingmapping

对应Struts配置文件中的forward元素,主要用来根据业务处理结果实现页面跳转,下面会做详细介绍

ActionForm  form

对应项目中的某个ActionForm,例如本例中的LoginForm

HttpServletRequest  req

当前HTTP请求对象

HttpServletResponse res

当前HTTP响应对象

在上述代码的execute方法中,我们首先从封装了表单数据的LoginForm中取出登录名和登录密码,然后调用AdminDao对象的checkLogin方法进行登录验证,最后根据结果通过ActionMapping实现页面跳转。

(8) 通过上面的步骤我们已经把项目所需的控制器、模型和视图全部创建完毕,下面开始在struts-config.xml中进行集中配置,这是进行Struts开发的重中之重。struts-config.xml是Struts专用的配置文件,默认放在WEB-INF文件夹中,主要用来配置业务逻辑控制器Action、ActionForm、视图以及它们之间的执行关系。表1-1-2列出了Struts配置文件中常用的配置元素。

表1-1-2 Struts配置元素

配置元素

说明

<struts-config>

Struts 1配置文件的根元素

<form-beans>

用来配置项目中的ActionFrom,包含<form-bean>子元素,一个子元素配置一个ActionFrom

<action-mappings>

用来配置项目中的业务逻辑控制器Action,包含<action>子元素,一个子元素配置一个Action

<message-resources>

用来配置本地化消息资源文件,可以实现国际化

下面我们开始配置本项目中的struts-config.xml文件,首先配置ActionForm,部分参考代码如下所示。

<form-beans>
<form-bean name="LoginForm" type="com.yourcompany.struts.LoginForm" />
</form-beans>



ActionForm主要通过<form-bean>元素进行配置,表1-1-3列出了<form-bean>元素的主要属性。

表1-1-3 <form-bean>元素的主要属性

属性

说明

name

用来设置ActionForm的名字,该名字必须是唯一标识符

type

用来设置ActionForm的完整类名

接下来配置业务逻辑控制器Action,Action主要负责从ActionForm中取出用户提交的数据,然后调用相应的模型进行业务处理,最后根据处理结果跳转到不同的视图。因此,Action与ActionFrom、模型和视图都有关联,所以在配置Action时略显复杂。下面是配置本项目中Action的部分参考代码。

<action-mappings>
<action
name="LoginForm"
path="/login"
scope="request"
type="com.yourcompany.struts.LoginAction">
<!-- 部分代码省略 -->
</action>
</action-mappings>



所有的Action都配置在<action-mappings>元素中,一个<action>元素配置一个Action,表1-1-4列出了<action>元素的常用属性。

表1-1-4 <action>元素的常用属性

属性

说明

name

此属性并不是Action的名字,而是与之关联的ActionFrom的名字,即在<form-bean>元素中的名字

type

用来设置Action的实现类,必须给出完整类名

path

用来设置路径名,ActionServlet拦截此路径并转发给Action,此路径名必须与<form>表单action属性的值保持一致

scope

用来设置相关联的ActionForm的作用域,可以取值request和session,默认值为request

然后通过<forward>元素配置视图跳转,<forward>元素是上面<action>元素的子元素。在本项目中,当用户登录成功后跳转到主页面(index.jsp),否则跳转到错误页面(fail.jsp),部分参考代码如下所示。

<action
<!-- 部分代码省略 -->
>
<forward name="fail" path="/fail.jsp" />
<forward name="success" path="/index.jsp" />
</action>



表1-1-5列出了<forward>元素的常用属性。

表1-1-5 <forward>元素的常用属性

属性

说明

name

用来设置一个逻辑名,在Action类中使用,例如:mapping.findForward("success");可以跳转到nam为“success”的forward的path中设置的”/index.jsp”页面。

path

用来设置某个视图的路径

redirect

用来设置是否使用重定向。取值为true时,表示在跳转过程中使用重定向的方式,取值为false时表示使用转发的方式,默认值为false

示例1.8给出了本项目中struts-config.xml文件的完整代码,请大家结合上面的讲解进行分析。

示例1.8

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
<form-beans >
<form-bean name="LoginForm" type="com.yourcompany.struts.LoginForm" />
</form-beans>

<action-mappings>
<action
name="LoginForm"
path="/login"
scope="request"
type="com.yourcompany.struts.LoginAction">
<forward name="fail" path="/fail.jsp" />
<forward name="success" path="/index.jsp" />
</action>
</action-mappings>

<message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>



至此,我们使用Struts 1开发的一个项目已经完工。下面把该项目部署到Tomcat服务器上后进行测试。首先打开登录页面login.jsp,如图1.1.7所示。

Struts 1基础入门_struts_07 

图1.1.7 登录页面

当用户输入正确的登录名称和密码并单击【提交】按钮后,我们发现程序跳转到了主页面index.jsp,如图1.1.8所示。

Struts 1基础入门_model1_08 

图1.1.8 登录成功

当用户输入错误的登录名称和密码并单击【提交】按钮后,我们发现程序跳转到了错误页面fail.jsp,如图1.1.9所示。

Struts 1基础入门_struts_09 

图1.1.9 登录失败


1.4.2 Struts 1运行流程

前面我们已经使用Struts 1开发了一个简单的登录程序,下面我们以这个程序为例来介绍Struts 1的运行流程,从而更进一步的了解Struts 1框架,我们看图1.1.10。

Struts 1基础入门_model1_10 

图1.1.10 Struts1框架运行流程

下面我们按照上图中的运行流程详细分析登录过程。

(1) 客户端浏览器打开login.jsp页面,输入登录名称和登录密码后提交表单,这时客户端向服务器端发送了一个HTTP请求,该请求包含表单数据并以“.do”结尾。

(2) 服务器端的ActionServlet接收并拦截来自客户端的HTTP请求,同时读取struts-config.xml文件并按照action配置中的name属性配置将请求中的表单数据封装到一个FormBean中,即LoginForm。

(3) ActionServlet按照type属性配置把HTTP请求转发给相应的Action(LoginAction)进行处理。

(4) Action(LoginAction)接收到HTTP请求后立即执行execute方法,先从LoginForm中取出表单数据。

(5) 调用JavaBean(AdminDao)实现登录验证。

(6) 根据验证结果返回相应的ActionForward给ActionServlet。

(7) ActionServlet根据配置和返回的ActionForward转发请求到相应的视图。如果登录成功转发到index.jsp,否则转发到fail.jsp。

(8) 如果转发到了index.jsp,那么该页面调用JavaBean(Admin)取出了登录名称并显示。

1.4.3 使用MyEclipse简化Struts开发

我们在开发上面的登录项目时,其中的Action(LoginAction)、ActionForm(LoginForm)等都是手工创建并配置的,这无疑会影响开发效率,还容易出错。MyEclipse充分考虑到了这一点,并在较高的版本中提供了图形化开发支持。

我们打开上面项目中的struts-config.xml文件,进入设计(Design)视图,如图1.1.11所示。

Struts 1基础入门_ssh_11 

图1.1.11 设计视图

通过上图可以看到,MyEclipse能够以图形化的方式来展现Struts配置文件,同时也支持以图形化的方式进行开发。下面我们以图形化的方式创建一个ActionForm,在设计视图的空白处单击右键弹出快捷菜单,如图1.1.12所示。

Struts 1基础入门_业务逻辑_12 

图1.1.12 新建Form

依次单击【New】→【Form】菜单,弹出如图1.1.13所示的对话框。在这个对话框中通过相应的设置即可完成ActionForm的创建。

Struts 1基础入门_struts_13 

图1.1.13 设置Form

图中①处用来设置ActionForm在Struts配置文件中的名字,即<form-bean>元素name属性的值。图中②处用来设置创建FromBean的方式,默认选择第一项,即新建一个。图中③处用来设置ActionForm的父类,默认选择第一项org.apache.struts.action.Action

.Form。图中④处用来设置ActionForm的完全类名。单击图中的【Add】按钮会弹出一个新的对话框,通过这个对话框可以给ActionForm添加属性,如图1.1.14所示。


 Struts 1基础入门_struts_14



图1.1.14 添加属性

图中①处用来设置属性的名字,图中②处用来选择属性的数据类型,图中③处用来设置该属性对应的表单元素的类型。所有操作结束后,单击【Finish】按钮就可以在工程中看到RegForm类已经创建成功,在struts-config.xml中可以看到相应的配置代码已经自动生成。

下面我们创建一个Action,在图1.1.12中的右键快捷菜单里,依次单击【New】→【Action】,弹出如图1.1.15所示的对话框。

Struts 1基础入门_model1_15 

图1.1.15 新建Action

图中①处用来设置该Action负责处理哪个路径的客户端请求。图中②处用来设置Action的类型,默认选中【Type】。图中③处用来设置创建Action的方式,默认选中【Create new Action class】,即新建一个Action。图中④处用来设置Action的父类,默认选择第一项。图中⑤处用来设置该Action的完全类名。图中⑥处用来设置该Action要使用哪个ActionForm,单击后面的【Browse…】按钮即可选择项目中任意一个ActonForm。其他地方均采用默认设置即可,最后单击【Finish】按钮就可以在项目中看到RegAction已经创建成功,在struts-config.xml中可以看到相应的配置代码已经自动生成。

此外,在图1.1.15下半部分的几个选项卡页中,【Forwards】页可以设置这个Action中的跳转动作,在【Forwards】选项卡中点击【Add】按钮,弹出的对话框中输入forward的Name和Path,再点击【Add】即可添加一个forward,可连续添加多个forward,完成后点击【Close】即可,如图1.1.16所示。


 Struts 1基础入门_业务逻辑_16

注意:

虽然MyEclipse对Struts开发提供了很好的支持,但是建议大家在学习阶段尽量使用手工方式开发,以更加牢固得掌握Struts运行的过程和原理。


本章总结

Ø 框架(framework)是某种应用的半成品,是一个可重用、可定制的组件。框架可以使我们的开发更加简单和高效,并且能够保证程序具有良好的健壮性、重用性和扩展性。

Ø Struts是基于MVC模式的应用框架,所以MVC模式中的控制器、视图和模型在Struts中都存在。

(1)模型(Model)

Struts 1的模型由JavaBean组成,一般可以分为两类:实体类和业务逻辑类。实体类用来存储和传递数据,业务逻辑类封装底层的业务逻辑,例如数据库操作。

(2)视图(View)

Struts 1的视图通常由JSP实现,但是Struts 1提供了丰富的标签库,可以最大限度的减少Java脚本的使用,并增强了视图功能。另外,Struts 1中的ActionForm也属于视图,它一般对应表单,用来封装客户端请求的参数。

(3)控制器(Controller)

Struts 1的控制器由两部分组成:核心控制器和业务逻辑控制器。由Struts 1框架提供。该控制器继承自HttpServlet类,用来负责拦截所有来自客户端的请求,并根据Struts配置文件(struts-config.xml)把请求转发给相应的业务逻辑控制器(Action)或视图(JSP)。

业务逻辑控制器通常由开发人员创建,并通过调用相应的模型(Model)来处理客户端请求。

Ø 开发Strust1应用的步骤:

(1) 创建WEB工程并导入Struts 1框架的Jar包。

(2 ) 创建模型(Model)。

(3) 创建登录页面。

(4) 创建ActionFrom封装表单数据。

(5) 创建业务逻辑控制器,继承Action,并重写其execute方法。

(6) 在struts-config.xml中进行集中配置。




任务实训部分

1:查询管理员

训练技能点

​使用MyEclipse手工编码配置进行Struts1开发​

需求说明

使用理论部分的数据库,并实现查询功能。使用一个页面把所有的管理员信息显示出来。

实现步骤

(1) 使用MyEclipse创建工程并添加Struts支持

(2) 创建对应管理员表的实体Bean(Admin)

(3) 由于在多个地方都要使用JDBC进行数据库操作,所以需要创建一个DAO工厂类DaoFactory,实现数据库连接和关闭

(4) 创建实现查询功能的JavaBean(AdminDao),把所有数据封装到List中

(5) 创建业务逻辑控制器(QueryAction),在execute方法中调用AdminDao查询所有的管理员信息保存到集合,并将集合对象存储到request中,参考代码如下所示。

public class QueryAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AdminDao ad=new AdminDao();
List<Admin> adminList=ad.getAllAdmin();
request.setAttribute("adminList", adminList);
return mapping.findForward("list");
}
}



(6) 创建显示管理员信息的视图list.jsp,首先从request对象中取出集合对象,然后通过循环把集合中的管理员信息输出到页面上,参考代码如下所示。

<body>
<table width="350" border="1" align="center">
<caption>管理员列表</caption>
<tr bgcolor="darkgray">
<td align="center">管理员编号</td>
<td align="center">管理员名称</td>
</tr>
<%
List<Admin> adminList=(List<Admin>)request.getAttribute("adminList");
for(int j=0;j<adminList.size();j++)
{
Admin admin=adminList.get(j);
%>
<tr>
<td align="center"><%=admin.getId() %></td>
<td align="center"><%=admin.getName() %></td>
</tr>
<%
}
%>
</table>
<br>
<center><a href="addAdmin.html">添加管理员</a></center>
</body>
(7) 在struts-config.xml中进行Action配置,参考代码如下所示。
<action
path="/query"
type="com.yourcompany.struts.QueryAction">
<forward name="list" path="/list.jsp" />
</action>



(8) 部署项目并访问http://localhost:8080/Web应用名/query.do,运行效果如图1.2.1所示。

Struts 1基础入门_业务逻辑_17 

图1.2.1 运行效果

2:添加管理员

训练技能点

使用MyEclipse手工编码配置进行Struts 1开发

需求说明

在上一任务的基础上实现添加管理员功能,创建一个视图addAdmin.html,用户输入登

录名称和登录密码后可以把这些数据信息保存到数据库中

实现步骤

(1) 在AdminDao类中增加一个使用JDBC添加管理员的方法addAdmin()

(2) 创建视图addAdmin.html,提供添加管理员的界面

(3) 创建ActionForm对应视图addAdmin.html

(4) 创建业务逻辑控制器(AddAction),在execute方法中调用AdminDao里添加管理员的方法,参考代码如下所示。

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AddForm addForm = (AddForm) form;
AdminDao ad=new AdminDao();
if(ad.addAdmin(addForm.getLogName(), addForm.getLogPwd1()))
return mapping.findForward("list");
else
return null;
}



(5) 在struts-config.xml中进行相关配置,添加成功后跳转到list.jsp页面,参考代码如下所示。

<form-beans >
<form-bean name="AddForm" type="com.yourcompany.struts.AddForm" />
</form-beans>
<action
name="AddForm"
path="/add"
scope="request"
type="com.yourcompany.struts.AddAction">
<forward
name="list"
path="query.do"
redirect="true" />
</action>



(6) 运行效果如图1.2.2和1.2.3所示。

Struts 1基础入门_业务逻辑_18 

图1.2.2 添加管理员


图1.2.3 成功跳转

Struts 1基础入门_struts_19

3:删除管理员

训练技能点

使用MyEclipse手工进行Struts 1开发

需求说明

在上一任务的基础上,实现删除管理员功能。在管理员列表里,单击每行后边的【​删除​】 超链接可以删除本行的管理员

实现步骤

(1) 在AdminDao类中增加一个使用JDBC删除管理员的方法delAdmin()

(2) 在视图list.jsp中增加【​删除​】超链接,代码如下所示

<a href="del.do?id=<%=admin.getId() %>">删除</a>

(3) 创建业务逻辑控制器(DelAction),在execute方法中调用AdminDao里删除管理员的方法。

(4) 删除成功后跳转到视图list.jsp,效果如图1.2.4所示。

Struts 1基础入门_j2ee架构_20


巩固练习

一、选择题

1. 以下不属于Struts 1组件的是()。

A. Action

B. ActionServlet

C. HTML页面

D. JavaBean

2.在struts-config.xml中配置Action时,scope属性的值可以是()。

A. session

E. application

F. request

G. page

3.以下()需要在struts-config.xml中进行配置。

A. ActionForm

H. ActionServlet

I. Action

J. ActionForward

4.以下关于Struts 1运行流程说法正确的是()。

A. Action拦截客户端请求并处理

B. ActionServlet可以把客户端请求转发给某个Action,也可以转发给某个视图

C. Action在业务处理完后会根据结果直接跳转到某个视图

5.以下说法正确的是()。

A. 一个Action必须对应一个ActionForm

B. <form-bean>元素的name属性必须和表单的name属性的值一致

C. <action>元素的name属性表示自身的逻辑名

D. struts-config.xml文件必须在web.xml文件中进行配置






二、上机练习

在任务实训的基础上,实现修改密码的功能。在管理员列表页面增加【​修改​】超链接,当用户单击某个【​修改​】超链接时跳转到修改密码页面,在这个页面用户必须先输入原密码,然后再输入两次新密码。如果原密码正确才进行修改。运行效果如图1.3.1和1.3.2所示。

 Struts 1基础入门_ssh_21

图1.3.1 增加【​修改​】超链接


图1.3.2 密码修改页面Struts 1基础入门_struts_22

实现思路:

(1) 新建一个根据ID查询管理员信息的Action,例如ModifyAction。把查询出来的管理员信息封装到ActionForm中,可以新建一个ActionForm或者直直接使用AddForm。

(2) 管理员列表页面中的【修改】超链接把选择的管理员的id传到ModifyAction。

(3) 在修改密码页面中,使用EL表达式直接从request中取出ActionForm对象,并显示相应的属性值,这里只显示登录名称。


提示:

所有关于信息修改的步骤都可以参考上述思路进行。