1.枚舉類:
public enum AreaType implements IEnumConverter {FZ("福州", 591), XM("廈門", 592);private String text;private Integer value;private AreaType(String text, Integer value) {this.text = text;this.value = value;}@Overridepublic String getName() {return this.name();}@Overridepublic Integer getOrdinal() {return this.ordinal();}@Overridepublic String getText() {return text;}@Overridepublic Integer getValue() {return value;}/** * 根據序數得到枚舉 * * @param ordinal * @return */public static AreaType getByOrdinal(Integer ordinal) {if (null != ordinal) {for (AreaType t : AreaType.values()) {if (t.ordinal() == ordinal) {return t;}}}return null;}}
2.介面,讓枚舉實現這個介面,達到所有的枚舉都可以轉換的效果
/** * 自訂的枚舉轉換器介面,自己定義的枚舉實現這個介面,struts2的轉換器就會對其進行轉換 * * @author chenl 建立日期 Dec 1, 2011 */public interface IEnumConverter {/** * 得到序數 */Integer getOrdinal();/** * 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明 */String getName();String getText();Integer getValue();}
3.枚舉轉換器,繼承StrutsTypeConverter類
/** * 枚舉轉換器 * * @author chenl 建立日期 Dec 1, 2011 */public class EnumCommonConverter extends StrutsTypeConverter {@Overridepublic Object convertFromString(Map context, String[] values, Class clazz) {System.out.println("進入轉換器......");String str = values[0];if (str != null && !"".equals(str)) {try {IEnumConverter[] enums = (IEnumConverter[]) clazz.getMethod("values").invoke(null);// 調用枚舉的values方法if (null != enums && enums.length > 0) {for (IEnumConverter e : enums) {if (str.equals(e.getValue().toString())) {return e;}}}} catch (Exception e) {e.printStackTrace();}}return null;}@Overridepublic String convertToString(Map context, Object o) {System.out.println("入進轉換器的convertToString方法......");return null != o && o instanceof IEnumConverter ? ((IEnumConverter) o).getText() : "";}public static void main(String[] args) {Object obj = new EnumCommonConverter().convertFromString(null, new String[] { "1" }, AreaType.class);System.out.println(obj);}}
4.最後是在工程的src的目錄下加入xwork-conversion.properties檔案,
內容為:com.jungle.enums.IEnumConverter = com.jungle.enums.EnumCommonConverter
請求頁面:
<!-- 枚舉轉換器 例子--><%AreaType[] areas = AreaType.values();request.setAttribute("areas",areas);%><s:form action="enum!execute.action" namespace="/"><s:select name="area" list="#request.areas" id="area"listKey="value" listValue="text"></s:select><s:submit></s:submit></s:form>
Action:
import com.jungle.enums.AreaType;import com.opensymphony.xwork2.ActionSupport;@Results(value = { @Result(name = "success", location = "/enum.jsp") })public class EnumAction extends ActionSupport {private AreaType area;@Overridepublic String execute() throws Exception {System.out.println("EnumAction.execute():" + area);return SUCCESS;}public AreaType getArea() {return area;}public void setArea(AreaType area) {this.area = area;}}
結果頁:
<s:property value="area.name"/><s:property value="area.text"/><s:property value="area.value"/>
轉換器寫得不是很完善,還需要改進,這篇文章只是想起到拋磚引玉的作用。
這裡的Action使用了無配置的外掛程式需要用到struts2-convention-plugin.jar可以查看我的另一篇文章:http://blog.csdn.net/cl61917380/article/details/7017745
這篇的重點是轉換器。你也可以使用常規的方法訪問.