Struts 2基础入门

来源:互联网 发布:java怎么以分数形式 编辑:程序博客网 时间:2024/06/16 12:01

学习内容

 Struts 2的优势

 Strust 2体系结构

 Struts 2运行流程

能力目标

 熟悉Struts 2的体系结构和运行流程

 熟练使用MyEclipse进行Struts 2开发 

本章简介

前四章我们学习了Struts 1的相关知识,包括Struts 1体系结构、运行流程、标签库等。Struts 1虽然是经典的MVC框架,但是其自身具有某些天生的设计缺陷,例如:与Servlet API耦合严重、难以测试、侵入式设计等等,为了弥补这些缺陷,Struts 2框架应运而生。

Struts 2并不单单是Struts 1的版本升级,它与Struts 1在体系上差别很大,它使用的是WebWork的核心,而非Struts 1的设计核心。

本章将学习Struts 2基础知识,包括Struts 2体系结构、运行流程等,并且我们会使用Struts 2重构第一章的登录案例,以此来介绍使用MyEclipse进行Struts 2开发的步骤。

核心技能部分

3.1 Struts 2的优势

Struts1是一个经典、成熟的MVC框架,不管是稳定性还是可靠性都得到了广泛的证明。拥有丰富的开发人群,几乎成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1的局限性也越来越多地暴露出来,并且制约了Struts1的继续发展。

 Struts 1与Servlet API耦合严重,测试困难

Struts 1是在Model2基础上发展起来的,基于Servlet API,所以在Struts 1的业务逻辑控制器内充满的Servlet API,例如下面的代码:

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response){

// . . .

}

HttpServletRequest和HttpServletResponse就属于Servlet API中的类,而Servlet API通常是由Web服务器来负责实例化的,所以Struts 1严重依赖Web服务器,一旦脱离了Web服务器,Action就会出现问题。

 Struts 1属于侵入式设计

Struts 1的业务逻辑控制器必须继承基类Action,并且包含了大量的Struts 1 API,例如上述代码中的ActionMapping和ActionForm类。这种侵入式的设计严重影响了代码重用,一旦系统需要重构,这种侵入式的设计将会带来很多的问题。

Struts 2并不单单是Struts 1的版本升级,它与Struts 1在体系上差别很大,有了许多革命性的改进。它使用的是WebWork的核心,而非Struts 1的设计核心,接下来简单介绍一下WebWork。

WebWork来自于一个非常优秀的开源组织:opensymphony,它和Struts 1一样也是诸多MVC开源框架中的一员。WebWork项目在2002年3月发布,它对Struts式的框架进行了革命性改进,相对于Struts 1的那些缺陷和局限性,WebWork则更加优秀。

WebWork采用了一种松耦合设计,使得Action不再与Servlet API和WebWork耦合。WebWork的Action更像一个普通的Java对象,这种设计大大提高了代码重用率,降低了应用复杂度。

目前,Struts已经分化成两个框架,其中一个是Shale,它是一个全新的框架,与Struts关联很少,本书不作介绍。另一个就是Struts 1和WebWork结合后的Struts 2。 

3.2 Struts 2体系结构

Struts 2整合了WebWork和Struts 1的优点,是一个优雅的、扩展性强的框架,它的体系结构如图3.1.1所示。

 

图3.1.1 Struts 2体系结构

上图清晰的显示了Struts 2体系结构中的组件和运行流程,下面我们先介绍这些组件。

(1) FilterDispatcher是Struts 2中最重要的一个类,它相当于Struts 1中的核心控制器ActionServlet。该类其实是一个过滤器,在web.xml文件中进行配置,负责拦截客户端请求。

(2) Action映射器即ActionMapper,它是客户端请求和Action调用请求之间的映射,可以解除Action对于Servlet API的依赖。ActionMapper会根据客户端请求的URI来查找是否存在对应的Action,如果有就返回一个包含了Action映射信息的数据传输对象ActionMapping;如果没有就返回null。

(3) Action代理即ActionProxy,它是Action的代理,主要作用是如何取得Action并创建ActionInvocation对象。

(4) ActionInvocation就是Action的调用者,它在Action的执行过程中,负责Interceptor(拦截器)、Action和Result等一系列组件的调度。

(5) 拦截器即Interceptor,它是Struts 2的重要特性,Struts 2框架的大多数功能都是通过拦截器实现的。拦截器围绕着Action和Result的执行而执行,拦截器的方法会在Action执行之前或执行之后自动执行,这种方式可以把通用的操作动态的插入到Action执行的前后,非常有利于系统解耦。

(6) Action即业务逻辑控制器,跟Struts 1中的Action所起的作用相似。

(7) Result即结果视图,主要作用是在Action调用结束后调度视图,并决定视图以哪种形式在客户端浏览器展现。

(8) 配置管理器即ConfigurationManager,它负责读取并解析Struts 2的配置文件struts.xml。

上述这些组件会在后续章节中陆续进行详细介绍。下面我们看一下一个HTTP请求在Struts 2框架中的处理流程。

(1) 客户端发送一个HTTP请求到服务器端

(2) FilterDispatcher拦截该请求并询问ActionMapper来决定是否需要调用哪个Action

(3) FilterDispatcher把控制器委派给ActionProxy,ActionProxy会调用配置管理器从

    struts.xml文件中读取配置信息,然后创建ActionInvocation的实例对象

(4) ActionInvocation的实例对象调用Action并执行Action前后的拦截器

(5) 一旦Action执行完毕,ActionInvocation的实例对象会根据struts.xml中的配置找到

应的结果视图来呈现页面

(6) 拦截器会再次被执行,顺序与执行Action时的顺序相反,然后视图会返回给

FilterDispatcher并呈现在客户端浏览器中

3.3 使用Struts 2重构登录案例

在使用Struts 2进行Web开发之前,我们需要从其官方网站(http://struts.apache.org/)上获取Struts 2,目前最新版本是2.2.3。本书中的案例使用的版本是2.2.1,图3.1.2是该版本解压后的资源文件。

 

图3.1.2 Struts2资源包

 apps文件夹中包含了官方提供的Struts 2示例,可供开发者学习参考

 docs文件夹中是官方提供的Struts 2文档

 lib文件夹中是Struts 2的Jar包

 src文件夹中是Struts 2的源代码

示例3.1

下面我们使用Struts 2重构本书第一章的登录案例,以此来介绍使用MyEclipse进行Struts 2开发的基本步骤,并进一步理解Struts 2的体系结构和运行流程。

(1) 在MyEclipse中创建Web工程,然后右键单击工程名添加Struts支持,如图3.1.3所示。

 

图3.1.3 添加Struts支持

(2) 在上图中依次单击【MyEclipse】【Add Struts Capabilities…】后打开如图3.1.4所示的对话框。

 

图3.1.4 配置Struts 2

图中①处用来选择Struts的版本,图中②处用来设置Struts 2过滤器(FilterDispatcher)的名字,图中③处用来设置拦截哪种客户端请求,选择“/*”表示拦截所有客户端请求。设置结束后单击【Finish】按钮打开如图3.1.5所示的对话框。

 

图3.1.5 添加Struts 2类库

上图列出了跟Struts 2相关的所有类库,这里我们只需要选中Struts 2 Core Libraries即可,单击【Finish】按钮结束操作。图3.1.6是创建好的Struts 2项目结构。

 

图3.1.6 项目结构

在上图的项目中,我们可以看到Struts 2的类库和自动生成的配置文件struts.xml。图3.1.7是web.xml配置文件的代码。

 

图3.1.7 web.xml配置文件

web.xml中主要配置了Struts 2的过滤器,对应图3.1.4中的设置,并且代码由MyEclipse自动生成。这里需要注意的是:Struts 2不同版本的核心控制器是不同的,2.0.x版本的核心控制器是我们上面提到的FilterDispatcher;而2.1之后的版本普遍采用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter作为核心控制器。

web.xml默认从WEB-INF/classes路径下加载struts.xml配置文件,如果工程中的Struts配置文件不在默认路径下或者名字不是struts.xml,那么我们需要在web.xml文件中进行设置,参考代码如下所示。

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <filter>  <filter-name>struts2</filter-name>  <filter-class>  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  </filter-class>  <init-param>  <param-name>config</param-name>  <param-value>../struts-config.xml</param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name>struts2</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping></web-app>

我们使用<init-param>元素配置Struts配置文件,上述代码中的“../”表示从默认路径后退一级到WEB-INF文件夹中,struts-config.xml是自定义的Struts配置文件名。

(3) 创建实体类Admin.java、实现数据库连接和关闭的工厂类DaoFactory.java以及使用JDBC实现登录功能的Dao类AdminDao.java,这些类和第一章的一样,此处不在多述。

(4) 创建业务逻辑控制器AdminAction,代码如下所示。

import com.opensymphony.xwork2.ActionSupport;public class AdminAction extends ActionSupport {private int id;private String name;private String pwd;public String execute() {AdminDao ad=new AdminDao();if(ad.checkLogin(name, pwd))return SUCCESS;elsereturn ERROR;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}

Struts 2的Action可以不用继承任何类和实现任何接口,但是为了以后使用方便或增强功能,通常继承com.opensymphony.xwork2.ActionSupport类,此类实现了很多有用的接口,提供了国际化、验证等很多实用功能。Struts 2中无需创建ActionForm,表单中的数据由Action进行封装,所以在上述代码中,出现了与表单对应的属性和getter/setter方法。

(5) 创建登录视图login.jsp,代码如下所示。

<body>  <form action="login.action" method="post">    <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="name" type="text" class="txt"></td>    </tr>    <tr>    <td align="right">登录密码:</td>    <td><input name="pwd" type="password" class="txt"></td>    </tr>    <tr>    <td colspan="2" align="center"><input type="submit" value="提交"></td>    </tr> </table> </form></body>该页面主要包含了一个表单,需要注意的是:表单元素name属性的值必须与前面AdminAction类中的属性一致。(6) 创建登录成功后显示的视图页面index.jsp和登录失败后显示的视图页面fail.jsp,代码如下所示。index.jsp  <body>    <center>登录成功</center>  </body>fail.jsp  <body>    <center>登录失败,请重试!</center>  </body>(7) 打开struts.xml文件进行配置,代码如下所示。<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><package name="default" extends="struts-default"><action name="login" class="com.zy.AdminAction"><result name="success" type="dispatcher">/index.jsp</result><result name="error" type="redirect">/fail.jsp</result></action></package></struts>


Struts 2的配置文件引入了“包机制”,通过“包(package”来管理一个业务逻辑处理单元。package元素的name属性用来设置包名,extends属性类似于Java中的继承,用来继承指定的已存在的包,Struts 2框架的默认包是“struts-default”。

<action>元素用来配置业务逻辑控制器,name属性是必须的,与form表单的action属性的值一致。

<result>元素用来配置Action处理结束后要跳转到哪个视图页面,name属性表示result的逻辑名,必须与Action返回的字符串匹配;type属性表示结果类型,常用的结果类型见表3-1-1所示。

表3-1-1 type属性

结果类型

描述

redirect

    重定向,请求将丢失

dispatcher

    转发请求

 

提示

本案例中的业务逻辑控制是AdminAction类,该类的execute方法返回的SUCCESS和ERROR不是我们自定义的字符串,它们来自于Struts 2的Action接口(ActionSupport类实现了Action接口)。此处我们可以自定义返回字符串,只要跟struts.xml配置文件中result元素的name属性值匹配即可。

(8) 部署并运行该案例,打开登录页面,效果如图3.1.8所示。

 

图3.1.8 登录页面

登录成功后跳转到index.jsp,效果如图3.1.9所示。

 

图3.1.9 登录成功

登录失败后跳转到fail.jsp,效果如图3.1.10所示。

 

图3.1.10 登录失败

至此,我们已经完成了使用Struts 2重构登录案例的任务。下面我们总结一下登录案例在Struts 2中的运行流程。

(1) 用户通过浏览器访问登录页面,如图3.1.8所示。

(2) 输入登录名称和密码后单击【提交】按钮向服务器发送请求“login.action”。

(3) 客户端请求被Struts 2的核心控制器拦截,本案例中是StrutsPrepareAndExecuteFilter。

(4) 核心控制器在经过ActionMapper的确认后将控制器委派给ActionProxy,ActionProxy

调用配置管理器读取struts.xml文件并创建ActionInvocation对象。

(5) ActionInvocation对象调用AdminAction并执行其中的execute方法,然后根据返回的字

符串查找对应的结果视图。登录成功返回SUCCESS并跳转到index.jsp视图页面;登录

失败返回ERROR并跳转到fail.jsp视图页面。

(6) 相应的视图页面被返回给核心控制器并呈现在客户端浏览器中。

3.4 Struts 2访问Servlet API

前面我们讲过Struts 2的优势之一就是大大降低了与Servlet API之间的耦合度,因为Struts 2的Action可以直接封装和传递数据,并且无需继承任何类和实现任何接口。但在某些情况下,我们需要在Action中访问Servlet API的对象,例如登录成功后需要把用户信息保存到session会话中。

Struts 2提供了多种访问Servlet API的方式,最常用两种是:解耦访问方式和耦合访问方式。

3.4.1 与Servlet API的解耦访问方式

为了避免与Servlet API耦合在一起,Struts 2对Servlet API中的HttpServletRequest、HttpSession和ServletContext对象进行了进一步的封装,并使用三个Map对象来进行替代。

Struts 2提供了com.opensymphony.xwork2.ActionContext类来获取这些Map对象,该类是Action执行的上下文,通过该类可以在Action中直接访问对应HttpServletRequest、HttpSession和ServletContext的Map对象。下面是ActionContext类的常用方法。

 public  Object  get(String key);该方法用来获得HttpServletRequest对象,使用的时候传递一个“request”字符串即可。

ActionContext ac = ActionContext.getContext();Map  request = (Map)ac.get(“request”);Ø Map<String, Object>  getSession();该方法用来获得对应HttpSession的Map对象。ActionContext ac = ActionContext.getContext();Map  session = ac.getSession();Ø Map<String, Object>  getApplication();该方法用来获得对应ServletContext的Map对象。ActionContext ac = ActionContext.getContext();Map  application = ac.getApplication();

示例5.2

下面我们完善登录案例,登录成功后保存用户信息到session会话中,并在主页面显示出来。

修改Action的execute方法,代码如下所示。

public String execute() {AdminDao ad=new AdminDao();if(ad.checkLogin(name, pwd)){          //创建ActionContext对象ActionContext ac=ActionContext.getContext();          //创建对应HttpSession的Map对象Map session=ac.getSession();          //保存用户信息session.put("logname", name);return SUCCESS;}elsereturn ERROR;}

由于现在尚未学习Struts 2标签库,所以在页面中我们仍然使用Java小脚本来读取session中的信息。

  

<body>   <%  String logname=(String)session.getAttribute("logname");     %>    <center>恭喜<%=logname %>,登录成功</center>  </body>

图3.1.11是登录成功后的运行效果。

 

图3.1.11 登录成功

3.4.2 与Servlet API的耦合访问方式

Struts 2虽然不推荐与Servlet API的耦合访问方式,但是考虑到某些特殊情况下可能需要直接访问Servlet API,所以Struts 2提供了直接访问Servlet API的方式。

我们可以使用Struts 2中的org.apache.struts2.ServletActionContext类直接获得Servlet API中的对象,该类是ActionContext的子类,表3-1-2列出了该类的常用方法。

表3-1-2 ServletActionContext类的常用方法

方法

描述

public static HttpServletRequest getRequest()

获得HttpServletRequest对象

public static ServletContext getServletContext()

获得ServletContext对象

public static HttpServletResponse getResponse()

获得HttpServletResponse对象

提示

ServletActionContext类并没有定义获得HttpSession对象的方法,但是可以通过HttpServletRequest对象获得。

下面我们修改登录案例,使用ServletActionContext类来实现相同的功能,此时只需修改Action类的execute方法即可,代码如下所示。

public String execute() {AdminDao ad=new AdminDao();if(ad.checkLogin(name, pwd)){HttpSession hs=ServletActionContext.getRequest().getSession();hs.setAttribute("logname", name);return SUCCESS;}elsereturn ERROR;} 

3.5 使用MyEclipse简化Struts 2开发

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

示例3.3

我们打开上面登录案例中的struts.xml文件,切换到设计视图,如图3.1.12所示。

 

图3.1.12 设计视图

登录案例中的相关配置在上图淋漓尽致的表现了出来,非常的直观。在图的右侧有一个面板(Palette),该面板中提供了一些快捷按钮可以让我们以图形化的方式简化Struts 2开发。

单击面板中的按钮后并在相应的package中进行单击,弹出如图3.1.13所示的对话框。

 

图3.1.13 新建Action

在该对话框中可以设置Action的名字、result等内容,单击【Finish】按钮后MyEclipse会自动生成Action和struts.xml文件中的相关代码。

虽然MyEclipse提供高效的图形化开发支持,但是对于初学着来说建议使用手工开发的方式。

本章总结

 Struts 2的优势

(1)Struts 2不与Servlet API耦合严重,测试方便。

(2)Struts 2属于非侵入式设计。

 Struts 2的体系结构

(1)FilterDispatcher是Struts 2中最重要的一个类,它相当于Struts 1中的核心控制器ActionServlet。该类其实是一个过滤器,在web.xml文件中进行配置,负责拦截客户端请求。

(2)拦截器即Interceptor,它是Struts 2的重要特性,Struts 2框架的大多数功能都是通过拦截器实现的。拦截器围绕着Action和Result的执行而执行,拦截器的方法会在Action执行之前或执行之后自动执行,这种方式可以把通用的操作动态的插入到Action执行的前后,非常有利于系统解耦。

(3)Action即业务逻辑控制器,跟Struts 1中的Action所起的作用相似。

(4)Result即结果视图,主要作用是在Action调用结束后调度视图,并决定视图以哪种形式在客户端浏览器展现。

Ø Struts 2访问Servlet API

(1)解耦访问方式。

(2)耦合访问方式。


任务实训部分

1:查询管理员

训练技能点

使用MyEclipse手工进行Struts 2开发

  需求说明

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

  实现步骤

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

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

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

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

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

public String execute() {AdminDao ad=new AdminDao();List<Admin> adminList=ad.getAllAdmin();Map req=(Map)ActionContext.getContext().get("request");req.put("adminList", adminList);return SUCCESS;}

(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.xml中进行Action配置,参考代码如下所示。

<struts><package name="admin" extends="struts-default"><action name="query" class="com.zy.QueryAction"><result name="success" type="dispatcher">/list.jsp</result></action></package></struts>    

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

 

图3.2.1 运行效果

2:添加管理员

训练技能点

使用MyEclipse手工进行Struts 2开发

  需求说明

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

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

  实现步骤

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

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

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

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

public class AddAction extends ActionSupport {private String logName;   //与addAdmin.html表单中的元素名对应private String logPwd1;   //与addAdmin.html表单中的元素名对应public String execute() {AdminDao ad=new AdminDao();if(ad.addAdmin(logName, logPwd1))return SUCCESS;elsereturn ERROR;}

//省略getter和setter方法

}

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

<action name="add" class="com.zy.AddAction"><result name="success" type="redirect">query.action</result><result name="error" type="redirect">/error.jsp</result></action>

在resutle元素中配置跳转结果时,可以设置跳转到某个action,格式是“action的逻辑名.action”。

(6) 运行效果如图3.2.2所示。 

图3.2.2 添加管理员

3:删除管理员

训练技能点

使用MyEclipse手工进行Struts 2开发

  需求说明

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

  实现步骤

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

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

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

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

(4) 删除成功后跳转到视图list.jsp。

4:实现简易计算器

训练技能点

使用MyEclipse手工进行Struts 2开发

  需求说明

在页面上制作一个简单的计算器,实现加、减、乘、除运算,要求用Struts 2实现。  

  实现步骤

(1) 创建Action

(2) 创建包含表单的视图页面

(3) 在struts.xml中进行配置 

图3.2.3 效果图

巩固练习

一、选择题

1. 以下关于Struts 2的说法错误的是()。

A. Struts 2是Struts 1的版本升级,体系没变,修复了一些缺陷

B. Struts 2采用的是WebWork的设计核心

C. Struts 2相比Struts 1变化较大

D. Struts 2融合了Struts 1和Webwork的优点

2. 以下不是Struts 2组件的是()。

A. Action

B. FilterDispatcher

C. ActionForm

D. ActionServlet

3. 以下关于Struts 2配置文件说法正确的是()。

A. 必须放在WEB-INF/classes目录下

B. 名字必须是struts.xml

C. 引入了包(package)

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

4. 以下关于Struts 2的Action说法错误的是()。

A. Action前后可以配置拦截器,也可以不用拦截器

B. Action可以封装请求参数,不再需要ActionForm

C. Action必须继承ActionSupport类

D. Action通常有属性和getter/setter方法

5. 以下关于Struts 2说法错误的是()。

A.  ActionContext的getRequest方法可以获得request对象。

B.  ActionContext的getSession方法可以获得HttpSession对象。

C.  ServletActionContext类的getSession方法可以获得HttpSession对象。

D.  ServletActionContext是ActionContext的子类。

 二、上机练习

 在任务实训的基础上,实现修改密码的功能。在管理员列表页面增加【修改】超链接,

 当用户单击某个【修改】超链接时跳转到修改密码页面,在这个页面用户必须先输入

 原密码,然后再输入两次新密码。如果原密码正确才进行修改。运行效果如图3.3.1

 和3.3.2 所示。

 

图3.3.1 增加【修改】超链接

 

图3.3.2 密码修改页面

 

原创粉丝点击