学习内容
Ø 框架的概念
Ø 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的工作原理。
图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。
图1.1.2 Struts官方网站
1.3.2 Struts 1体系结构
前面我们讲过Struts是基于MVC模式的应用框架,所以MVC模式中的控制器、视图和模型在Struts中都存在,详见图1.1.3所示的Struts1体系结构。
图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所示。
图1.1.4 导入Struts
在右键快捷菜单中依次单击【MyEclipse】→【Add Struts Capabilities…】弹出如图1.1.5所示的对话框。
图1.1.5 配置对话框
Ø 图中①处用来设置Struts配置文件的路径,通常采用默认值放在WEB-INF文件夹中
Ø 图中②处用来选择Struts的版本,这里选择Struts 1.3
Ø 图中③处用来设置ActionServlet的名字和拦截以哪个扩展名结尾的HTTP请求,通常采用默认设置即可
Ø 图中④处用来设置包名,可以自定义,但是要注意命名规范
Ø 图中⑤处用来设置资源文件名,会在后面讲解,这里暂时不作介绍
Ø 图中⑥处暂时不要选中,以后会进行介绍
另外还需要导入Oracle所需的Jar包,按照上述说明配置好后单击【Finish】按钮就可以看到如图1.1.6所示的项目结构。
图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所示。
图1.1.7 登录页面
当用户输入正确的登录名称和密码并单击【提交】按钮后,我们发现程序跳转到了主页面index.jsp,如图1.1.8所示。
图1.1.8 登录成功
当用户输入错误的登录名称和密码并单击【提交】按钮后,我们发现程序跳转到了错误页面fail.jsp,如图1.1.9所示。
图1.1.9 登录失败
1.4.2 Struts 1运行流程
前面我们已经使用Struts 1开发了一个简单的登录程序,下面我们以这个程序为例来介绍Struts 1的运行流程,从而更进一步的了解Struts 1框架,我们看图1.1.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所示。
图1.1.11 设计视图
通过上图可以看到,MyEclipse能够以图形化的方式来展现Struts配置文件,同时也支持以图形化的方式进行开发。下面我们以图形化的方式创建一个ActionForm,在设计视图的空白处单击右键弹出快捷菜单,如图1.1.12所示。
图1.1.12 新建Form
依次单击【New】→【Form】菜单,弹出如图1.1.13所示的对话框。在这个对话框中通过相应的设置即可完成ActionForm的创建。
图1.1.13 设置Form
图中①处用来设置ActionForm在Struts配置文件中的名字,即<form-bean>元素name属性的值。图中②处用来设置创建FromBean的方式,默认选择第一项,即新建一个。图中③处用来设置ActionForm的父类,默认选择第一项org.apache.struts.action.Action
.Form。图中④处用来设置ActionForm的完全类名。单击图中的【Add】按钮会弹出一个新的对话框,通过这个对话框可以给ActionForm添加属性,如图1.1.14所示。
图1.1.14 添加属性
图中①处用来设置属性的名字,图中②处用来选择属性的数据类型,图中③处用来设置该属性对应的表单元素的类型。所有操作结束后,单击【Finish】按钮就可以在工程中看到RegForm类已经创建成功,在struts-config.xml中可以看到相应的配置代码已经自动生成。
下面我们创建一个Action,在图1.1.12中的右键快捷菜单里,依次单击【New】→【Action】,弹出如图1.1.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所示。
注意:
虽然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所示。
图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所示。
图1.2.2 添加管理员
图1.2.3 成功跳转
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所示。
巩固练习
一、选择题
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所示。
图1.3.1 增加【修改】超链接
图1.3.2 密码修改页面
实现思路:
(1) 新建一个根据ID查询管理员信息的Action,例如ModifyAction。把查询出来的管理员信息封装到ActionForm中,可以新建一个ActionForm或者直直接使用AddForm。
(2) 管理员列表页面中的【修改】超链接把选择的管理员的id传到ModifyAction。
(3) 在修改密码页面中,使用EL表达式直接从request中取出ActionForm对象,并显示相应的属性值,这里只显示登录名称。
提示:
所有关于信息修改的步骤都可以参考上述思路进行。