再读Struts2之二:环境搭建以及介绍

配置:

pom.xml中追加如下依赖。

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-core</artifactId>
  <version>2.3.14</version>
</dependency>

web.xml中追加过滤器。

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> -->
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这里有点儿说明,大部分人已经知道:

Since Struts 2.1.3, use {@link org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter} instead 
or {@link org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter}
and {@link org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter}

struts.properties和struts.xml文件的处理

1 struts.properties文件

这个文件的修改是选择性的。因为在struts2-core.jar中有一个default.properties文件,已经对全局的struts2项目有一个控制。如果我们想要修改这种默认配置的话,就需要在源目录下创建一个struts.properties文件了。常被修改的也就下面几个。

struts.i18n.reload = true——激活重新载入国际化文件的功能
struts.devMode = true ——激活开发模式,以提供更全面的调试功能。
struts.configuration.xml.reload = true——激活重新载入XML配置文件的功能(这是为Action准备的),当文件被修改以后,就不需要重新载入Servlet容器中的整个Web应用了。
struts.url.http.port = 8080——配置服务器运行的端口号(所有生成的URL都会被正确创建)

2 struts.xml

这个文件中配置的基本上就是

必须要在“struts.xml”中进行配置的信息只有全局结果异常处理自定义的拦截器堆栈

尽管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.3.dtd"> // dtd指定

<struts>是struts.xml中的根标签,其它的标签都被它包含。

  1. <constant name="struts.devMode" value="true" />  // 以后专门介绍
  2. <bean />  // 以后专门介绍
  3. <package></package>
  4. <include />

<include file="some-config.xml"/>

它的file文件需要有根struts.xml一样的目录结果。也就是说也是一个struts配置文件。一般情况下,是按照系统的模块来划分的。

其实有些文件是struts框架会给我们自动include(导入)的,这就是struts-default.xml和struts-plugin.xml两个文件。

struts-default.xml提供的是Struts2的核心配置信息。它是struts-core.jar中存在的一个文件。

struts-plugin.xml则描述了特定插件的配置信息。每个插件的JAR中都要有一个struts-plugin.xml文件,该文件会在系统启动时被装载。例如:struts2-dojo-plugin.jar中就有一个。

<package … />

标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。

这个标签的属性包括有:name, extends, namespace, abstract等。

name,开发人员为这个Package指定的唯一的名字。

extends,当前这个Package所继承的Package的名字,被继承的Package中所有的配置信息(包括Action的配置)都可以在新的命名空间下,新的Package里面被使用。

namespace,如果两个不同的Package,其命名空间分别为“package1”和“package2”,那么URL差不多就是

  “/myWebApp/package1/my.action” 和“/myWebApp/package2/my.action”这样的形式。基本上就是用于区分具有相同action名称,但是功能不一样的情况。

abstract,如果这个属性的值为“true”,那么这个Package就只是一个配置信息的组合,也就无法通过Package的名字来访问其中配置的Action。

在大多数情况下,我们都应该继承“struts-default.xml”配置文件中的“strust-default”Package,但是如果你想要使用插件的话,那就另当别论了。你必须要参考插件的说明文档来确认所应当继承的父 Package。

package里面会设置interceptors(拦截器链),result-types(结果类型)和action(最重要的)。

interceptors里面会有:

1

<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>

2 <interceptor-stack name="basicStack"> // 有时间补充
  <interceptor-ref name="workflow">
    <param name="excludeMethods">input,back,cancel,browse</param>
  </interceptor-ref>
  <interceptor-ref name="debugging"/></interceptor-stack>

result-types //以后补充

action 有几个属性,name, class, method, convertor

  1. name,example: test 对应着URL中的test.action。 其中.action是在struts.properties文件中配置的。可以修改:struts.action.extension。
  2. class,example: home.study.action.SomeAction。 那么就会去SomeAction类中调用其execute方法。 这个方法名称也可以设置。
  3. method, example: methodInstead。 那么就回去SomeAction类中调用其methodInstead方法。
  4. convertor, // 不了解,以后补充。

对应着上面的说明,应该有如下的action代码了。

<action name="test" class="home.study.action.SomeAction" method="execute">
    <result>view.jsp</result>
    <result name="error">error.jsp</result>
</action>

可以看到有多个result,但是有一个没有name,这个对应着返回值"success",指定的话就对应着name的值了。而中间的view.jsp或者error.jsp就是所谓的回显画面了。

其实result还有另外一个属性,就是type这个就是所谓的结果类型。type的默认属性为“dispatcher”,大多数情况下都可以满足了。看struts-default.xml会有:

        <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>

所以说,我们的result的type可以有以上那么多选择。但是怎么用呢?// 以后专门讲。

都代表什么呢?可以去这里看看。

实际上我们还有另外四种方式:稍后验证。。。
1. Action方法返回一个字符串——这个返回的字符串与“struts.xml”的一个action配置相匹配。例子中已经演示这一种方式。
2. 使用Code behind插件 ——当使用这个插件的时候,它会将Action的名字和Action返回的结果字符串进行连接来得到视图模板。比如说,如果URL是“/adduser.action”,而Action返回了“success”,那么要渲染的页面就是“/adduser-success.jsp” 。更多信息请参见http://struts.apache.org/2.x/docs/codebehind-plugin.html。
3. 使用 @Result注解—— action类可以用@Results 和@Result注解来标注多个不同的结果。Action所返回的字符串需要与所注解的结果之一相匹配。
4. 方法返回一个Result类的实例——Action不必一定要返回一个字符串,它可以返回一个Result类的实例,该实例应当是已经配置好可使用的。

 

Action要完成一些操作之后,才能返回结果。因此它们需要访问多种类型的对象——业务对象,数据访问对象或者其他资源。

Struts2使用了名为依赖注入的方式来注入这些对象。Struts2使用setter注入来实现。

Struts2推荐的依赖注入框架是Spring框架,并通过插件对它进行配置。

posted @ 2013-04-20 17:46  VoctrALs  阅读(242)  评论(0编辑  收藏  举报