struts 2.0 学习笔记

(1)
struts2与struts1相比,有了很多改进.它是在WebWork基础发展起来.从某种程序上讲,struts2没有继承struts1的血统,而是继承了WebWork的血统,是WebWork的升级.因此稳定性,性能等各方面都有很好的保证;而且吸收了struts1与WebWork两者的优势.
 
Struts 2 Action默认拦截所有后辍为.action的请求(struts1.0是以*.do的格式).因此,当我们需要将某个表单提交到Action处理时,则应该将表彰的action属性设置为*.action的格式.
 
(2)
下载与安装struts 2.0:
1)
登录 [url]http://struts.apache.org/download.cgi#Struts206[/url] 站点,下载 Struts  2 的最新 GA
版。在 Struts 2.06 下有这样一个选项: Full Distribution:下载 Struts 2 的完整版。通常建
议下载该选项。
下载 Struts 2 的完整版,将下载到的 Zip 文件解压缩,
该文件就是一个典型的 Web 结构,该文件夹包含如下文件结构:
apps:该文件夹下包含了基于 Struts  2 的示例应用,这些示例应用对于学习者是非
常有用的资料。
docs:该文件夹下包含了 Struts  2 的相关文档,包括 Struts  2 的快速入门、Struts  2
的文档,以及 API 文档等内容。
j4:该文件夹下包含了让 Struts 2 支持 JDK 1.4 的 JAR 文件。
lib:该文件夹下包含了 Struts 2 框架的核心类库,以及 Struts 2 的第三方插件类库。
src:该文件夹下包含了 Struts 2 框架的全部源代码。
2)
为了给 Web 应用增加 Struts 2 功能,只需要将 Struts 2 安装到 Web 应用中即可。在 Web
应用中安装 Struts 2 框架核心只需要经过如下三个步骤。
1.修改 web.xml 文件,在 web.xml 文件中配置 Struts 2 的核心 Filter。
2.将 Struts 2 框架的类库复制到 Web 应用的 WEB-INF/lib 路径下。
3.在 WEB-INF/classes 下增加 struts.xml 配置文件。
下面是增加了 Struts 2 功能后 Web 应用的文件结构:
Struts2qs
|-WEB-INF
|
|-classes(struts.xml)
|-lib(commons-logging.jar,freemarker.jar,ognl.jar,struts2-core.jar,xwork.jar)
|-web.xml
|-login.jsp
运行环境说明:
此处需要指出的是,Struts 2 的 Web 应用默认需要 Java 5 运行环境,
为了简单起见,笔者建议读者使用 Java  5 运行时环境,使用 Tomcat 5.5 或者更高版本。
 
(3)
从一实例来讲解Struts 2.0的用法:
(1)
从用户请求开始:(部分代码)
<!--  提交请求参数的表单 -->
<form action="Login.action" method="post">
<table align="center">
<caption><h3>用户登录</h3></caption>
<tr>
<!--  用户名的表单域 -->
<td>用户名:<input type="text" name="username"/></td>
</tr>
<tr>
<!--  密码的表单域 -->
<td>密&nbsp;&nbsp;码:<input type="text" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="登录"/><input
type="reset" value="重填" /></td>
</tr>
</table>
</form>
(2)
实现控制器类
POJO,Plain Old Java Object,即是普通的Java类,POJO可以看做是简单的JavaBean(具有一系列
Getter,Setter方法的类)。
Struts 2 下的控制器不再像 Struts 1 下的控制器,需要继承一个 Action 父类,甚至可以
无需实现任何接口,Struts 2 的控制器就是一个普通的 POJO。
实际上,Struts 2 的 Action 就是一个包含 execute 方法的普通 Java 类,该类里包含的多
个属性用于封装用户的请求参数。
//Struts 2 的 Action 类就是一个普通的 Java 类
public class LoginAction
{
//下面是 Action 内用于封装用户请求参数的两个属性
private String username;
private String password;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
//处理用户请求的 execute 方法
public String execute() throws Exception
{
//当用户请求参数的 username 等于 scott,密码请求参数为 tiger 时,返回 success
字符串
//否则返回 error 字符串
if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
return "success";
}
else
{
return "error";
}
}
}
上面的 Action 类是一个再普通不过的 Java 类,该类里定义了两个属性:username 和
password,并为这两个属性提供了对应的 setter 和 getter 方法。除此之外,该 Action 类里还
包含了一个无参数的 execute 方法――这大概也是 Action 类与 POJO 唯一的差别。
提示:
表面上看起来,该 Action 的两个属性只提供了对应的 setter 和 getter方法,很难理解请求参数
在什么时候赋值给该  Action  的属性,事实上,因为 Struts 2 的拦截器机制,它们负责解析用户
的请求参数,并将请求参数赋值给 Action 对应的属性。
(3)
配置 Action
上面定义了Struts 2的Action,但该Action还未配置在Web应用中,还不能处理用户请求。为了让该
Action 能处理用户请求,还需要将该Action配置在struts.xml文件中。
struts.xml 文件应该放在 WEB-INF/classes 路径下,该文件主要放置 Struts 2 的 Action 定义。
<struts>
<!-- Struts 2 的 Action 必须放在指定的包空间下定义 -->
<package name="strutsqs" extends="struts-default">
<!--  定义 login 的 Action,该 Action 的实现类为 lee.Action 类 -->
<action name="Login" class="lee.LoginAction">
<!--  定义处理结果和资源之间映射关系。 -->
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>

(4)
改进控制器 -- 实现 Action 接口:
下面首先看 Action
接口的定义:
public interface Action
{
//下面定义了 5 个字符串常量
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
//定义处理用户请求的 execute 抽象方法
public String execute() throws Exception;
}
在上面的 Action 代码中,我们发现该 Action 接口里已经定义了 5 个标准字符串常量:
SUCCESS、NONE、ERROR、INPUT 和 LOGIN,它们可以简化 execute 方法的返回值,
并可以使用 execute 方法的返回值标准化。
如下:
if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
return SUCCESS;
}
else
{
return ERROR;
}
(5)
跟踪用户状态
跟踪用户状态信息――通常,当一个用户登录成功后,需要将用户的用户名添加为 Session 状态信
息。
(5.1)ActionContext 与 ServeltActionContext
在Web 应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作.
如:
我们需要在Action中取得request请求参数"username"的值:
ActionContext context = ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");

ActionContext
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象
下面我们看看怎么通过ActionContext取得我们的HttpSession:
Map session = ActionContext.getContext().getSession();

ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能,它可以取得的对象有:
1, javax.servlet.http.HttpServletRequest:HTTPservlet请求对象
2, javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象
3, javax.servlet.ServletContext:Servlet 上下文信息
4, javax.servlet.ServletConfig:Servlet配置对象
5, javax.servlet.jsp.PageContext:Http页面上下文
 
为了访问 HttpSession 实例,Struts  2 提供了一个 ActionContext 类,该类提供了一个getSession  的方法,但该方法的返回值类型并不是  HttpSession,而是Map。
虽然 ActionContext 的 getSession 返回的不是 HttpSession 对象,但 Struts 2 的系列拦截 器会负责该 Session 和 HttpSession 之间的转换。
if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
//通过 ActionContext 对象访问 Web 应用的 Session
ActionContext.getContext().getSession().put("user" , getUsername());
return SUCCESS;
}
else
{
return ERROR;
}
(5.2)
使用了JSP 2.0语法来输出Session 中的 user 属性:
<body>
欢迎,${sessionScope.user},您已经登录!
</body>
(6)
增加一个Action,该Action负责获取某个系列的全部书籍。(实现了Action接口)
public class BookService
{
//以一个常量数组模拟了从持久存储设备(数据库)中取出的数据
private String[] books = new String[]{
"Spring2.0 宝典" ,
"轻量级 J2EE 企业应用实战",
"基于 J2EE 的 Ajax 宝典",
"Struts,Spring,Hibernate 整合开发"
};
//业务逻辑方法,该方法返回全部图书
public String[] getLeeBooks()
{
return books;
}
}
新增的 Action 类的代码如下:
public class GetBooksAction implements Action
{
//该属性并不用于封装用户请求参数,而用于封装 Action 需要输出到 JSP 页面信息
private String[] books;
//books 属性的 setter 方法
public void setBooks(String[] books)
{
this.books = books;
}
//books 属性的 getter 方法
public String[] getBooks()
{
return books;
}
//处理用户请求的 execute 方法
public String execute() throws Exception
{
//获取 Session 中的 user 属性
String user = (String)ActionContext.getContext().getSession().get("user");
//如果 user 属性不为空,且该属性值为 scott
if (user != null && user.equals("scott"))
{
//创建 BookService 实例
BookService bs = new BookService();
//将业务逻辑组件的返回值设置成该 Action 的属性
setBooks(bs.getLeeBooks());
return SUCCESS;
}
else
{
return LOGIN;
}
}
}
(7)
输出处理信息
当Action设置了某个属性值后,Struts 2将这些属性值全部封装在一个叫做struts.valueStack 的请
求属性里。
为了在 JSP 页面中输出需要输出的图书信息,我们可以通过如下代码来获取包含全部 输出信息的
ValueStack 对象。
//获取封装输出信息的 ValueStack 对象
request.getAttribute("struts.valueStack");
上面代码返回一个  ValueStack  对象,该对象封装了全部的输出信息。该对象是Struts 2 使用的
一个 ValueStack 对象,可以通过OGNL表达式非常方便地访问该对象封装的信息。
从数据结构上来看,ValueStack 有点类似于 Map 结构,但它比 Map 结构更加强大。Action 所有的
属性都被封装到了 ValueStack 对象中,Action 中的属性名可以理解为 ValueStack 中 value 的名
字。 我们可以通过如下代码来获取 Action 中设置的全部图书信息。
//调用 ValueStack 的 fineValue 方法查看某个表达式的值
vs.findValue("books");
代码如下:
<%
//获取封装输出信息的 ValueStack 对象
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
//调用 ValueStack 的 fineValue 方法获取 Action 中的 books 属性值
String[] books = (String[])vs.findValue("books");   //因为上面定义了属性books
//迭代输出全部图书信息
for (String book : books)
{
%>
<tr>
<td>书名:</td>
<td><%=book%></td>
</tr>
<%}%>
(8)
国际化:
输出国际化信息:
Struts 2 提供了如下两种方式来输出国际化信息:
<s:text name="messageKey"/>:使用 s:text 标签来输出国际化信息。
<s:property value="%{getText("messageKey")}"/>:使用表达式方式输出国际化信息。
(9)
增加数据校验
(9.1)
继承 ActionSupport
ActionSupport  类是一个工具类,它已经实现了  Action  接口。除此之外,它还实现了
Validateable 接口,提供了数据校验功能。通过继承该 ActionSupport 类,可以简化 Struts 2
的 Action 开发。
在 Validatable 接口中定义了一个 validate()方法,重写该方法,如果校验表单输入域出
现错误,则将错误添加到 ActionSupport 类的 fieldErrors 域中,然后通过OGNL表达式负责输出。
改写程序中的 LoginAction,增加重写 validate方法:
public class LoginAction
{
//下面是 Action 内用于封装用户请求参数的两个属性
private String username;
private String password;
...setter,getter......
//处理用户请求的 execute 方法
public String execute() throws Exception
{
//当用户请求参数的 username 等于 scott,密码请求参数为 tiger 时,返回 success
字符串
//否则返回 error 的字符串
if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
return "success";
}
else
{
return "error";
}
}
//完成输入校验需要重写的 validate 方法
public void validate()
{
//如果用户名为空,或者用户名为空字符串
if (getUsername() == null || getUsername().trim().equals(""))
{
//添加表单校验错误
addFieldError("username", "user.required");
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", "pass.required");
}
}
}
上面的 Action 类重写了 validate 方法,该方法会在执行系统的 execute 方法之前执行,
如果执行该方法之后,Action 类的 fieldErrors 中已经包含了数据校验错误,请求将被转发
到 input 逻辑视图处。
以上的addFieldError("password", "pass.required"),不能根据具体的国际化语言进行选择处理.
ActionSupport 类已经提供了国际化信息的能力,它提供了一个 getText(String key)方法,该方
法用于从资源文件中获取国际化信息。为了让校验信息支持国际化,再次改写 Action 里的
validate 方法,改写后的 validate 方法代码如下:
public void validate()
{
//如果用户名为空,或者为空字符串
if (getUsername() == null || getUsername().trim().equals(""))
{
//添加校验错误提示,使用 getText 方法来使提示信息国际化
addFieldError("username", getText("user.required"));
}
if (getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password", getText("pass.required"));
}
}
修改struts.xml,添加input:
<action name="Login" class="lee.LoginAction">
<!--  定义 input 的逻辑视图名,对应 login.jsp 页面 -->
<result name="input">/login.jsp</result>
<!--  定义 error 的逻辑视图名,对应 error.jsp 页面 -->
<result name=" error ">/error.jsp</result>
<!--  定义 welcome 的逻辑视图名,对应 welcome.jsp 页面 -->
<result name="success">/welcome.jsp</result>
</action>
(9.2)
使用 Struts 2 的校验框架
类似于 Struts 1,Struts 2 也允许通过定义配置文件来完成数据校验。Struts 2 的校验框
架实际上是基于 XWork 的 validator 框架。
下面还是使用原来的 Action 类(即不重写 validate 方法),却增加一个校验配置文件,
校验配置文件通过使用 Struts 2 已有的校验器,完成对表单域的校验。Struts 2 提供了大量
的数据校验器,包括表单域校验器和非表单域校验器两种。
下面是校验规则的定义文件:
<?xml version="1.0" encoding="GBK"?>
<!--  指定校验规则文件的 DTD 信息 -->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN"
" [url]http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd[/url]">
<!--  校验规则定义文件的根元素 -->
<validators>
<!--  校验第一个表单域:username -->
<field name="username">
<!--  该表单域必须填写 -->
<field-validator type="requiredstring">
<!--  如果校验失败,显示 user.required 对应的信息 -->
<message key="user.required"/>
</field-validator>
</field>
<!--  校验第二个表单域:password -->
<field name="password">
<field-validator type="requiredstring">
<!--  如果校验失败,显示 pass.required 对应的信息 -->
<message key="pass.required"/>
</field-validator>
</field>
</validators>
定义完该校验规则文件后,该文件的命名应该遵守如下规则:
ActionName-validation.xml:其中 ActionName 就是需要校验的 Action 的类名。
因此上面的校验规则文件应该命名为"LoginAction-validation.xml",且该文件应该与
Action类的class文件位于同一个路径下。因此,将上面的校验规则文件放在WEB-INF/classes/lee
路径下即可。
当然,在 struts.xml 文件的 Action 定义中,一样需要定义 input 的逻辑视图名,将 input
逻辑视图映射到 login.jsp 页面。

(10)
struts.properties 配置文件
Struts 2 框架有两个核心配置文件,其中 struts.xml 文件主要负责管理应用中的 Action
映射,以及该  Action  包含的  Result  定义等。除此之外,Struts  2  框架还包含一个
struts.properties 文件,该文件定义了 Struts 2 框架的大量属性,开发者可以通过改变这些属
性来满足应用的需求。
struts.properties 文件是一个标准的Properties文件,该文件包含了系列的 key-value 对
象,每个 key 就是一个 Struts 2 属性,该 key 对应的value就是一个 Struts 2 属性值。
struts.properties 文件通常放在 Web 应用的 WEB-INF/classes 路径下(即与struts.xml一样的位
置)。
下面列出了可以在 struts.properties 中定义的 Struts 2属性:
struts.configuration:该属性指定加载 Struts  2 配置文件的配置文件管理器。该属性的默认值
是 org.apache.Struts2.config.DefaultConfiguration,这是 Struts 2 默认的配置文件管理器。
如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration 接口的类,该类可以自己加载 Struts 2 配置文件。
struts.locale:指定 Web 应用的默认 Locale。
struts.i18n.encoding:指定  Web  应用的默认编码集。该属性对于处理中文请求参数
非常有用,对于获取中文请求参数值,应该将该属性值设置为 GBK 或者 GB2312。

你可能感兴趣的:(职场,休闲)