电话:0731-83595998
导航

用Stripes做JavaWeb开发

来源: 2017-12-23 15:40

 百度广告

摘要:    Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架。将介绍Stripes与其它如Struts之类基于动作的框架的区别和其提供的一些存在于Ruby on Rails之中的简单性。

   Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架。传统的Java web开发着眼于借去耦(Decoupling)来实现其灵活性,但导致多个的配置文件,额外的对象,和其他资源的分散。这些困难造成相当多的程序员的更高的学习时间和低下的效率。其结果是有些Java程序员被一些非Java的框架所吸引去了:Ruby on Rails或者Django。一些Java web框架,如Stripes,正在开始从这些非Java框架中汲取其成功经验:简单而高效的开发。将介绍Stripes与其它如Struts之类基于动作的框架的区别和其提供的一些存在于Ruby on Rails之中的简单性。

   图1是典型的用Stripes写的应用程序中的正常事件流程和组件。

 

   如你所见,其流程基本上就是一个MVC框架。Stripes和其他的基于动作的框架的一个主要的区别是没有一个外部的配置文件。我们随后将看到,Stripes用annotation和约定而非配置来提高产出和减少杂乱。


编写你的第一个Stripe动作(Action)

   让我们现在就开始通过创建Hello World例程来了解Stripes框架和理解其运作。HelloWorldAction类将提示用户输入姓氏和名字然后在另一个View里面显示,首先我们来编写controller类。

public class HelloWorldAction implements ActionBean {  

  @ValidateNestedProperties({  @Validate(field = "firstName", required = true,
  @Validate(field = "age", required = true, minvalue = 13,
  })
  private ActionBeanContext context;
  @DefaultHandler
  return new ForwardResolution("Hello.jsp");
    
  return new ForwardResolution("SayHello.jsp");

  public void setPerson(String person) {this.person = person;}
  public void setContext(ActionBeanContext c) {this.context = c; }
}

   Controller类是一个实现了Stripes特有接口ActionBean的POJO(Plain Old Java Object,译注:读破粥)。所有的Stripes动作类都要实现这一接口以让StripesDispatcher servlet在运行服务时为其注入一个ActionBeanContext对象。ActionBeanContext对象可以让你存取的对象如request、response、和servlet context等servlet API。大多数时候在Stripes应用中是不用读取这些底层API对象的。ActionBeanContext类还提供当前动作的状态并可以添加信息消息和错误消息到当前动作中。ActionBeanContext的变量和其读写方法可以放在一个基类里面,因为所有的Stripes动作都要实现之。

   Controller类的其他部分对于任何Java程序员来说都是很面熟的。有一个Person对象和其读写方法是用来读写用户的姓名给view的。虽然这仅仅是一个简单的嵌套对象,Stripes可以通过Java集合、泛型支持、和下标化的属性来实现更复杂完善的数据捆绑。因为Stripes可以处理复杂数据捆绑,你的领域对象(Domain Object)可以在其他需要它们的层重用。例如:通过Stripes你可以很容易的收集一个领域对象的信息,然后用其他的POJO框架,如Hibernate或者EJB3来对其进行持久化。

   Person对象变量上有一个Stripes验证annotation用来保证用户在激活hello方法的时候已经输入了姓名。如果用户没有输入这两个必需的变量,原始页会被返回,并显示一个相关的错误消息。该验证只有在hello事件被申请的时候才会被激活,因为annotation的属性中指定了(on = {"hello"})。Stripes还会使用实用默认法则,根据验证方法和变量名称产生一个错误信息。例如,如果Person类的firstName变量在提交的时候没有提供,用户将看到:

Person First Name is a required field.

   这条消息是通过将Person.firstName进行刻读化处理后得到的。如果有必要,这些错误消息可以被重载来提供更多的客户自定义功能。||| 

The value (Mark) entered in field Person Age must be a valid number.

   若是用户输入了一个小于13的整数,用户将看到这个消息:

The minimum allowed value for Age is 13.

   同样地,我们没有必要为这些错误消息提供任何外部的配置文件。Annotation提供的验证与你的变量在同一个位置上,使得程序员定位验证、理解验证的内容、和对验证进行维护变动更容易。

   这个Stripes动作还有两个可被激活的方法(称为事件)。事件是ActionBean类中有如下特征的方法:

public Resolution eventName

   请注意index方法被标注为@DefaultHandler annotation。因为在本动作中有多个事件,其中一个必须被指定为默认事件。如果调用本动作的URL没有指定哪个事件,Stripes则查找标注有@DefaultHandler annotation的事件,并执行。

   显示层(View)

   现在让我们给Hello World例程加上显示层的逻辑。Stripes默认支持JSP为显示层的标准技术,不过你也可以用其他的显示层技术,比如FreeMaker。除了Stripes的tag库以外,没有什么新的东西要学。Hello.jsp是初始的显示,可以让用户输入和提交姓名。

 

......
  

  
  Age:
  
......

   这个JSP易读易维护。而Stripes用于form和input的tag跟对应的HTML代码非常相似。stripes:form tag包含一个beanclass属性,其值为我们前面定义的controller类的完整类名。我们可以用stripes:form中的action属性来替换beanclass属性,但是beanclass属性可以让你在以后对Stripes动作进行重构的时候更加方便。如果你要用在stripes:form tag中使用action属性,方法

 

   有一个stripes:input tag指定了一个名为person.firstName属性,其作用是将其储存的输入值付给controller的Person对象的firstName变量中。最后,stripes:submit tag指定一个name属性来告诉Stripes的HelloWorldAction类使用哪一个事件。

我们现在已经完成了提交姓名的值给HelloWorldAction,剩下的就是在另一个view中将其反馈给用户了。

 


  
Hello ${actionBean.person.firstName} your age is


   Say Hello Again
......

   本JSP将自己通过一个对动作的引用读取person的姓名信息并显示。为达到这一目的,Stripes自动在request的属性中添加一个名为actionBean动作对象,以供JSTL存取。最后,我们用了一个strips:link tag来建立一个返回HelloWorldAction地链接从而可以让我们输入不同的姓名。我们以可以通过如下办法显式地创建一个指向index事件的stripes:link:

 

Say Hello Again

   因为我们已经用annotation把index方法标记为@DefaultHandler,Stripes无须event属性也知道要执行哪一个方法。||| 
用约定、不用配置文件

   我们现在有了Java组件,我们该做配置了,把动作映射的一个URL上,并将其连接到我们的两个view上面去。等一下!我们在用Stripes,我们不需要外部配置文件!

   虽然这听来好像好得不像是真的,但这的确是Stripes的一项最具生产效率的功能。Stripes使用约定而非配置文件来映射动作到URL上。我们也无须使用一个外部配置文件来把view映射到一个个标记名字上。这意味着程序员不用再为了一个标记名字--比方说SUCCESS--的实际,而在配置文件中跳来跳去了。没有必要在Java和view组件的外部进行配线,因而导致更好地维护性和更高的生产率。

   Stripes是如何提供隐式的URL映射而无需在外部配置每一个动作或者而外的annotation呢?这个可以从Stripes在web.xml中的配置以及它是如何通过实用默认法建立URL映射来解释。首先,我们来看看Servlet过滤器:StripesFilter。其在web.xml中的默认配置

 

  Stripes Filter
  
  
  ActionResolver.UrlFilters
  
   当Servlet容器启动的时候,StripesFilter对其init-param元素执行初始化。其中最重要的init-param元素就是ActionResolver.UrlFilters参数。这个参数告诉Stripes到哪里查找跟Stripes有关的类。这个例子里面,Stripes将查找/WEB-INF/classes目录下的所有实现ActionBean接口的类。每一个被找到的类和其绑定的URL都将被加入一个Map中。

   让我们来看看Stripes是如何处理我们的HelloWorldAction动作为例子吧。因为HelloWorldAction类位于/WEB-INF/classes目录下,所以会被认为是一个Stripes servlet。在我们的例子当中,其完整类名是com.myco.web.stripes.action.example.HelloWorldAction。随后,其完整类名将按照如下法则被翻译成一个URL绑定。

1.    将含有www、web、stripes、和action的部分及其以前的内容删掉。在我们的例子有三个上述单词,所以我们得到了example.HelloWorldAction。
3.    将.替换为/,我们得到了example/HelloWorld。

   现在Stripes找到了ActionBean类并为其创建了一个URL绑定,然后存放在一个java.util.Map

    Age:

    

    

  

   stripes:button有一个onclick事件将会调用HelloWorldAction类中的sayHelloAjax方法并将其结果返回在一个叫hello的div tag中。下面是我们要在HelloWorldAction中介绍的一个新方法:

 

public Resolution sayHelloAjax(){
}

   这个方法没有多少工作,因为Stripes已经承担了姓名内容的绑定。因此,本方法唯一的责任就是转发到一个叫SayHelloAjax.jsp的页面片断上去。该叶面片段的内容

Hello ${actionBean.person.firstName} your age is ${actionBean.person.age}!

   Spring整合

   Stripes还内置了对Spring支持。你可以自动地将Spring bean诸如到你的动作中。按照Stripes的风格,除了Spring上下文配置文件以外不需要任何外部配置文件。如果我们Spring的配置文件

 

  
  
   要把person服务注入到一个Stripes动作中,得增加一个跟Spring bean的名字一致的属性和setter。Stripes提供了@SpringBean annotation来查询正确的Spring bean以注入到动作之中。下面是我们要在动作类中包含的例子:

 

private PersonService personService;

@SpringBean
  this.blogService = blogService;

   无法囊括Stripes的所有高级功能。但是,Stripes有非常完整的文档。Stripes还包含了一个与Tiles类似但无需外部配置文件的layout管理器。另外,拦截器还可以用于生命周期事件的各处、文件上载等等等等。

   结论

   Stripes是一个既强大又简单的Java web框架。Stripes利用了Java 5的annotation和泛型功能,从而使得Java程序员避免维护外部配置文件并增加工作效率。Stripes可以简化困难的web开发工作,并使得简单的工作更加简单!

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
拼团课程更多+
热门排行
  • 长理培训微信公众号
    每日推送精彩考试资讯
    长按二维码识别
    微信搜索“ 长理培训
  • 加入QQ群一起来考国网!
    QQ群号:223940140
    点击进入

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端