一 . 下载和安装 DWR 的步骤 :
① 登录 http://struts.apache.org/download.cgi#Struts206 站点 , 下载 Struts2 最新的版本 .
将下载到的 Zip 文件解压缩 , 该文件就是一个典型的 web 结构 , 该文件包含以下文件结构 :
apps: 该文件夹下面包含了基于 Struts 2 的示例应用 , 这些示例应用对于学习者是非常用用的资料 .
docs: 该文件夹下面包含了 Struts2 的相关文档 , 包括 Struts 2 的快速入门 ,Struts 2 的文档 , 以及 API 文档等内容 .
lib: 该文件夹下面包含了 Struts2 框架的核心类库 , 以及 Struts2 的第三方插件类库 .
src: 该文件夹下面包含了 Struts 框架的全部代码 .
② 将 lib 文件夹下面的必要类库复制到 web 应用的 WEB-INF/lib 路径下 , 不需要将所有的 Struts 的全部 jar 包都放到 lib 路径下面 , 将几个核心的 jar 包放到该路径下就可以了 . 在这里 , 用到的可以是 :commons-logging-1.0.4.jar,commons-fileupload-1.2.1.jar,free
marker-2.3.13.jar,ognl-2.6.11.jar,struts2-core-2.0.8.jar,xwork-2.1.2.jar. 这里如果需要在 DOS 或者是在 shell 窗口下面手工编译 Struts2 的相关的程序 , 则还应该将 Struts-core-2.0.8.jar 和 xwor-2.0.1.jar 添加到系统的 CLASSPATH 环境变量中 .
③ 编辑 Web 应用的 web.xml 配置文件 , 配置 Struts2 的核心 Filter, 下面是增加了 Struts2 的核心 Filter 配置的 web.xml 配置文件的代码 :
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < web-app version = "2.4"
- xmlns = "http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <!-- 在该文件中加入struts2的文件内容 -->
- < filter >
- < filter-name > Struts2 </ filter-name >
- < filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
- </ filter >
- <!-- FilterDispatcher用来初始化Struts2并且处理所有的请求 -->
- < filter-mapping >
- < filter-name > Struts2 </ filter-name >
- < url-pattern > /* </ url-pattern >
- </ filter-mapping >
- </ web-app >
经过上面三个步骤 , 我们就可以再一个 Web 应用中使用 Struts2 的基本内容了 .
二 . 从用户请求开始
Struts2 支持大部分视图技术 , 当然也支持传统的 JSP 视图技术 . 本 helloworld 应用将使用最基本的视图技术 :JSP 技术 . 当用户需要登录本系统的时候 , 用户需要一个简单的表单提交页面 , 这个表单提交页面包含了两个表单域 , 用户名和密码 , 下面的代码是一个最简单的表单提交页面 , 仅仅包含有两个表单域 , 甚至没有任何的动态内容 . 实际上 , 整个页面完全可以是一个静态的 HTML 页面 , 但是考虑到需要在该页面的后面增加动态的内容 , 因此依然将该页面用 JSP 为后缀保存 , 下面是用户请求登录的 JSP 页面的代码
- < %@ page language = "java" import = "java.util.*" pageEncoding = "utf-8" % >
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- < html >
- < head >
- < title > struts2的Helloworld </ title >
- </ head >
- < body >
- < form action = "login.action" method = "get" >
- < table align = "center" >
- < caption > < h3 > 用户登录 </ h3 > </ caption >
- < tr >
- <!-- 用户的表单域 -->
- < td > 用户名: < input type = "text" name = "username" /> </ td >
- </ tr >
- < tr >
- <!-- 用户的表单域 -->
- < td > 密 码: < 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 >
- </ body >
- </ html >
正如前面介绍的 , 该页面没有任何的动态的内容 , 完全是一个静态的 HTML 页面 , 但是 , 我们注意到该表单的 action 属性 :login.action. 这个 action 属性比较特殊 , 它不是一个普通的 Servlet, 也不是一个动态的 JSP 页面 . 当表单提交给 login.action 的时候 ,Struts2 的 FilterDispatcher 将自动起作用 , 将用户请求转发到相应的 Struts2 的 Action.(Struts2 Action 默认拦截所有后缀为 .action 的请求 , 因此 , 如果我们需要将某个表单提交给 Struts2 Action 处理 , 则应该将该表单的 action 属性设置为 *.action 的格式 ).
整个页面就是一个标准的 HTML 页面 , 整个单独的页面还没有任何与用户交互的能力 . 下面 , 我们就开始手工的创建一个 Struts2 的 Web 应用 .
三 , 创建 Struts2 的 Web 应用
Struts2 的 Web 应用就是一个普通的 Web 应用 , 然后增加 Struts2 的功能 , 该应用就可以充分利用 Struts2 的 MVC 框架了 .
(1) 创建 WEB 应用
手工的创建一个 Struts2 应用 , 建立一个 Web 应用请按照如下步骤进行 :
① 在任何的目录中新建一个文件夹 , 使用这个文件夹建立一个 web 应用 , 名字一定要使用英文 .
② 在第一步建立好的文件夹中新建一个名字为 ”WEB-INF” 的文件夹 .
③ 进入 Tomcat, 或者任何的其他的 WEB 容器当中 , 找到任何一个 WEB 应用 , 将 WEB-INF 下面的 web.xml 文件复制到第二步所创建的 WEB-INF 文件夹下面 .
④ 修改复制的 web.xml 文件 , 将该文件修改成只有一个根元素的 xml 文件 , 修改之后的 web.xml 文件代码如下 ://TODO
⑤ 在第二步所建的 WEB-INF 路径下 , 新建两个文件夹 ,classes 和 lib, 它们分别用于保存单个的 .class 文件和 Jar 文件 .
经过了上面的步骤 , 我们已经建立了一个空的 WEB 应用 , 这个时候 , 我们就可以将这个建立好的 web 应用复制到 Tomcat 的 webapps 路径下面了 , 这个 WEB 应用将可以自动的部署到 tomcat 当中 .
将定义好的 JSP 页面 ( 就是上面有两个输入框 , 用户名和密码的那个 ) 复制到第一步所建立的文件夹下面 , 该 JSP 页面将成为该 WEB 应用的一个页面 . 该 web 将有如下的文件结构 :
Struts2qs
|-WEB-INF
| |-classes
| |-lib
| |-web.xml
|-login.jsp
上面的 Struts2qs 是 Web 应用所对应的文件夹的名字 , 可以进行更改 ,login.jsp 是该 web 应用下 JSP 的名字 , 也可以修改 , 其他文件夹 , 配置文件都不可以更改 .( 这个地方有点出入 , 我们可以在 web.xml 文件中加入一个标签 welcom-file-list), 然后启动 Tomcat, 在浏览器中输入 http://localhost:8080/struts2/ 可以看到定义好的页面 .
(2) 增加 Struts2 功能
为了给 web 应用增加 Struts2 的功能 , 只需要将 Struts2 安装到 web 应用中就可以了 , 在 web 应用中安装 struts2 框架核心 , 只需要经过以下三个步骤 :
① 修改 web.xml 文件 , 在 web.xml 文件中配置 Struts2 的核心 Filter
② 将 Struts2 框架的类库复制到 web 应用的 WEB-INF/lib 路径下
③ 在 WEB-INF/classes 下面增加 struts.xml 文件 .( 在 Eclipse 环境下面是要放到 src 文件夹下面的 , 这样 eclipse 进行部署的时候 , 就会自动的将 struts.xml 刷到 tomcat 的 classes 文件夹下面去 . 放到别的地方会报错的 )
下面是增加了 Struts2 功能之后的 web 应用的文件结构 :
Struts2qs
|-WEB-INF
| |-classes(struts.xml)
| |-lib( 上面列出的 Struts2 运行时候需要的 jar 包 )
| |-web.xml
|-login.jsp
这里需要指出的是 ,Struts2 的 web 应用默认需要 java 5 运行环境 , 需要 web 容器支持 ServletAPI2.4 和 JSP API2.0, 如果需要使用更低版本的 java 运行时环境 , 则需要使用 struts2 框架的 jdk 1.4 支持 , 为了简单起见 , 建议使用 java5 运行时环境 , 使用 Tomcat5.5 或者更高的版本 .
四 . 实现控制器
(1) 实现控制器类
Struts2 下面的控制器不再像 Struts1 下面的控制器 , 需要继承一个 Action 父类 , 甚至可以无需实现任何接口 ,struts2 的控制器就是一个普通的 pojo.
实际上 Struts2 的 Action 就是一个包含有 execute 方法的普通的 java 类 . 该类里面包含的多个属性用于封装用户的请求参数 , 下面是处理用户请求的 Action 类的代码 :
- package com.supermos.app;
- public class LoginAction {
- 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;
- }
- public String execute() throws Exception{
- if ( "supermos" .equalsIgnoreCase(username)&& "ziwen" .equalsIgnoreCase(password)){
- return "success" ;
- }else {
- return "fail" ;
- }
- }
- }
上面的 Action 类是一个在普通不过的 java 类 , 该类里面定义了两个属性 ,username 和 password, 并且为这两个属性提供了对应的 getter 和 setter 方法 , 除此之外 , 该 Action 类里还包含了一个没有参数的 execute 方法 , 这个大概也就是 struts2 的 Action 和 pojo 唯一的区别 . 实际上 , 这个 execute 方法仍旧是一个非常普通的方法 , 既没有与 ServletApi 耦合 , 也没有与 Struts2 Api 耦合 .
表面上看起来 , 该 Action 的两个属性只是提供了对应的 getter 和 setter 方法 , 很难理解请求参数在什么时候复制给该 Action 属性 , 事实上 , 因为 Struts2 的拦截器机制 , 它们负责解析用户的请求参数 , 并将请求参数赋值给 Action 对应的属性 .
(2) 配置 Action
上面定义了 Struts2 的 Action, 但是该 Action 还没有配置到 Web 应用当中 , 还不能够处理用户的请求 , 为了能让该 Action 能够处理用户的请求 , 还需要将该 action 配置到 struts.xml 文件当中 .
前面已经介绍过了 ,struts.xml 文件应该放置到 classes 路径下面 , 该文件主要防止 Struts2 的 Action 定义 . 在定义 Struts2Action 的时候 , 除了需要制定该 action 的实现类之外 , 还需要定义 ACTION 处理结果和资源之间的映射关系 , 下面是该应用的 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 = "strutsqs" extends = "struts-default" >
- < action name = "login" class = "com.supermos.app.LoginAction" >
- < result name = "success" > /success.jsp </ result >
- < result name = "fail" > /fail.jsp </ result >
- </ action >
- </ package >
- </ struts >
上面的映射文件定义了 name 为 login 的 Action.
(3) 增加视图资源完成应用
经过上面的两个步骤 , 这个最简单的 struts2 应用几乎可以运行了 , 但是还需要为该 web 应用增加两个 jsp 文件 , 分别是 error.jsp 和 welcome.jsp, 将这两个 jsp 页面文件放到 web 应用的根目录下 ( 与 /WEB-INF 在同一个文件夹下面 ). 这两个页面就可以是最简单的 jsp 页面 , 分别显示登录成功和登录失败就可以了 .
下面是fail.jsp的内容
- < %@page language = "java" contentType = "text/html;charset=utf-8" % >
- < html >
- < body >
- < h2 align = "center" > 登录失败 </ h2 >
- </ body >
- </ html >
下面是success.jsp的内容:
- < %@page language = "java" contentType = "text/html;charset=utf-8" % >
- < html >
- < body >
- < h2 align = "center" > 登录成功 </ h2 >
- </ body >
- </ html >
部署--> 运行 --> 成功