学习内容

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/javaee
http://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;
else
return 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;
}
else
return 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;
}
else
return 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;
else
return 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 密码修改页面

Struts 2基础入门相关推荐

  1. Struts 1基础入门

    学习内容 Ø 框架的概念 Ø Struts 1体系结构 Ø Struts 1运行流程 能力目标 Ø 了解MVC模式的优缺点 Ø 理解框架的概念 Ø 会使用MyEclipse进行Struts 1开发 本 ...

  2. FreeMarker中文帮助手册API文档,基础入门学习文档

    FreeMarker中文帮助手册API文档,基础入门学习文档 分类: 编程技术 发布: bywei 浏览: 7 日期: 2011年5月28日 分享到: QQ空间 新浪微博 腾讯微博 人人网 什么是Fr ...

  3. Struts 2基础

    Struts 2基础 第2章 Struts 2 此内容是<Java Web开发教程--入门与提高篇(JSP+Servlet)>一书附赠资料的一部分. 2.1概述 Struts现在分两个版本 ...

  4. struts1基础入门

    1.struts1工作原理 a> 初始化: struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配 ...

  5. 网络安全之基础入门(一)

    前言:好久没有更新了,主要看了我之前的文章,觉得有些滥竽充数,以后我尽量保证每篇文章的质量,所以更新周期可能慢一点 基础入门 壹.基础概念 域名 1.什么是域名 域名(英语:Domain Name), ...

  6. 一、SpringMVC基础入门,创建一个HelloWorld程序

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  7. Spring入门到精通:第一章 基础入门:1.Spring框架概述

    Spring入门到精通:第一章 基础入门:1.Spring框架概述 前言:为什么要学习Spring框架? 为什么要学习Spring框架呐? (1)使用广泛:现在很多的企业都有Spring的影子,不管是 ...

  8. 用python循环语句求素数_Python基础入门_3条件语句和迭代循环

    Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...

  9. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

最新文章

  1. python基础===拆分字符串,和拼接字符串
  2. 探讨 | 目前SLAM存在的问题
  3. 史上最详细Docker安装Redis (含每一步的图解)实战
  4. Observer观察者设计模式
  5. 简述一下你对mysql事物的理解_面试题:说说你对数据库事务的理解
  6. Spring学习(三)Spring AOP 简介
  7. jquery关于多个显示隐藏
  8. linux 去掉 ^M 的方法
  9. linux的文件 I/O操作
  10. dns服务器的配置与管理
  11. 数据库表存放在哪里_一文了解数据库和数据仓库
  12. php 正则提取连续字母,PHP匹配连续的数字或字母的正则表达式
  13. glob.glob()、sort() 等一些函数的用法
  14. FireMonkey 做界面的一个小技巧
  15. HikariCP连接池
  16. PDF转Word教程
  17. Java:获取map的key和value
  18. 计算机培训结业典礼主持词,培训结业典礼主持词范文(一)
  19. 论文解读(GMI)《Graph Representation Learning via Graphical Mutual Information Maximization》
  20. microsoft edge 浏览器添加兼容网址

热门文章

  1. 看动画学算法之:排序-快速排序
  2. 八张图彻底了解JDK8 GC调优秘籍-附PDF下载
  3. python数据科学实践指南_《Python数据科学实践指南》——导读-阿里云开发者社区...
  4. 学习Promise之前你必须理解的知识点:异步处理的通用模型
  5. 搭建AWStats日志分析系统
  6. java多语言编程语言_为什么很多程序员信仰“Java是世界上最好的编程语言”
  7. IETester - IE5.5、IE6、IE7、IE8、IE9共存
  8. Java:用POI读写Excel
  9. matlab读int16读文件_MATLAB——文件读写(1)
  10. deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++