原文:http://zetcode.com/java/stripes/

这是 Stripes 入门教程。 我们使用 Stripes Web 框架创建两个简单的 Web 应用。 我们使用 NetBeans 来构建应用。

Stripes 是一个开源的轻量级 Java Web 应用框架。 Stripes 的目标是使 Java 中基于 Servlet/JSP 的 Web 开发变得简单,直观和直接。 Stripes 是基于动作的 MVC(模型视图控制器)框架。 它运行在 JEE Web 容器中,使用最少的配置文件,并具有灵活和简单的参数绑定。

Stripes 的ActionBean是一个对象,用于接收在请求中提交的数据并处理用户的输入。 它既定义了表单的属性,又定义了表单的处理逻辑。 Stripes 会在部署时通过扫描 Web 应用的类路径来自动发现ActionBean。 条带过滤器的ActionResolver.Packages init-param(在web.xml中)设置一个或多个包根。

分辨率是作为对已处理请求的响应而创建的对象。 解决方案可以转发到 JSP 页面,流数据或返回错误消息。 分辨率由ActionBeans的处理器方法返回。

从 Stripes 的 Github 页面中,我们下载了最新的 Stripes 版本。 在lib子目录中,我们需要在项目中包含三个 JAR 文件:commons-logging-1.1.3.jarcos-05Nov2002.jarstripes-1.6.0.jar。 此外,还有StripesResources.properties文件,其中包含各种消息。

简单 Stripes 应用

第一个应用显示当前日期。 我们在 NetBeans 中创建一个新的 Web 应用。 我们选择 Tomcat 作为我们的 JSP/servlet 硬币容器。

Stripes 介绍 - 图1

图:项目文件

该项目包含三个文件:HelloActionBean.java包含响应我们请求的代码,showDate.jsp是作为响应发送回用户的视图,而web.xml文件包含用于设置 Stripes 的配置。 在此应用中,我们不使用StripesResources.properties

Stripes 介绍 - 图2

图:项目库

这些是我们构建 Stripes 应用所需的库。

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <filter>
  7. <display-name>Stripes Filter</display-name>
  8. <filter-name>StripesFilter</filter-name>
  9. <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
  10. <init-param>
  11. <param-name>ActionResolver.Packages</param-name>
  12. <param-value>com.zetcode.action</param-value>
  13. </init-param>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>StripesFilter</filter-name>
  17. <url-pattern>*.jsp</url-pattern>
  18. <dispatcher>REQUEST</dispatcher>
  19. </filter-mapping>
  20. <filter-mapping>
  21. <filter-name>StripesFilter</filter-name>
  22. <servlet-name>StripesDispatcher</servlet-name>
  23. <dispatcher>REQUEST</dispatcher>
  24. </filter-mapping>
  25. <servlet>
  26. <servlet-name>StripesDispatcher</servlet-name>
  27. <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
  28. <load-on-startup>1</load-on-startup>
  29. </servlet>
  30. <servlet-mapping>
  31. <servlet-name>StripesDispatcher</servlet-name>
  32. <url-pattern>*.action</url-pattern>
  33. </servlet-mapping>
  34. <welcome-file-list>
  35. <welcome-file>Hello.action</welcome-file>
  36. </welcome-file-list>
  37. </web-app>

在标准web.xml部署描述符中,我们配置 Stripes。 我们指定 Stripes 在哪里寻找ActionBean:在我们的例子中是com.zetcode.action包。 欢迎文件是当我们请求主页时显示的文件。 Hello.action指示应执行HelloActionBean

HelloActionBean.java

  1. package com.zetcode.action;
  2. import java.util.Date;
  3. import net.sourceforge.stripes.action.ActionBean;
  4. import net.sourceforge.stripes.action.ActionBeanContext;
  5. import net.sourceforge.stripes.action.DefaultHandler;
  6. import net.sourceforge.stripes.action.ForwardResolution;
  7. import net.sourceforge.stripes.action.Resolution;
  8. public class HelloActionBean implements ActionBean {
  9. private static final String VIEW = "/WEB-INF/jsp/showDate.jsp";
  10. private ActionBeanContext context;
  11. private Date date;
  12. public Date getDate() {
  13. return date;
  14. }
  15. public void setDate(Date date) {
  16. this.date = date;
  17. }
  18. @Override
  19. public void setContext(ActionBeanContext context) {
  20. this.context = context;
  21. }
  22. @Override
  23. public ActionBeanContext getContext() {
  24. return context;
  25. }
  26. @DefaultHandler
  27. public Resolution hello() {
  28. this.date = new Date();
  29. return new ForwardResolution(VIEW);
  30. }
  31. }

HelloActionBean处理请求,并以向前解析的方式响应 JSP 页面。

  1. private static final String VIEW = "/WEB-INF/jsp/showDate.jsp";

该视图是showDate.jsp文件。

  1. private ActionBeanContext context;

ActionBeanContext封装有关当前请求的信息。 如果我们出于任何原因需要使用它,它提供对底层 Servlet API 的访问。

  1. @DefaultHandler
  2. public Resolution hello() {
  3. this.date = new Date();
  4. return new ForwardResolution(VIEW);
  5. }

@DefaultHandler注解为此动作 bean 设置了默认处理器。 它用当前日期填充date属性,并返回一个新的ForwardResolution。 分辨率转发到视图。

showDate.jsp

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Current date</title>
  7. </head>
  8. <body>
  9. <h3>The date is ${actionBean.date}</h3>
  10. </body>
  11. </html>

这是用户的模板视图。 ${actionBean}表达式引用指向此视图的操作 bean。 我们使用表达式来引用动作 bean 的date属性。

  1. $ curl localhost:8084/SimpleStripes/
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Current date</title>
  7. </head>
  8. <body>
  9. <h3>The date is Thu Jun 02 14:13:01 CEST 2016</h3>
  10. </body>
  11. </html>

构建和部署应用之后,我们将使用curl工具访问应用的主页。 该应用将响应一个包含当前日期的 HTML 页面。

Hello Stripes 应用

在第二个应用中,我们有一个简单的 HTML 表单。 用户在文本框中指定其名称。 该应用以问候回应。 验证用于确保用户已在文本字段中输入了内容。

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <filter>
  7. <display-name>Stripes Filter</display-name>
  8. <filter-name>StripesFilter</filter-name>
  9. <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
  10. <init-param>
  11. <param-name>ActionResolver.Packages</param-name>
  12. <param-value>com.zetcode.action</param-value>
  13. </init-param>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>StripesFilter</filter-name>
  17. <url-pattern>*.jsp</url-pattern>
  18. <dispatcher>REQUEST</dispatcher>
  19. </filter-mapping>
  20. <filter-mapping>
  21. <filter-name>StripesFilter</filter-name>
  22. <servlet-name>StripesDispatcher</servlet-name>
  23. <dispatcher>REQUEST</dispatcher>
  24. </filter-mapping>
  25. <servlet>
  26. <servlet-name>StripesDispatcher</servlet-name>
  27. <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
  28. <load-on-startup>1</load-on-startup>
  29. </servlet>
  30. <servlet-mapping>
  31. <servlet-name>StripesDispatcher</servlet-name>
  32. <url-pattern>*.action</url-pattern>
  33. </servlet-mapping>
  34. <welcome-file-list>
  35. <welcome-file>index.jsp</welcome-file>
  36. </welcome-file-list>
  37. </web-app>

web.xml文件中,我们将index.jsp文件设置为欢迎文件。

index.jsp

  1. <%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
  2. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Enter your name</title>
  8. </head>
  9. <body>
  10. <stripes:form beanclass="com.zetcode.action.HelloActionBean">
  11. <stripes:errors/>
  12. Enter your name:
  13. <stripes:text name="userName"/>
  14. <stripes:submit name="save" value="Submit"/>
  15. </stripes:form>
  16. </body>
  17. </html>

index.jsp包含一个简单的 HTML 表单。 Stripes 具有自己的标签。 <stripes:errors/>显示验证错误。 如果我们未在该字段中写入任何文本,则会显示验证错误。 在<stripes:form>标记中,我们指定应处理请求的操作 bean。 <stripes:text/>创建一个文本字段。 创建的请求参数将自动映射到HelloActionBeanuserName属性。

Stripes 介绍 - 图3

图:StripesResources.properties

StripesResources.properties是 Stripes 框架的默认资源包。 它包含各种消息和标签的值。 样本文件包含在 Stripes 下载文件的lib子目录中。 我们将文件放入源包中,未指定包。 (该文件应最终位于WEB-INF/classes目录中。)

StripesResources.properties

  1. ...
  2. validation.required.valueNotPresent={0} is a required field
  3. ...

当我们在文本字段中未输入任何内容并单击“提交”按钮时,将显示此错误消息。

HelloActionBean.java

  1. package com.zetcode.action;
  2. import net.sourceforge.stripes.action.ActionBean;
  3. import net.sourceforge.stripes.action.ActionBeanContext;
  4. import net.sourceforge.stripes.action.DefaultHandler;
  5. import net.sourceforge.stripes.action.ForwardResolution;
  6. import net.sourceforge.stripes.action.Resolution;
  7. import net.sourceforge.stripes.validation.Validate;
  8. public class HelloActionBean implements ActionBean {
  9. private static final String VIEW = "/WEB-INF/jsp/greet.jsp";
  10. private ActionBeanContext context;
  11. @Validate(required=true)
  12. private String userName;
  13. public String getUserName() {
  14. return userName;
  15. }
  16. public void setUserName(String userName) {
  17. this.userName = userName;
  18. }
  19. @Override
  20. public void setContext(ActionBeanContext context) {
  21. this.context = context;
  22. }
  23. @Override
  24. public ActionBeanContext getContext() {
  25. return context;
  26. }
  27. @DefaultHandler
  28. public Resolution greet() {
  29. return new ForwardResolution(VIEW);
  30. }
  31. }

单击提交按钮时,将执行HelloActionBeanrequest参数自动绑定到其userName属性。 默认处理器将转发到greet.jsp视图。

  1. @Validate(required=true)
  2. private String userName;

@Validate注解用于强制验证表单的用户名字段。 如果未输入任何值,则会显示一条错误消息。

Stripes 介绍 - 图4

图:验证错误消息

我们应用中的第二个视图是greet.jsp

greet.jsp

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Greeting</title>
  8. </head>
  9. <body>
  10. <h3>Hello ${actionBean.userName}</h3>
  11. </body>
  12. </html>

greet.jsp显示给用户的问候消息。 通过${actionBean.userName}表达式,我们获得了用户名。

Stripes 介绍 - 图5

图:问候语

该应用以一条简单消息响应。

在本教程中,我们使用 Stripes Web 框架创建了两个简单的 Web 应用。 您可能也对 ZetCode 的 Java 教程验证过滤器教程Java MVC 教程Play 框架简介Spark JavaStripes,MyBatis & Derby 教程EJB 教程感兴趣。