首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.14  Struts 2.0框架搭建与介绍

1.14.1  搭建Struts 2.0框架

文本框:  
图1.59  Struts 2.0框架目录结构
本系统使用的Struts 2.0框架为Struts 2.0.11版本,读者可到http://struts.apache.org/download.cgi# struts2011网址下载Full Distribution,Full Distribution为Struts 2.0.11的完整版本,其中包含了Struts2的类库、示例应用、说明文档和源代码等资源。解压下载后的文件的目录结构如图1.59所示。

下面介绍Struts 2.0框架的搭建。

1.导入Struts 2.0类包文件

通常情况下,将如图1.59所示的lib目录下的commons-logging- 1.0.4.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2.0.11.jar和xwork-2.0.4.jar包文件复制到Web应用中的WEB-INF/lib目录下,就可应用Struts 2.0开发项目了。如果想使用Struts 2.0中的更多功能,将其他的JAR包文件复制到WEB-INF/lib目录下即可。

2.配置Web应用的web.xml文件

打开Web应用中WEB-INF目录下的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"> 

        <filter>

            <filter-name>struts2</filter-name>                                                                    <!-- 命名Struts 2.0核心类 -->

            <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>     <!-- 指定Struts 2.0核心类 -->

        </filter>

        <filter-mapping>                                                                                      <!-- 配置核心类处理的请求 -->

            <filter-name>struts2</filter-name>

            <url-pattern>/*</url-pattern>                                                                   <!-- 指定处理用户所有请求 -->

        </filter-mapping>

</web-app>

经过如上操作就完成了Struts 2.0框架的搭建。

Struts 2.0中提供的标签并没有像Struts之前的版本那样进行分类,但在页面中的使用方法是相同的,都需要通过taglib指令来引入,并指定一个前缀。Struts 2.0的标签描述文件存放在了struts2-core-2.0.11.jar包中的META-INF目录下,文件名为struts-tags.tld。以下为struts-tags.tld描述文件中的代码片段:

<taglib>

  <tlib-version>2.2.3</tlib-version>

  <jsp-version>1.2</jsp-version>

  <short-name>s</short-name>

  <uri>/struts-tags</uri>

  <display-name>"Struts Tags"</display-name>

        ……

</taglib>

代码中的<uri>元素将该标签描述文件与/struts-tags名称进行了映射,所以在JSP页面中可直接通过如下代码引入Struts 2.0标签。

<%@ taglib prefix="s2" uri="/struts-tags" %>

当然也可以将标签复制到其他位置,然后在web.xml文件中指定。例如,将struts-tags.tld文件复制到Web应用中WEB-INF/tld目录下,并在web.xml文件中进行如下配置。

<taglib>

    <taglib-uri>struts2</taglib-uri>

    <taglib-location>/WEB-INF/tld/struts-tags.tld</taglib-location>

</taglib>

然后在JSP页面中通过如下代码引入Struts 2.0标签:

<%@ taglib prefix="s2" uri="struts2" %>

1.14.2  Struts 2.0框架介绍

Struts 2.0与Struts1存在很大的差别,因为Struts 2.0是以WebWork为核心,可以说Struts 2.0是WebWork框架的升级版本,因此具有WebWork开发经验的读者,会更容易学习Struts 2.0框架。

1.控制器

Struts 2.0中的控制器分为核心控制器和业务控制器(用户控制器),其中业务控制器是用户创建的Action类。下面介绍这两种控制器。

þ        核心控制器:FilterDispatcher。

FilterDispatcher类存在于org.apache.struts2.dispatcher包下,它继承了javax.servlet.Filter接口。在应用的web.xml文件中需要配置该控制器,用来接收用户所有请求,FilterDispatcher会判断请求是否为*.action模式,如果匹配,则FilterDispatcher将请求转发给Struts 2.0框架进行处理。在web.xml文件中对FilterDispatcher的配置可查看1.14.1节中的介绍。

þ        业务控制器。

由用户创建的Action类实例,充当着Struts 2.0中的业务控制器,也可称为用户控制器。创建Action类时,通常使其继承Struts 2.0包中的com.opensymphony.xwork2.ActionSupport类。在Action类中可实现execute()方法,当有请求访问该Action类时,execute()方法会被调用来处理请求,这与之前的Struts版本中Action的处理是相同的。

在Struts之前的版本中,若Action类继承自org.apache.struts.actions.DispatchAction父类,那么该Action会根据用户请求调用相应的自定义方法来处理请求,不必实现execute()方法。同样,在Struts 2.0中要实现这样的功能,可通过在配置文件中指明调用方法和在请求路径中指明调用方法两种方法实现。具体的使用方法在前面已经作了讲解,读者可查看1.7.3节中“列表显示某类别中所有信息的实现过程”中的内容。

同之前的版本一样,Struts 2.0也需要在配置文件中对Action进行配置。该配置主要就是将用户请求与业务控制器进行关联,然后指定请求处理结束后返回的视图资源。例如:

<!-- 若请求路径中包含“userLogin.action”,则转发给LoginAction业务控制器 -->

<action name="userLogin" class="com.yxq.action.LoginAction">

    <result>/welcome.jsp</result>                                                       <!-- 登录成功后,转发到welcome.jsp页面 -->   

<result name="loginError">/login.jsp</result>                           <!-- 登录失败后,转发到login.jsp页面 -->

</action>

在Struts 2.0中可使用拦截器处理请求。在一些拦截器中通过com.opensymphony.xwork2.Action- Context类将请求、会话与Map对象进行了映射。在开发程序时,若仅仅是对请求或会话进行存取数据的操作,则可使创建的Action控制器继承相应的接口,在拦截器中来判断该Action控制器是哪个接口的实例,根据判断,生成一个与请求进行映射的Map对象或与会话进行映射的Map对象。在用户Action控制器中,对这些Map对象进行数据存取操作,即可实现对请求或会话的数据存取操作。

Struts 2.0中实现该功能的拦截器为ServletConfigInterceptor,它存放在struts2-core-2.0.11.jar中的org.apache.struts2.interceptor包下。其部分代码如下:

public String intercept(ActionInvocation invocation) throws Exception {

    final Object action = invocation.getAction();                                         //获取请求要访问的Action控制器

    final ActionContext context = invocation.getInvocationContext();        //获取Action上下文

    if (action instanceof ParameterAware) {                                                //如果控制器是ParameterAware类实例

Œ           ((ParameterAware) action).setParameters(context.getParameters());

    }

    if (action instanceof RequestAware) {                                                   //如果控制器是RequestAware类实例

           ((RequestAware) action).setRequest((Map) context.get("request"));

    }

    if (action instanceof SessionAware) {                                                    //如果控制器是SessionAware类实例

Ž           ((SessionAware) action).setSession(context.getSession());

    }

    ……

    return invocation.invoke();                                                                     //调用Action控制器

}

U 代码贴士

u 调用ActionContext类的getParameters()方法将请求中的参数封装到Map对象中,并保存该Map对象。

 调用ActionContext类的get()方法获取一个与请求对应的Map对象,并保存该Map对象。

Ž 调用ActionContext类的getSession()方法获取一个与会话对应的Map对象,并保存该Map对象。

所以,在用户控制器中,若对请求或会话存取数据,可使该Action控制器继承相应的接口。例如:

package com.yxq.action;

import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;

import org.apache.struts2.interceptor.ResponseAware;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class s extends ActionSupport implements RequestAware,SessionAware {

        private Map request;

        private Map session;

        public void setRequest(Map request) {                               //继承RequestAware接口必须实现的方法

                this.request=request;

        }

        public void setSession(Map session) {                       //继承SessionAware接口必须实现的方法

                this.session=session;             

        }

        public String execute() throws Exception {

                request.get("userName");                                     //获取请求中userName属性值

                session.put("longer","yxq");                                //向会话中存储值

                return SUCCESS;

        }

}

通过对拦截器中的Map对象进行存取数据的操作,来实现对请求或会话进行存储数据的操作,这使得用户实现的Action控制器避免了对Servlet API的依赖。

2.模型组件

实际上模型组件概念的范围是很广的,对于实现了MVC体系结构的Struts 2.0框架来说,在模型的设计方面并没有提供太多的帮助。在Java Web应用中,模型通常由JavaBean组成,一种JavaBean被指定用来封装表单数据,实现了视图与控制器之间的数据传递;另一种则实现了具体的业务,称为系统的业务逻辑组件。

在MVC体系结构中,位于控制层的业务控制器负责接收请求,然后调用业务逻辑组件处理请求,最后转发请求到指定视图。所以,真正用来处理请求的是系统中的模型组件。

3.视图组件

在Struts 2.0中,请求处理结束后,返回的视图不仅可以是JSP页面、Action动作,还可以是其他的视图资源,如FreeMarker模板、Velocity模板和XSLT等。

Struts 2.0完成了请求的处理后,将根据在配置文件中的配置,决定返回怎样的视图,这主要是通过<result>元素的type属性来决定。若返回FreeMarker模板,则设置type属性的值为freemarker;若返回Velocity模板,则设置为velocity;若返回另外一个Action动作,则设置为redirectAction;在没有设置type属性的情况下,默认返回的视图为JSP页面。例如下面的配置:

<action name="returnType" class="com.yxq.action.ReturnAction">

    <result>/welcome.jsp</result>                                                                                   <!-- 返回JSP页面 -->   

        <result name="vm" type=" velocity ">/welcome.vm </result>                                       <!-- 返回Velocity模板 -->

        <result name="action " type=" redirectAction ">myReturn.action</result>                   <!-- 返回Action动作 -->

</action>

4.配置文件

Struts 2.0默认会加载Web应用WEB-INF/classes目录下的struts.xml配置文件,通过该文件的配置为用户请求指定处理类,并设置该请求处理结束后返回的视图资源。在开发大型项目时,这往往struts.xml文件会导致过于庞大,降低了可读性。此时可以自己创建配置文件,然后在struts.xml文件中通过<include>元素包含这些文件。例如在struts.xml文件中包含名为myxml.xml的文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>

        <include file="myxml.xml"/>                         <!-- 包含myxml.xml文件 -->

    </struts>

在myxml.xml文件中配置用户请求与处理类的关系。例如下面的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

Œ       <struts>     

           <package name=" example" extends="struts-default">

Ž               <action name="my" class="com.yxq.action. MyAction">

                   <result>/welcome.jsp </result>

            </action>              

                        ……//其他<action>元素的配置

        </package>

    </struts>

U 代码贴士

u Struts2.0配置文件的根元素。

 包元素。name属性指定了包名称;extends属性指定了继承的另一个包元素;struts-default是在struts-default.xml文件中定义的包的名称。struts-default.xml位于struts2-core-2.0.11.jar文件下,在该文件的struts-default包元素中,定义了<result>元素的type属性所能指定的视图类型、Struts 2.0中提供的拦截器以及对继承了struts-default包的XML配置文件中配置的所有Action类默认执行的拦截器。

Ž <action>元素,用来配置业务控制器与请求的关系。

 <result>元素,指定请求处理结束后返回的视图资源。

5.消息资源文件

在Struts 2.0中用来存储提示信息的properties资源文件有以下3种:应用范围内的资源文件、包(package)范围内的资源文件和Action类范围内的资源文件。

þ        应用范围内的资源文件。

该资源文件在整个应用内都可以被访问,通常称为全局资源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目录下创建了一个名为allMessage.properties的全局资源文件,在struts.properties文件中需进行如下配置:

struts.custom.i18n.resources=allMessage

若将文件保存在了WEB-INF/classes/messages目录下,需进行如下配置:

struts.custom.i18n.resources= messages.allMessage

struts.properties文件通常应被存放到Web应用的WEB-INF/classes目录下,Struts 2.0会自动加载该文件,该文件以key=value的形式存储了一些在Struts 2.0启动时对Web应用进行的配置,key用来表示配置选项名称,value表示配置选项的值,如解决Struts 2.0中文乱码的问题。

þ        包(package)范围内的资源文件。

文本框:  
图1.60  包结构图
包范围内的资源文件必须命名为package_xx_XX.properties,其中xx表示语言代码,XX表示地区代码,例如package_zh_CN.properties表示中文(中国)。通过这样命名,可以实现应用程序国际化。也可忽略语言代码与地区代码,命名为package.properties,表示任意语言(地区)。包范围内的资源文件只可被当前包中的类文件访问。例如,存在如图1.60所示的包结构,在actionA子包中存在一个package.properties资源文件,则actionA子包中的类文件可以访问package.properties资源文件,而actionB子包中的类文件则不能访问。可将package.properties文件存放在com/yxq目录下,使得com/yxq目录下所有子目录中的类文件都可以访问。

þ        Action类范围内的资源文件。

该资源文件只可被某一个Action类访问,它必须与访问它的Action类存放在同一个目录下,并且文件的命名与该Action类的名称相同。例如,在com.yxq.action包下存在MyAction.java类文件,若在com.yxq.action下创建一个MyAction.properties资源文件,则该文件只可被MyAction.java类文件访问。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论