一.下载和安装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>
部署-->运行-->成功