基于Stripes框架进行Java Web开发(3)

来源:互联网 发布:哈尔滨网站seo 编辑:程序博客网 时间:2024/04/29 08:56

这个JSP将显示用户的姓名域中的信息—通过访问一个对行为本身的引用来实现。为此,Stripes自动地包括了一个actionBean请求属性,这可以使用JSTL加以存取。最后,我们使用一个stripes:link标签来创建一个到HelloWorldAction类的往回的链接,以便我们可以输入另一个不同的名字。我们还能够像下面这样通过显式地引用index事件来创建该stripes:link标签:

<stripes:link
beanclass="com.myco.web.stripes.action.
example.HelloWorldAction"
event="index">Say Hello Again</stripes:link>

既然我们已经使用@DefaultHandler注解了该index方法,所以,Stripes能够知道要执行哪个方法—即使不使用事件属性。

四、使用convention(约定)进行配置

现在,既然我们已经成功地创建了我们的Java组件,那么接下来,我们将把行为映射配置到一个URL,并且把它链接到我们以前创建的两个视图上。请等一下—我们是在使用Stripes框架进行开发,所以在此我们根本不需要任何外部配置!

尽管这听起来可能有点不太真实,但的确如此—这正是Stripes框架带给我们的最具生产效率的众多特征之一。在配置问题上,Stripes使用convention把Action映射到URL。我们也不需要使用一个外部配置文件来把一个符号名映射到实际的视图上。这意味着,开发者不必在配置文件之间来回切换以决定如何在众多的符号名(例如SUCCESS)中加以选择并最终把它们导航到视图的实际路径。根本不需要通过外部来配置Java和视图组件。显然,这提高了系统开发的可维护性,并进一步提高了软件生产效率。

那么,在没有以外部方式配置每一个行为或另一个注解的情况下,Stripes是如何提供到Java行为类的隐式的URL映射呢?这可以通过在web.xml文件中配置Stripes和该文件使用智能的缺省设置来创建URL映射方面得到解释。首先,我们需要讨论一个称为StripesFilter的Servlet过滤器。下面是在web.xml文件中的StripesFilter过滤器的缺省配置:

<filter>
<display-name>Stripes Filter</display-name>
<filter-name>StripesFilter</filter-name>
<filter-class>
net.sourceforge.stripes.controller.StripesFilter
</filter-class>
<init-param>
<param-name>ActionResolver.UrlFilters</param-name>
<param-value>/WEB-INF/classes</param-value>
</init-param>
</filter>

当启动Servlet容器时,StripesFilter执行其init-param元素的初始化。其中,最重要的一个init-param元素是ActionResolver.UrlFilters参数。这个参数告诉Stripes到哪里寻找Stripes相关的类。在本文示例中,Stripes将在缺省的/WEB-INF/classes路径下查找所有实现了ActionBean接口的类。所找到的每一个ActionBean类,连同该类缺省的绑定URL,都被添加到一个映射中。

现在,让我们通过一个示例来实际分析一下Stripes对我们的Hello世界示例类做了些什么。既然该HelloWorldAction类位于/WEB-INF/classes路径下并且实现了ActionBean,那么,它将被识别为一个Stripes servlet。在我们的示例中,该类的全称限定名为com.myco.web.stripes.action.example.HelloWorldAction。然后,这个全称限定的名字通过实现下面这些规则被翻译成一个URL绑定:

1.把每次出现的四个子串之一(www,web,stripesaction)连接成全称限定类名。在我们的示例中,我们在包名中使用了这四个匹配中的三个。没有使用此匹配的一个是“example.HelloWorldAction”。
2.从类名的最后删除字符串“Action”和“Bean”—如果它们存在的话。于是,这产生了“example.HelloWorld”,因为我们的类以“Action”结束。
3.现在,我们使用“/”符号代替“.”符号,结果是“example/HelloWorld"”。
4.最后,我们在结尾添加上绑定后缀(默认情况下是“.action”),至此最终完成URL绑定。最终结果是“example/HelloWorld.action”。

现在,既然Stripes已经找到了ActionBean类并且为它创建了一个URL绑定,那么,接下来将对它们通过java.util.Map<string,class<?extendsactionbean style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">>(其中,键是URL绑定,而值为实现ActionBean的类)进行缓冲。下面是我们的示例在映射中看起来的样子:

URL绑定ActionBean类/example/HelloWorld.actioncom.myco.web.stripes.action.example.HelloWorldAction

接下来,我们要讨论的第二个问题是,Stripes怎么把URL绑定翻译回你要使用的ActionBean类呢?这个任务由Stripes调度器(dispatcher)Servlet来完成—此调度器在web.xml文件中配置,如下所示:

<servlet>
<servlet-name>StripesDispatcher</servlet-name>
<servlet-class>
net.sourceforge.stripes.controller.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StripesDispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>