本文主要复习Struts2的两种声明性架构:

  • 基于xml的声明性架构;
  • 基于java注解的声明性架构.

需要的jar包:

  • commons-fileupload-1.2.1.jar
  • commons-io-1.3.2.jar
  • commons-logging-1.0.4.jar
  • commons-logging-api-1.1.jar
  • freemarker-2.3.16.jar
  • javassist-3.7.ga.jar
  • ognl-3.0.jar
  • struts2-core-2.2.1.1.jar
  • xwork-core-2.2.1.1.jar

1.基于xml的声明性架构

web.xml配置:

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

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"></constant>
    <package name="struts2demo1" namespace="/demo1" extends="struts-default">
        <action name="Name">
            <result>/nameCollection.jsp</result>
        </action>
        <action name="Hello" class="xiaoxie.review.struts2demo.HelloworldAction">
            <result name="SUCCESS">/helloworld.jsp</result>
        </action>
    </package>
</struts>

这个示例中包含了两个动作(action),其中一个几乎什么都没做。package元素是一个重要的容器元素,示例中它声明了一个当框架将url映射到动作时需要使用的命名空间:

http://+localhost:8080/+struts2demo/+demo1/+helloworld.action
协议+主机名:端口+servlet上下文+命名空间+动作

nameCollection.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Name Collection</title>
</head>
<body>
    <center>
        <div>
            <h4>输入姓名</h4>
            <s:form action="Hello">
                <s:textfield name="name" label="姓名"/>
                <s:submit value="Submit"></s:submit>
            </s:form>
        </div>
    </center>
</body>
</html>

helloworld.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HelloWorld</title>
</head>
<body>
    <center>
        <h4>Hello</h4>
        <div><s:property value="coutomeName"/></div>
    </center>
</body>
</html>

HelloworldAction.java

package xiaoxie.review.struts2demo;

public class HelloworldAction {
    private String name;
    private String coutomeName;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getCoutomeName() {
        return coutomeName;
    }
    public void setCoutomeName(String coutomeName) {
        this.coutomeName = coutomeName;
    }
    public String execute(){
        setCoutomeName("Hello "+getName());
        return "SUCCESS";
    }
}

使用JavaBean的方式编写action使领域数据总是存储在action中,action的execute方法可以很方便的访问到数据;而为了在其他地方(比如jsp)也能访问到数据,框架底层也把数据放到了ValueStack中。ValueStack的机制是将action中的所有属性作为它的第一级属性公开出来,这样就可以使用ONGL来访问(<s:property value="coutomeName"/>).

2.基于java注解的声明性架构

在web.xml中添加以下代码

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
        <!-- 扫描xiaoxie包,查找注解 -->
        <param-name>actionPackages</param-name>
        <param-value>xiaoxie</param-value>
    </init-param>
</filter>

标记哪个类是action类有两种方法:

  • 让action类实现com.opensymphony.xwork2.Action接口
  • 使用命名约定,类名以Action结尾

例如:

@Result(name="SUCCESS",location="/helloworld.jsp")  
public class HelloworldAction{ ...... }