"Hello, world!" of Struts 2

按:目前更简单的方式是用 maven 引入 Struts 支持,可参另一篇记录,本文创建项目部分的参考价值有限,但手写代码部分对初学者仍有价值。

按官方的资料,使用 Struts 2架构时,在 web 端提交一个 form,这个 form 不会提交到另一个 server page,而是提交到一个 Java 类,这个类就是所谓的 Action。Action 接收到提交客户端提交来的内容後,把它传给处理程序,再将返回的结果通过 response 返回给 web 端,返回的一般是一个页面,但也可能是一个文件(如 PDF, Excel, Java applet 等等)。

准备开发环境

非常简单,保证机器上有 JDK 1.5+,Eclipse JEE, Struts 2的程序包就可以了。Struts 2可以到其官网下载。目前我下载到的版本是2.2.3和2.3.16.1, 因为本文的内容并不是一次写成的,在接下来 Eclipse 中的示例使用的是2.2.3,而自写的 HelloWorld 使用的是2.3.16.1。

在 Eclipse 中使用 struts-blank.war

将 Struts 2官方的示例 struts-blank.war 配置到 Eclipse 中可按如下步骤进行:

  1. 在 Eclipse 中创建一个 Dynamic Web Project,名为 hellostruts。
  2. 解压从 apache 官网上下载的 struts 压缩包,可以看到 struts-2.2.3/apps 里有一个 struts-blank.war,再对其解压。
  3. 将上步中解压出的文件拷贝到 hellostruts 对应目录。注意1和2的目录结构,主要不同就是 Java 类的位置,在1中,是一个单独的 src 目录,而 struts-blank 中,则藏于 WEB-INF/classes 之中。
  1. 此时,在 Eclipse 运行即可看到效果,显示如下页面:

到这里,应该说已经将 Struts 2官方的 blank 示例运行成功了。但到这里,也基本上没有用到什么 Struts 2相关的东西,下面将自己创建一个 HelloWorld.

Hello World

这里将使用 Eclipse 编写一个 Struts2 HelloWorld: 用户在浏览器中输入一个名词,提交,浏览器回显给用户一条欢迎语句。

1. 创建一个 Dynamic Web Project, 代码结构如下图所示,具体代码如後面步骤的描述。

struts2 hello world

2. 编写 Action, 代码如下:

package org.iridium.hellostruts;
public class HelloWorldAction {
    private String name;
    public String execute() throws Exception {
        return "success";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

需要注意的是,这个类没有 extends 通常工程中常用的几个 Action 的子类。

3. 编写 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
    <h1>Test</h1>
    <form action="<%=request.getContextPath()%>/hello">
        <label for="name">Please enter your name</label><br /> <input
            type="text" name="name" /> <input type="submit" value="Say Hello" />
    </form>
</body>
</html>

4. 编写 HelloWorld.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
    Hello,
    <s:property value="name" />
</body>
</html>

5. 修改 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Struts 2 Hello World</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

以上配置中的 filter 中的 ng 表示 next generation.

一般情况下,过滤器用 StrutsPrepareAndExecuteFilter 一个就行了,但如果集成了其他插件,可能需要修改,如集成了 sitemesh 插件的话,Struts 2 的过滤器就需要配置两个。

filter-mapping 的匹配方式 /* 是约定的,一般不用修改为 *.action, *.do 一类。注意匹配模式,url-pattern 的定义的细小差别可能引起匹配问题:*.action 是能匹配到所有路径下以 action 结尾的请求的,但 /*.action 只能匹配到根目录下的 Action.

6. 新增 struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="helloworld" extends="struts-default">
        <action name="hello" class="org.iridium.hellostruts.HelloWorldAction"
            method="execute">
            <result name="success">/HelloWorld.jsp</result>
        </action>
    </package>
</struts>

以上的代码按位置准备好後,Run or Debug 项目即可。

本例参考来源:http://www.tutorialspoint.com/struts_2/struts_quick_guide.htm