服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

基于stripes框架进行java web开发

mark eagle是美国乔治亚州亚特兰大市matrix resources有限公司的一位资深软件工程师,拥有sun公司的scp和scwcd认证。mark本人非常喜欢使用开源软件进行软件开发,并且多次积极参与过hibernate,spring及proxool等著名开源工程。

一、简介

stripes是一个开源的,基于action的java web框架。传统型java web开发强调通过松耦合的设计达到灵活开发之目的,这导致了产生多种配置文件,额外对象以及其它零碎的资源。显然,这些问题提升了众多开发人员的学习曲线,从而降低了开发效率。基于这些原因,一些java开发者求助于另外的非java开发框架―例如ruby on rails或者django。而象stripes这样的新型java web开发框架,从支持流线式开发框架的成功中获取了大量现成的经验。本文中,我们将通过一个具体的案例来探讨stripes是如何区别于其它基于action的java web框架(例如struts),而同时又实现了例如ruby on rails框架所具备的简单性。

下图1展示了基于stripes框架开发的典型应用程序中事件及组件间的通常流程。

最后,调用index方法,因为它被定义为(注解为)缺省的处理器并且该url中没有指定一个事件。

如果我们想直接执行helloworldaction类中的hello方法会怎么样呢?如果这样的话,url中需要包括事件名―作为一个请求参数形式提供:http://host/uri/example/helloworld.action?hello=&firstname=mark&age=13

【注意】在此,我们并没有为该hello请求参数指定一个值。在本文示例中,stripesdispatcher负责识别匹配hello请求参数名和一个方法名(该方法名位于helloworldaction类中,并且方法签名为“public resolution hello()”)。为了提高性能,方法名在初始化时通过一个单独的map进行缓冲。

现在,我们已经了解了stripes的基本知识以及如何创建简单的action。其实,还有许多关于此框架操作的细节。通过在web.xml中进行一些初始的配置,我们可以成功地避免再引入一个单独的xml配置文件来绑定我们的描述组件。这是很重要的,因为:第一,你可以查找一个url并且立即知道要查找什么类―如果你需要进行任何修改的话;第二,当配置文件变得相当巨大和不可管理时,我们不需要使用一个单独的工具来帮助我们。通过消除了这个配置文件,我们不必再浪费大量的元数据来填充框架。最后,我们不需要继续维护一个单独的文件来描述我们的组件彼此之间的关系。

五、 基于prototype javascript库集成ajax技术

从现在开始,让我们来探讨stripes是如何处理ajax相关问题的。我们将使用一个更新适当内容的ajax调用来修改上面的hello世界示例。这个示例将展示如何使用prototype以便为stripes行为提供ajax调用。这个示例的完整源码可以从本文提供的下载源码中获取。首先,让我们修改该hello.jsp以便包括对prototype javascript库的参考。我们还将添加一个相应于该ajax调用的javascript函数,并且把原先的提交按钮改变为绑定了一个onclick事件的新按钮:

<%@ taglib prefix="stripes"

uri="http://stripes.sourceforge.net/stripes.tld" %>

<html>

<head>

<title>stripes hello world</title>

<script

src="${pagecontext.request.contextpath}/js/prototype.js"

type="text/javascript"></script>

<script type="text/javascript">

function sayhelloajax() {

var myajax = new ajax.updater('hello',

"<stripes:url

beanclass="com.

myco.

web.

stripes.

action.

example.

helloworldaction"

event="sayhelloajax"/>",

{

method: 'get',

parameters: form.serialize('helloform')

});

}

</script>

</head>

<body>

<stripes:errors/>

<stripes:form

beanclass="com.

myco.

web.

stripes.

action.

example.

helloworldaction"

id="helloform">

say hello to: <br>

first name: <stripes:text

name="person.firstname"/><br>

age:<stripes:text name="person.age"/><br>

<stripes:button

name="helloajax"

value="say hello"

onclick="sayhelloajax()"/>

<div id="hello"></div>

</stripes:form>

</body>

</html>

在此,stripes:button拥有一个onclick事件,该事件将调用helloworldaction类中的sayhelloajax方法并且把相应的结果返回到称为hello的div标签中。接下来,我们来看一下要在helloworldaction类中引入的另一个新的方法:

public resolution sayhelloajax(){

return new forwardresolution("sayhelloajax.jsp"); 

}

这个方法没有做多少工作,因为其涉及的前后绑定工作都由stripes负责实现了。因此,这个方法的唯一责任就是把当前控制转发到一个称为sayhelloajax.jsp的页面。下面是此sayhelloajax.jsp的内容:

<h2>hello ${actionbean.person.firstname} your age is ${actionbean.person.age}!</h2>

六、与spring框架的集成

stripes还提供了与spring框架的内置集成。你可以把spring beans或服务自动地注入到你的行为中。在stripes框架中,实现这一点并不要求外部配置―除了你的spring上下文配置之外。例如,如果我们在我们的spring配置中存在一个如下所定义的bean:

<bean id="personservice" parent="abstracttxdefinition">

<property name="target">

<bean class="com.myco.service.impl.personserviceimpl"/>

</property>

</bean>

那么,为了实现把此personservice注入到一个stripes行为中,需要添加一个属性和匹配该spring bean名字的setter。stripes提供了@springbean注解来定位合适的spring bean以注入到行为类中。下面是一个需要包括到stripes行为中的示例:

private personservice personservice;

@springbean

public void setblogservice(blogservice blogservice) {

this.blogservice = blogservice;

}

请注意:仅靠本文是无法涉及stripes所有高级特征的;然而,stripes参考文档中已经提供了比较综合性的相应资料。stripes框架中还包括一个类似于tiles的省略了外部配置的布局管理器。另外,stripes框架中引入的拦截器(interceptor)还可以用于跨生命周期事件,文件上传,以及更多的内容上。

七、结论

从本文中我们可以看到,stripes的确是一种强有力然而却十分简单的java web框架。这个框架充分利用了java 5中注解和泛型等特征,从而使java开发者不必维护外部配置文件而提高了生产效率。

扫描关注微信公众号