左侧为项目树形图截图。
web.xml的配置

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app id=”WebApp_ID” 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>Struts2Hello</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher

        </filter-class><!– 以过虑器的形式出现 –>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern><!– 过虑所有内容 –>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

演示页面index.jsp

<%@page contentType=”text/html; charset=GBK”%>
<%@taglib prefix=”s” uri=”/struts-tags”%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
    <head>
        <title>Converter</title>
    </head>
    <body>
        <s:form action=”HelloWorld” theme=”simple”>
            <%
                // name=”loc” 是LoginAction.java中的private Locale loc = Locale.CHINA;
            %>
    Locale:<s:textfield name=”loc” />
            <br>
            <s:submit />
        </s:form>
        <br>
        <h2>
            <s:property value=”msg” />
        </h2>
    </body>
</html>

演示页面submit.jsp

<%@page contentType=”text/html; charset=GBK”%>
<%@taglib prefix=”s” uri=”/struts-tags”%>
<html>
    <head>
        <title>submit</title>
    </head>
    <!– 提交页面,页面信息为Action中的集合属性 –>
    <body>
        <!– 错误提示层(错误显示信息), s:fielderror会自动检测页面中所有域(输入框等)中的错误信息–>
        <div style=”color: red”>
            <s:fielderror></s:fielderror>
        </div>
        <s:form action=”ProductConfirm” theme=”simple”>
            <table>
                <tr style=”background-color: powderblue; font-weight: bold;”>
                    <td>
                        Product Name
                    </td>
                    <td>
                        Price
                    </td>
                    <td>
                        Date of Production
                    </td>
                </tr>
                <%
                    //1.s:iterator:使用迭代器
                        //2.value="new int[3]" status=”stat”:整形数组集合对应action中的List集合;每次取出一个值存入stat中
                        //3. products[’+#stat.index+’].name:OGNL表达式,相当于<%= “products[” + stat.index + “].name” %>
                        //        (1)products对应action(ProductConfirm.java)中的 products属性,
                        //        (2)整个句子的作用是从action中找到products并取出products的name属性
                        //        (3)规范表达式:%{Action 中的属性集合[整数数组的迭代取值].具体pojo类的属性}
                %>
                <s:iterator value=”new int[3]” status=”stat”>
                    <tr>
                        <td>
                            <s:textfield name=”%{‘products[‘+#stat.index+’].pname’}” />
                        </td>
                        <td>
                            <s:textfield name=”%{‘products[‘+#stat.index+’].price’}” />
                        </td>
                        <td>
                            <s:textfield name=”%{‘products[‘+#stat.index+’].pdate’}” />
                        </td>
                    </tr>
                </s:iterator>
                <tr>
                    <td colspan=”3″>
                        <s:submit />
                         </td>
                </tr>
            </table>
        </s:form>
    </body>
</html>

演示页面show.jsp

<%@ page contentType=”text/html; charset=GBK”%>
<%@taglib prefix=”s” uri=”/struts-tags”%>
<html>
    <head>
        <title>show</title>
    </head>
    <!– 显示页面,显示Action中的集合属性 –>
    <body>
        <table>
            <tr style=”background-color: powderblue; font-weight: bold;”>
                <td>
                    Product Name
                </td>
                <td>
                    Price
                </td>
                <td>
                    Date of Production
                </td>
            </tr>
            <!– s:iterator value=”products” status=”stat”:与提交页面submit.jsp相同 –>
            <s:iterator value=”products” status=”stat”>
                <tr>
                    <td>
                        <s:property value=”pname” />
                    </td>
                    <td>
                        $
                        <s:property value=”price” />
                    </td>
                    <td>
                        <s:property value=”pdate” />
                    </td>
                </tr>
            </s:iterator>
        </table>
    </body>
</html>

LocaleConverter.java源代码

package com.action;

import java.lang.reflect.Member;
import java.util.Locale;
import java.util.Map;

// 继承ognl默认的格式转换类

public class LocaleConverter extends ognl.DefaultTypeConverter {
    @Override
    // Map context:上下上下文对象; Object value:待转换对象; Class toType:目标类型
    public Object convertValue(Map context, Object value, Class toType) {
        // 如果要转换的是本地化类型Locale.class(如整形:Integer.class)
        if (toType == Locale.class) {
            // 把待转换类型强制转换成字符串类型,并取第一个元素
            String locale = ((String[]) value)[0];
            // 截取字符串去掉"_";如果zh_CN截取得(zh,CN)
            return new Locale(locale.substring(0, 2), locale.substring(3));
        }
        // 转换成字符串类型
        else if (toType == String.class) {
            Locale locale = (Locale) value;
            return locale.toString();
        }
        return null;
    }
}

LoginAction.java源代码

package com.action;

import java.util.Locale;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.LocalizedTextUtil;

@SuppressWarnings("serial")
public class LoginAction extends ActionSupport {
    private String msg;
    private Locale loc = Locale.CHINA;    //默认语言版本的中文
    public LoginAction() {
        super();
        // TODO Auto-generated constructor stub
    }
    public LoginAction(String msg, Locale loc) {
        super();
        this.msg = msg;
        this.loc = loc;
    }
    @Override
    public String execute() throws Exception {

        //LocalizedTextUtil是struts2.0中的国际化初始化工具,
        //获取当前资源文件中的名为HelloWorld的key,然后使用loc语言版本    
        msg = LocalizedTextUtil.findDefaultText("HelloWorld", loc);
        return SUCCESS;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Locale getLoc() {
        return loc;
    }

    public void setLoc(Locale loc) {
        this.loc = loc;
    }
}

ProductConfirm.java源代码

package com.action;

import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.pojo.Product;
@SuppressWarnings("serial")
public class ProductConfirm extends ActionSupport {
    // 标准list集合,这里为了避免html转码,将<>写为< <>>,使用时候替换即可
    private List< <product>> products;
    public List< <product>> getProducts() {
        return products;
    }

    public void setProducts(List< <product>> products) {
        this.products = products;
    }
    @Override
    public String execute() throws Exception {
        //遍历products列表
        for (Product p : products) {
            System.out.println(p.getPname() + "|" + p.getPrice() + "|"
                    + p.getPdate());
        }
        return SUCCESS;
    }
}

Product.java源代码

package com.pojo;
import java.io.Serializable;
import java.util.Date;
@SuppressWarnings("serial")
public class Product implements Serializable {

    //String,double,Date数据类型系统都内置有他们的转换器,无需另写转换器
    private String pname;
    private double price;
    private Date pdate;

    public Product() {

    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Date getPdate() {
        return pdate;
    }

    public void setPdate(Date pdate) {
       this.pdate = pdate;
    }

    public Product(String pname, double price, Date pdate) {
        super();
        this.pname = pname;
        this.price = price;
        this.pdate = pdate;
    }
}

src/com.action.ProductConfirm-conversion.properties
ProductConfirm-conversion.properties //固定格式Action名-conversion.properties
Element_products=com.pojo.Product //表明products的转换类型是Product,固定格式添加:Element_集合属性名=集合对象的实现类

Element_products=com.pojo.Product

src/xwork-conversion.properties
xwork-conversion.properties //全局转换配置文件,必须放在SRC目录下,文件名固定!
java.util.Locale = com.action.LocaleConverter //自动调用com.action.LocaleConverter来转换

java.util.Locale =com.action.LocaleConverter

src/struts.properties

struts.custom.i18n.resources=globalMessages

src/globalMessages_en_US.properties

HelloWorld=HelloWorld
failtip={0}Login failed\!
language=Select language
smg=Now is{0}
succtip={0}Welcome,Login success.
usen=Americal English
zhcn=Simplified Chinese

src/globalMessages_zh_CN.properties

HelloWorld=\u4F60\u597D
failtip={0}\u767B\u5F55\u5931\u8D25
language=\u9009\u62E9\u8BED\u8A00
smg={0}\u73B0\u5728\u7684\u4E8B\u4EF6\u662F{1}
succtip={0}\u6B22\u8FCE,\u767B\u5F55\u6210\u529F
usen=\u82F1\u8BED
zhcn=\u4E2D\u6587

struts.xml配置文件配置如下

<?xml version=”1.0″ encoding=”GBK”?>
<!DOCTYPE struts PUBLIC
         “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
         “http://struts.apache.org/dtds/struts-2.0.dtd”>
<struts>
    <include file=”struts-default.xml” /><!– 使用缺省的struts的配置文件 –>
    <!– 包空间 ConverterDemo 继承 struts-default –>
    <package name=”ConverterDemo” extends=”struts-default”>
        <!– 映射名name=”HelloWorld” 与 index.jsp 中的 action=”HelloWorld” 对应,使用com.action.LoginAction来实现 –>
        <action name=”HelloWorld”>
            <result>/index.jsp</result>
        </action>
        <!–
            1.映射名name=”ProductConfirm” 与 submit.jsp 中的 action=”ProductConfirm” 对应,使用com.action.ProductConfirm来实现
            2.成功转到show.jsp页面
            3.失败转入submit.jsp页面
        –>
        <action name=”ProductConfirm”
           >
            <result>/show.jsp</result>
            <result name=”input”>/submit.jsp</result>
        </action>
    </package>
</struts>