51.md 12.4 KB
Newer Older
W
wizardforcel 已提交
1
# Stripes 介绍
W
wizardforcel 已提交
2 3 4

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

W
wizardforcel 已提交
5
这是 Stripes 入门教程。 我们使用 Stripes Web 框架创建两个简单的 Web 应用。 我们使用 NetBeans 来构建应用。
W
wizardforcel 已提交
6

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

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

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

W
wizardforcel 已提交
13
从 Stripes 的 Github [页面](https://github.com/StripesFramework/stripes/releases)中,我们下载了最新的 Stripes 版本。 在`lib`子目录中,我们需要在项目中包含三个 JAR 文件:`commons-logging-1.1.3.jar``cos-05Nov2002.jar``stripes-1.6.0.jar`。 此外,还有`StripesResources.properties`文件,其中包含各种消息。
W
wizardforcel 已提交
14

W
wizardforcel 已提交
15
## 简单 Stripes 应用
W
wizardforcel 已提交
16

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

W
wizardforcel 已提交
19 20
![The project files](img/d8c58ad8f8d2b1581d6d816c0f4249b3.jpg)

W
wizardforcel 已提交
21
图:项目文件
W
wizardforcel 已提交
22 23 24



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

W
wizardforcel 已提交
27 28
![The project libraries](img/097522900b06a6aeefb2df9c79fe0a8b.jpg)

W
wizardforcel 已提交
29
图:项目库
W
wizardforcel 已提交
30 31 32



W
wizardforcel 已提交
33
这些是我们构建 Stripes 应用所需的库。
W
wizardforcel 已提交
34 35 36

`web.xml`

W
wizardforcel 已提交
37
```java
W
wizardforcel 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <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.Packages</param-name>
            <param-value>com.zetcode.action</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>StripesFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>StripesFilter</filter-name>
        <servlet-name>StripesDispatcher</servlet-name>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <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>    

    <welcome-file-list>
        <welcome-file>Hello.action</welcome-file>
    </welcome-file-list>

</web-app>

```

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

`HelloActionBean.java`

W
wizardforcel 已提交
90
```java
W
wizardforcel 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
package com.zetcode.action;

import java.util.Date;
import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.action.ActionBeanContext;
import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.Resolution;

public class HelloActionBean implements ActionBean {

    private static final String VIEW = "/WEB-INF/jsp/showDate.jsp";
    private ActionBeanContext context;
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public void setContext(ActionBeanContext context) {

        this.context = context;
    }

    @Override
    public ActionBeanContext getContext() {

        return context;
    }

    @DefaultHandler
    public Resolution hello() {

        this.date = new Date();
        return new ForwardResolution(VIEW);
    }
}

```

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

W
wizardforcel 已提交
138
```java
W
wizardforcel 已提交
139 140 141 142 143 144
private static final String VIEW = "/WEB-INF/jsp/showDate.jsp";

```

该视图是`showDate.jsp`文件。

W
wizardforcel 已提交
145
```java
W
wizardforcel 已提交
146 147 148 149 150 151
private ActionBeanContext context;

```

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

W
wizardforcel 已提交
152
```java
W
wizardforcel 已提交
153 154 155 156 157 158 159 160 161
@DefaultHandler
public Resolution hello() {

    this.date = new Date();
    return new ForwardResolution(VIEW);
}

```

W
wizardforcel 已提交
162
`@DefaultHandler`注释为此动作 bean 设置了默认处理器。 它用当前日期填充`date`属性,并返回一个新的`ForwardResolution`。 分辨率转发到视图。
W
wizardforcel 已提交
163 164 165

`showDate.jsp`

W
wizardforcel 已提交
166
```java
W
wizardforcel 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Current date</title>
    </head>
    <body>
        <h3>The date is ${actionBean.date}</h3>
    </body>
</html>

```

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

W
wizardforcel 已提交
183
```java
W
wizardforcel 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
$ curl localhost:8084/SimpleStripes/

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Current date</title>
    </head>
    <body>
        <h3>The date is Thu Jun 02 14:13:01 CEST 2016</h3>
    </body>
</html>

```

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

W
wizardforcel 已提交
201
## Hello Stripes 应用
W
wizardforcel 已提交
202

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

`web.xml`

W
wizardforcel 已提交
207
```java
W
wizardforcel 已提交
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <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.Packages</param-name>
            <param-value>com.zetcode.action</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>StripesFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>StripesFilter</filter-name>
        <servlet-name>StripesDispatcher</servlet-name>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <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>    

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

```

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

`index.jsp`

W
wizardforcel 已提交
260
```java
W
wizardforcel 已提交
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
<%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Enter your name</title>
    </head>
    <body>
        <stripes:form beanclass="com.zetcode.action.HelloActionBean">
            <stripes:errors/>
                Enter your name:
                <stripes:text name="userName"/>
                <stripes:submit name="save" value="Submit"/>
        </stripes:form>
    </body>
</html>

```

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

W
wizardforcel 已提交
283 284
![StripesResources.properties](img/0ccffe00cf20c0fdf40b4cd705577e57.jpg)

W
wizardforcel 已提交
285
图:`StripesResources.properties`
W
wizardforcel 已提交
286 287 288



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

`StripesResources.properties`

W
wizardforcel 已提交
293
```java
W
wizardforcel 已提交
294 295 296 297 298 299
...
validation.required.valueNotPresent={0} is a required field
...

```

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

`HelloActionBean.java`

W
wizardforcel 已提交
304
```java
W
wizardforcel 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
package com.zetcode.action;

import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.action.ActionBeanContext;
import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.validation.Validate;

public class HelloActionBean implements ActionBean {

    private static final String VIEW = "/WEB-INF/jsp/greet.jsp";
    private ActionBeanContext context;

    @Validate(required=true)
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public void setContext(ActionBeanContext context) {

        this.context = context;
    }

    @Override
    public ActionBeanContext getContext() {

        return context;
    }

    @DefaultHandler
    public Resolution greet() {

        return new ForwardResolution(VIEW);
    }
}

```

W
wizardforcel 已提交
351
单击提交按钮时,将执行`HelloActionBean``request`参数自动绑定到其`userName`属性。 默认处理器将转发到`greet.jsp`视图。
W
wizardforcel 已提交
352

W
wizardforcel 已提交
353
```java
W
wizardforcel 已提交
354 355 356 357 358 359 360
@Validate(required=true)
private String userName;

```

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

W
wizardforcel 已提交
361 362
![Validation error message](img/1cf288248acf4b19eec2ee353d47047c.jpg)

W
wizardforcel 已提交
363
图:验证错误消息
W
wizardforcel 已提交
364 365


W
wizardforcel 已提交
366
我们应用中的第二个视图是`greet.jsp`
W
wizardforcel 已提交
367 368 369

`greet.jsp`

W
wizardforcel 已提交
370
```java
W
wizardforcel 已提交
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
<!DOCTYPE html>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Greeting</title>
    </head>
    <body>
        <h3>Hello ${actionBean.userName}</h3>
    </body>
</html>

```

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

W
wizardforcel 已提交
389 390
![Greeting](img/2cf0aac86c9331e3d7049047615f7847.jpg)

W
wizardforcel 已提交
391
图:问候语
W
wizardforcel 已提交
392 393 394



W
wizardforcel 已提交
395
该应用以一条简单消息响应。
W
wizardforcel 已提交
396

W
wizardforcel 已提交
397
在本教程中,我们使用 Stripes Web 框架创建了两个简单的 Web 应用。 您可能也对 ZetCode 的 [Java 教程](/lang/java/)[验证过滤器教程](/java/validationfilter/)[Java MVC 教程](/java/mvc/)[Play 框架简介](/java/play/)[Spark Java](/java/spark/)[Stripes,MyBatis & Derby 教程](/java/stripesmybatisderby/)[EJB 教程](/java/ejb/)感兴趣。