欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Struts2中的參數傳遞
本篇主要通過(guò)實(shí)例來(lái)講述Struts2中各種各樣的參數傳遞。這個(gè)參數傳遞的過(guò)程主要指數據從View層傳遞到Control層時(shí)Struts2的工作方式。根據前兩篇文章的知識,我們知道,Struts2完成參數傳遞處理工作的基礎是OGNL和ValueStack。而在這個(gè)過(guò)程中,我也把Struts2所要做的工作大致歸納為兩個(gè)方面:
1. 對OGNL操作進(jìn)行封裝,完成OGNL表達式所表示的值到Java對象的值傳遞機制
2. 在參數傳遞的過(guò)程中,做恰當的類(lèi)型轉化,保證頁(yè)面上的字符串能夠轉化成各式各樣的Java對象
接下來(lái),通過(guò)四個(gè)不同的角度,來(lái)具體講述Struts2在這兩個(gè)方面的工作。
目 錄 [ - ]
最簡(jiǎn)單的參數傳遞
Array、List、Map等容器類(lèi)型的參數傳遞
文件上傳
自定義的類(lèi)型轉化實(shí)現
最簡(jiǎn)單的參數傳遞 
使用OGNL的最基本的功能,就能完成普通的Java對象的賦值工作。Struts2在內部已經(jīng)完成了OGNL的基本封裝。這些封裝包括對OGNL表達式到Java對象的賦值機制,以及對基本的Java類(lèi)型的類(lèi)型轉化支持。這些基本類(lèi)型包括String、Number(以及其基本類(lèi)型int、float、double等)、Boolean(boolean)、數組、Class、Date等類(lèi)型。
在這里我想額外強調的是XWork對JDK5.0中的Enum類(lèi)型和Date類(lèi)型的支持。
Enum類(lèi)型
枚舉類(lèi)型是JDK5.0引入的新特性。枚舉類(lèi)型也能解決很多實(shí)際問(wèn)題,是J2EE編程中的最佳實(shí)踐之一。XWork中,有一個(gè)專(zhuān)門(mén)的EnumTypeConverter負責對Enum類(lèi)型的數據進(jìn)行轉化。
Java代碼 
public class EnumTypeConverter extends DefaultTypeConverter {
/**
* Converts the given object to a given type. How this is to be done is implemented in toClass. The OGNL context, o
* and toClass are given. This method should be able to handle conversion in general without any context or object
* specified.
*
* @param context - OGNL context under which the conversion is being done
* @param o       - the object to be converted
* @param toClass - the class that contains the code to convert to enumeration
* @return Converted value of type declared in toClass or TypeConverter.NoConversionPossible to indicate that the
*         conversion was not possible.
*/
public Object convertValue(Map context, Object o, Class toClass) {
if (o instanceof String[]) {
return convertFromString(((String[]) o)[0], toClass);
} else if (o instanceof String) {
return convertFromString((String) o, toClass);
}
return super.convertValue(context, o, toClass);
}
/**
* Converts one or more String values to the specified class.
* @param value - the String values to be converted, such as those submitted from an HTML form
* @param toClass - the class to convert to
* @return the converted object
*/
public java.lang.Enum convertFromString(String value, Class toClass) {
return Enum.valueOf(toClass, value);
}
}
有了這個(gè)類(lèi),我們就可以比較輕松的對枚舉類(lèi)型進(jìn)行數據賦值了。
Java代碼 
public enum Gender {
MALE, FEMALE
}
Html代碼 
<form method="post" action="/struts-example/enum-conversion.action">
<input type="text" name="user.name" value="downpour" />
<select name="user.gender">
<option value="MALE">男</option>
<option value="FEMALE">女</option>
</select>
<input type="submit" value="submit" />
</form>
Java代碼 
public class EnumConversionAction extends ActionSupport {
private static final Log logger = LogFactory.getLog(Policy.class);
private User user;
/* (non-Javadoc)
* @see com.opensymphony.xwork2.ActionSupport#execute()
*/
@Override
public String execute() throws Exception {
logger.info("user's gender:" + user.getGender());
return super.execute();
}
// setters and getters
}
通過(guò)上面的代碼,就完成了對枚舉類(lèi)型的賦值。不過(guò)這里有一點(diǎn)需要特別指出:那就是XWork在XWork-2.1.X的版本之前,枚舉類(lèi)型不被默認支持。如果你需要獲得枚舉類(lèi)型的自動(dòng)賦值,還需要增加一個(gè)配置文件xwork-conversion.properties到classpath下:
Java代碼 
java.lang.Enum=com.opensymphony.xwork2.util.EnumTypeConverter
對于使用新的版本的XWork的朋友,則不需要增加這個(gè)配置文件。
Date類(lèi)型
XWork默認是支持Date類(lèi)型的轉化的。不過(guò)從源碼上來(lái)看,貌似我們很難用上它默認的類(lèi)型轉化。
Java代碼 
private Object doConvertToDate(Map context, Object value, Class toType) {
Date result = null;
if (value instanceof String && value != null && ((String) value).length() > 0) {
String sa = (String) value;
Locale locale = getLocale(context);
DateFormat df = null;
if (java.sql.Time.class == toType) {
df = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
} else if (java.sql.Timestamp.class == toType) {
Date check = null;
SimpleDateFormat dtfmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.MEDIUM,
locale);
SimpleDateFormat fullfmt = new SimpleDateFormat(dtfmt.toPattern() + MILLISECOND_FORMAT,
locale);
SimpleDateFormat dfmt = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT,
locale);
SimpleDateFormat[] fmts = {fullfmt, dtfmt, dfmt};
for (int i = 0; i < fmts.length; i++) {
try {
check = fmts[i].parse(sa);
df = fmts[i];
if (check != null) {
break;
}
} catch (ParseException ignore) {
}
}
} else if (java.util.Date.class == toType) {
Date check = null;
SimpleDateFormat d1 = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, locale);
SimpleDateFormat d2 = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
SimpleDateFormat d3 = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
SimpleDateFormat rfc3399 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat[] dfs = {d1, d2, d3, rfc3399}; //added RFC 3339 date format (XW-473)
for (int i = 0; i < dfs.length; i++) {
try {
check = dfs[i].parse(sa);
df = dfs[i];
if (check != null) {
break;
}
}
catch (ParseException ignore) {
}
}
}
//final fallback for dates without time
if (df == null) {
df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
}
try {
df.setLenient(false); // let's use strict parsing (XW-341)
result = df.parse(sa);
if (!(Date.class == toType)) {
try {
Constructor constructor = toType.getConstructor(new Class[]{long.class});
return constructor.newInstance(new Object[]{new Long(result.getTime())});
} catch (Exception e) {
throw new XWorkException("Couldn't create class " + toType + " using default (long) constructor", e);
}
}
} catch (ParseException e) {
throw new XWorkException("Could not parse date", e);
}
} else if (Date.class.isAssignableFrom(value.getClass())) {
result = (Date) value;
}
return result;
}
這段代碼就是XWork處理將String轉成Date類(lèi)型的過(guò)程,從整個(gè)過(guò)程上來(lái)看,我們很難用上這段代碼,因為我們在界面上的Date類(lèi)型的表現形式往往是:'yyyy-MM-dd'或者相關(guān)的形式,很明顯,上面的流程無(wú)法匹配這樣的日期類(lèi)型。
所以,針對Date,我們往往會(huì )自定義一個(gè)日期轉化的類(lèi)進(jìn)行處理,這個(gè)在下面會(huì )有具體的介紹。
Array、List、Map等容器類(lèi)型的參數傳遞 
除了簡(jiǎn)單的基于JavaBean方式的參數傳遞支持,Struts2還支持對Array、List、Map等容器類(lèi)型的數據結構做數據賦值。不過(guò)歷史一路走來(lái),XWork針對容器類(lèi)型的數據賦值一直有變化,讓我們慢慢解讀這些變化,從而也來(lái)看看編程思路是如何改變的。
1. 2004年,XWork-1.0.X的年代
當時(shí)XWork所支持的針對容器的數據賦值還比較土。這方面moxie在論壇上有一篇文章專(zhuān)門(mén)來(lái)講述:http://www.javaeye.com/topic/8770。
總的來(lái)說(shuō),那個(gè)年代對于容器的數據賦值,需要依賴(lài)于XWork的輔助類(lèi)。我們可以看到,如果你要對List進(jìn)行賦值,需要新建一個(gè)XWorkList的實(shí)現類(lèi),并把所需要進(jìn)行數據賦值的Java類(lèi)傳遞到XWorkList的構造函數中。而對Map等對象的賦值,也同理可得。
這種數據賦值的方式的優(yōu)缺點(diǎn)都非常明顯。優(yōu)點(diǎn)在于簡(jiǎn)單,你不需要額外定義任何其他的內容,而是直接使用XWork的輔助類(lèi)來(lái)實(shí)現類(lèi)型轉化。缺點(diǎn)在于擴展性很弱,很明顯,針對某一個(gè)具體的容器,就需要一個(gè)XWork的實(shí)現類(lèi),List有XWorkList對應,Map有XWorkMap對應。甚至在那個(gè)時(shí)候,還沒(méi)有Set的支持,因為沒(méi)有XWorkSet的實(shí)現。所以使用這種方式,在擴展性方面需要遭受?chē)乐氐目简灐?div style="height:15px;">
2. 2006年,XWork-2.0.X的年代
也許是XWork團隊看到了擴展性上的問(wèn)題,所以在XWork和Webwork同時(shí)升級以后,采用了新的方式來(lái)處理容器賦值。而此時(shí),Javaeye上也涌現出了新的文章,Tin同學(xué)對新的方式做了詳細的表述:http://www.javaeye.com/topic/17939。
不過(guò)這個(gè)新的整合方式似乎并不被大家所看好。
lllyq 寫(xiě)道
我覺(jué)得XWorkList, XWorkMap還是很有用的,挺好的設計,其實(shí)沒(méi)有必要deprecated。
moxie 寫(xiě)道
集合支持不向下兼容。XWorkList已經(jīng)是@deprecated,用它就錯,還不如直接刪除掉。在webwork2.2中,它需要為集合另外配置一個(gè)conversion.properties文件。真不明白,這樣有什么優(yōu)點(diǎn)?
這種新的整合方式,實(shí)際上只是解決了針對容器賦值,不需要依賴(lài)XWork的輔助類(lèi)這樣的一個(gè)問(wèn)題,不過(guò)其付出的代價(jià),卻是多了一個(gè)配置文件,這也讓人非常郁悶。好好的類(lèi)型轉化,平白無(wú)故多出了一個(gè)同package下的配置文件,這也無(wú)形中增加了編程的復雜度。
3. 現在,擁抱了泛型和Annotation的年代
實(shí)際上,在XWork發(fā)展到XWork-2.0.X之后,也開(kāi)始注重了對泛型和Annotation的支持。所以,容器類(lèi)型的轉化,我們也可以嘗試一下使用JDK的新特性來(lái)進(jìn)行,當然這也是目前最為推薦的做法。
下面分別給出使用泛型和Annotation的代碼示例:
Html代碼 
<form method="post" action="/struts-example/ognl-collection-conversion.action">
<input type="text" name="users[0].name" value="aaa" />
<input type="text" name="users[1].name" value="bbb" />
<input type="text" name="users2[0].name" value="ccc" />
<input type="text" name="users2[1].name" value="ddd" />
<input type="text" name="userMap['user1'].name" value="eee" />
<input type="text" name="userMap['user2'].name" value="fff" />
<input type="text" name="userMap2['user3'].name" value="ggg" />
<input type="text" name="userMap2['user4'].name" value="hhh" />
<input type="submit" value="submit" />
</form>
Java代碼 
public class OgnlConversionAction extends ActionSupport {
private static final long serialVersionUID = 4396125455881691845L;
private static final Log logger = LogFactory.getLog(Policy.class);
private List<User> users;
@Element(value = User.class)
private List users2;
private Map<String, User> userMap;
@Element(value = User.class)
private Map userMap2;
/* (non-Javadoc)
* @see com.opensymphony.xwork2.ActionSupport#execute()
*/
@Override
public String execute() throws Exception {
// -> aaa
logger.info("users[0].name : " + users.get(0).getName());
// -> bbb
logger.info("users[1].name : " + users.get(1).getName());
// -> ccc
logger.info("users2[0].name : " + ((User)users2.get(0)).getName());
// -> ddd
logger.info("users2[1].name : " + ((User)users2.get(1)).getName());
// -> [user1, user2]
logger.info("userMap.key : " + userMap.keySet());
// -> eee
logger.info("userMap.key = " + "user1" + " : " + "userMap.value(user1's name) = " + userMap.get("user1").getName());
// -> fff
logger.info("userMap.key = " + "user2" + " : " + "userMap.value(user2's name) = " + userMap.get("user2").getName());
// -> [user3, user4]
logger.info("userMap2.key : " + userMap2.keySet());
// -> ggg
logger.info("userMap2.key = " + "user3" + " : " + "userMap.value(user3's name) = " + ((User)userMap2.get("user3")).getName());
// -> hhh
logger.info("userMap2.key = " + "user4" + " : " + "userMap.value(user4's name) = " + ((User)userMap2.get("user4")).getName());
return super.execute();
}
// setters and getters
}
上面的代碼中,我們可以看到,如果你使用泛型,那么你無(wú)需再使用任何額外的配置文件或者Annotation,XWork會(huì )把一切都為你準備好。如果你沒(méi)有使用泛型,那么你可以使用Annotation來(lái)指定你需要進(jìn)行轉化的對象類(lèi)型。其中,對Map對象使用Annotation時(shí),Element中的value所對應的值,是Map中的value所對應的class。
由此可見(jiàn),泛型和Annotation,在一定程度上,還是可以簡(jiǎn)化我們很多工作的。
文件上傳 
文件上傳其實(shí)也是參數傳遞的一種,所以從方案上來(lái)講,Struts2同樣使用了一個(gè)攔截器來(lái)處理。而這個(gè)攔截器,同樣來(lái)自于原來(lái)的Webwork,基本上沒(méi)有做什么很大的改變。有關(guān)這個(gè)攔截器的詳細內容,我們也留一個(gè)懸念,在后續章節中詳細講解。目前,你只要知曉,這個(gè)攔截器能幫助你完成一切文件上傳相關(guān)的機制。
早在2005年,Quake Wang就對Webwork的文件上傳機制有了詳細的講解:http://www.javaeye.com/topic/10697
在這里我簡(jiǎn)單小結一下在進(jìn)行文件上傳時(shí)的三大要點(diǎn):
1. 在配置文件上傳時(shí),攔截器的順序非常關(guān)鍵
Xml代碼 
<interceptor-stack name="uploadStack">
<interceptor-ref name="upload"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
具體來(lái)說(shuō),upload的攔截器,必須在params的攔截器之前
2. 攔截器額外提供了一些額外的文件信息
Quake Wang 寫(xiě)道
ContentType: 文件的ContentType(可以用在做download的時(shí)候)
FileName: 實(shí)際的文件名
在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName這2個(gè)屬性, 也能夠被自動(dòng)綁定
3. 攔截器提供的文件上傳功能,你得到的是一個(gè)臨時(shí)文件
robbin 寫(xiě)道
在webwork的file upload 攔截器功能中,它提供的File只是一個(gè)臨時(shí)文件,Action執行之后就會(huì )被自動(dòng)刪除,因此你必須在A(yíng)ction中自己出來(lái)文件的存儲問(wèn)題,或者寫(xiě)到服務(wù)器的某個(gè)目錄,或者保存到數據庫中。如果你準備寫(xiě)到服務(wù)器的某個(gè)目錄下面的話(huà),你必須自己面臨著(zhù)處理文件同名的問(wèn)題
而時(shí)代發(fā)展到Struts2的年代,對于文件上傳的整體機制沒(méi)有做什么改變。只是Struts2將apache的common-fileupload作為了其默認的文件上傳的機制。
例子歸例子,實(shí)際情況中,我們還是會(huì )遇到一些問(wèn)題:
1. 默認實(shí)現中,文件和文件信息是分開(kāi)表述的,對于后臺處理來(lái)說(shuō),不是非常方便
2. common-fileupload的實(shí)現,雖然提供了文件上傳的機制,也可以讓你得到文件的一些屬性信息,但是它無(wú)法得到客戶(hù)端的上傳路徑
對于第一個(gè)問(wèn)題,我們可以使用OGNL的特性,將這些文件和文件名等文件信息做封裝:
Java代碼 
public class FileComponent implements Serializable {
private static final long serialVersionUID = 4594003082271182188L;
private File upload;
private String fileName;
/**
* The default constructor
*/
public FileComponent() {
}
/**
* @return Returns the upload.
*/
public File getUpload() {
return upload;
}
/**
* @return Returns the fileName.
*/
public String getFileName() {
return fileName;
}
/**
* @param upload
*            The upload to set.
*/
public void setUpload(File upload) {
this.upload = upload;
}
/**
* @param fileName
*            The fileName to set.
*/
public void setFileName(String fileName) {
this.fileName = fileName;
}
/**
* @param fileName
*            The fileName to set.
*/
public void setUploadFileName(String uploadFileName) {
this.fileName = uploadFileName;
}
}
在這個(gè)類(lèi)中,我定義了upload表示上傳的文件,fileName表示上傳文件的文件名。請注意我整個(gè)文件中的最后一個(gè)方法:setUploadFileName。這個(gè)方法將保證FileUploadInterceptor在運行時(shí),能夠正確設置上傳的文件名。
Java代碼 
/**
* @param fileName
*            The fileName to set.
*/
public void setUploadFileName(String uploadFileName) {
this.fileName = uploadFileName;
}
這樣,在A(yíng)ction中,我們將面對一個(gè)個(gè)完整的fileComponent對象,其中包括文件的引用、文件名稱(chēng)和其他文件信息。這樣就不會(huì )因為上傳多個(gè)文件而手足無(wú)措,你只需要使用fileComponent數組,就能輕松對上傳的文件進(jìn)行管理,而避免了在A(yíng)ction中書(shū)寫(xiě)許多個(gè)文件、文件名等屬性了。
對于第二個(gè)問(wèn)題,目前我也沒(méi)有找到很好的方法。我所采用的方式與Yulimin是一致的:
Yulimin 寫(xiě)道
我現在的做法是表單中增加了一個(gè)隱藏域,當用戶(hù)文件選擇后,利用JS截取到用戶(hù)選擇的文件名,然后一起提交上去。
不知道有沒(méi)有最終的解決方法?
自定義的類(lèi)型轉化實(shí)現 
Struts2在處理參數傳遞的過(guò)程中,需要完成類(lèi)型轉化,保證頁(yè)面上的字符串能夠轉化成各式各樣的Java對象。而這一點(diǎn),其實(shí)也是由OGNL完成的。還記得我們在講述OGNL的基礎知識的時(shí)候列出來(lái)過(guò)的一個(gè)接口嘛?
Java代碼 
/**
* Appends the standard naming context for evaluating an OGNL expression
* into the context given so that cached maps can be used as a context.
*
* @param root the root of the object graph
* @param context the context to which OGNL context will be added.
* @return Context Map with the keys <CODE>root</CODE> and <CODE>context</CODE>
*         set appropriately
*/
public static Map addDefaultContext( Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess, Map context );
在這個(gè)接口中,我們可以在使用OGNL的時(shí)候,注冊針對某個(gè)Class級別的自己實(shí)現的TypeConverter,這樣,OGNL就會(huì )在進(jìn)行設值計算和取值計算的時(shí)候,使用自定義的類(lèi)型轉化方式了。讓我們來(lái)看看TypeConverter的接口定義:
Java代碼 
/**
*  context - OGNL context under which the conversion is being done
*  target - target object in which the property is being set
*  member - member (Constructor, Method or Field) being set
*  propertyName - property name being set
*  value - value to be converted
*  toType - type to which value is converted
*/
public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
知道了原理,就簡(jiǎn)單了,我們可以自己實(shí)現一個(gè)TypeConverter的實(shí)現類(lèi),并且在Struts2中注冊一下使用這個(gè)TypeConverter的Java類(lèi)型的對應關(guān)系,我們就可以完成自定義的類(lèi)型轉化了。
具體的例子,可以參考一下Quake Wang同學(xué)在2005年時(shí)的一篇文章:http://www.javaeye.com/topic/10507。文章針對的是Webwork2,但是無(wú)論是實(shí)現方式還是操作步驟,與Struts2是完全相同的。值得提醒的是,這篇文章的回復也非常有價(jià)值,在看文章的同時(shí),不要忘記看回復。
不過(guò)針對Quake Wang的例子,我也想做一些補充。它的例子中,主要講述了Struts2中如何去做java.utils.Date的自動(dòng)類(lèi)型轉化,也正如后面回復中有人提到:
wolfsquare 寫(xiě)道
如果我在界面上有兩種格式的日期怎么辦?
例如一種短格式: SimpleDateFormat("yyyy-mm-dd"),一種長(cháng)格式SimpleDateFormat("yyyy-mm-dd hh:MM:ss")
而Quake Wang對此是這樣解決的:
Quake Wang 寫(xiě)道
可以根據你的應用情況,看哪種方式是比較常見(jiàn)的轉換規則,那么把這個(gè)規則定成Application-wide conversion rules:
Java代碼 
在classpath root下面寫(xiě)一個(gè)xwork-conversion.properties:
java.util.Date=com.javaeye.core.webwork.converter.DateConverter
另外的一個(gè)轉換,可以寫(xiě)成Class-specific conversion rules :
otherDate=com.javaeye.core.webwork.converter.OtherDateConverter
我在這里提供一個(gè)我在實(shí)際項目中采用的方式:
Java代碼 
public class DateConverter extends DefaultTypeConverter {
private static final Log logger = LogFactory.getLog(DateConverter.class);
private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final String MONTH_PATTERN = "yyyy-MM";
/**
* Convert value between types
*/
public Object convertValue(Map ognlContext, Object value, Class toType) {
Object result = null;
if (toType == Date.class) {
result = doConvertToDate(value);
} else if (toType == String.class) {
result = doConvertToString(value);
}
return result;
}
/**
* Convert String to Date
*
* @param value
* @return
*/
private Date doConvertToDate(Object value) {
Date result = null;
if (value instanceof String) {
// TODO add date converter parse order here
result = DateUtils.parseDate((String) value, new String[] { DATE_PATTERN, DATETIME_PATTERN, MONTH_PATTERN });
// all patterns failed, try a milliseconds constructor
if (result == null && StringUtils.isNotEmpty((String)value)) {
try {
result = new Date(new Long((String) value).longValue());
} catch (Exception e) {
logger.error("Converting from milliseconds to Date fails!");
e.printStackTrace();
}
}
} else if (value instanceof Object[]) {
// let's try to convert the first element only
Object[] array = (Object[]) value;
if ((array != null) && (array.length >= 1)) {
value = array[0];
result = doConvertToDate(value);
}
} else if (Date.class.isAssignableFrom(value.getClass())) {
result = (Date) value;
}
return result;
}
/**
* Convert Date to String
*
* @param value
* @return
*/
private String doConvertToString(Object value) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATETIME_PATTERN);
String result = null;
if (value instanceof Date) {
result = simpleDateFormat.format(value);
}
return result;
}
}
在我采用的方式中,依然采用Application-wide conversion rules,只是在自定義的Converter中,根據不同的日期形式進(jìn)行逐個(gè)匹配,找到第一個(gè)匹配的日期類(lèi)型進(jìn)行轉化。當然,這是一種投機取巧的辦法,不過(guò)比較實(shí)用,適用于項目中不太使用國際化,日期的形式不太復雜的情況。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
OGNL表達式總結
OGNL 摘要
Struts2 日歷選擇框 標簽<sx:datetimepicker.../>詳解
類(lèi)型轉換類(lèi),將字符串轉換成其他基本類(lèi)型
Struts2 中的值棧是什么?
struts 2 配置方法及其技巧實(shí)例整理(一)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久