1. 程式人生 > >Struts 1 中“日期型別”的表單資料處理

Struts 1 中“日期型別”的表單資料處理

在表單中填寫日期是個很常見的情況。

在Struts 1的ActionForm中,可以根據要提交的表單資料建立對應的ActionForm Bean屬性,屬性的型別支援Java的基本資料型別及其包裝類,還有字串,也就是說如果你將ActionForm Bean的屬性型別設為(int),Struts會自動將無法正常轉換為int型別的資料都轉換為0(如果屬性型別為包裝類,則可能得到null),可以用於實現第一層次的表單資料過濾。

但是我們應該明白,表單資料本質上全部都是文字字元,Struts只不過是幫我們做了一步自動轉換。當然只是簡單的資料型別轉換,但如將一個字串"2007-12-5"轉換為java.util.Date型別,Struts則沒有提供直接的支援了,再說日期字串的解析本身就是一個情況複雜的事情,因為這個“日期字串”也沒有固定的模式(當然我們最常見的模式在Java中應該是"yyyy-MM-dd"了)。

於是我們若要在表單中處理日期型別的資料,必須自己設計一種解決方案。

方案1:在ActionForm Bean中,日期直接當作字串處理。
這樣做的話,在每次從ActionForm Bean中取資料時,都需要手動進行一次日期字串的解析,非常麻煩

方案2:在ActionForm Bean中,對應表單的屬性型別仍作字串處理,但提供一對輔助Getter/Setter方法,分別提供對此屬性的解析/格式化處理。
這樣做又能保持ActionForm Bean的相容性(所有的屬性資料型別都是Struts自動轉換所支援的),又能很方便地取得解析後的日期型別的資料。

方案3:直接提供java.util.Date型別的屬性及其Getter/Setter。但是這樣做在提交表單的時候會出錯,因為Struts無法將一個字串引數傳給一個需要java.util.Date型別引數的Setter。所以我們稍作改造,將Setter引數型別改為java.lang.String,並在其方法體中進行日期字串的解析。

下面比較一下3種方案的利弊:

方案1做法沒有什麼不妥,就是麻煩了點。當然如果你的專案不大,處理資料時直接採用SQL語句,或者是資料庫中本來就是使用VARCHAR等型別來儲存“日期”的,那麼這樣做也可以,無需進行型別解析轉換。

方案2則優點較多:屬性本身採用字串型別,能夠儲存表單提交的原始資料。需要日期型別時只需根據情況呼叫輔助用的Getter,呼叫輔助用Setter時,又可以自動格式化日期字串。同時仍然可以使用屬性原配的Getter/Setter來處理實際提交的字串。不足之處:對應每個日期屬性都需要多增加兩個方法(不過是一次編寫,可反覆呼叫:),然後日期的解析是否會帶來執行效率問題?(我感覺幾乎可以完全忽略……)

方案3只是效果能夠實現,缺點多多:表單提交的原始資料丟失,因為在呼叫Setter的時候便進行了解析,如果解析不成功,我們必須要捨棄非法格式的資料,並給日期型別的屬性對應的成員變數一個“預設值”,那麼這個“預設值”使用什麼好呢?null?1900-1-1?這裡可不能丟擲異常,否則Struts在提交表單的時候問題可大了。還有你見過Getter和Setter型別不一致的Bean屬性嗎?好像不符合規範,又讓人感覺怪怪的,很是罪過,我們要剔除掉奇怪的程式碼以免影響開發人員的心情!

最後,因為方案2儲存了原始資料,所以可以很方便地在validate方法中判斷原始輸入是否合法;而方案3則難以處理判斷了,因為它在Set的時候就已經把原始資料給過濾了。
有人說Struts配套的外掛Validator框架?那個我就不考慮了,它預設的日期模式是“yyyy/MM/dd”不合我意,然後其驗證過程仍然是呼叫Getter然後解析字串,並不能給我提供將字串轉換為日期的便利方式。

所以我推薦方案2

ps:日期的解析和格式化請參考“java.text.SimpleDateFormat

相關推薦

Struts 1 日期型別”的資料處理

在表單中填寫日期是個很常見的情況。 在Struts 1的ActionForm中,可以根據要提交的表單資料建立對應的ActionForm Bean屬性,屬性的型別支援Java的基本資料型別及其包裝類,還有字串,也就是說如果你將ActionForm Bean的屬性型別設為(int

javaWeb 前端Form資料處理(手動拼json)

在前端我們會用到最多的就是form表單提交資料,在form表單中有很多都是自動將資料傳到後臺,然後通過實體來接受的,但是有的時候我們就是需要在前端就拿到這個Form表單的資料,這是我們就可以自己講資料

1、Jquery formajax提交 2、jquery.filter校驗多個相同型別的文字框是否輸入資料有重複

JSP引用該JS <script type="text/javascript" src="http://malsup.github.com/jquery.form.js"></script> 表單儲存按鈕 onclick=save(); func

layer.open彈框資料無法獲取

 layer.open彈框中的表單資料無法獲取 表單資料模板 layer.open()   頁面效果:   當點選確定後,radio和textarea獲取的值總是為空,解決辦法: var setPriCustByCallPhone = $('#setPr

JavaWeb:Controller獲取Form提交的資料的方式

Controller中獲取Form表單提交的資料的方式 新增HttpServletRequst型別入參,通過HttpServletRequst.getParameter()獲取請求資料 @RequestMapping(value="/user/save", meth

struts2模型化獲取資料

             class屬性:action全路徑,對應伺服器的路徑             method屬性:action裡面預設執行的方法execute

ReactForm資料獲取

const { getFieldDecorator } = this.props.form; this.getFieldsValue = this.props.form.getFieldsValue;//獲得表單所有控制元件的值 this.props.form.getFieldsValue(

自動為瀏覽器複製出來的資料加上引號與冒號

做爬蟲的朋友,這個很麻煩。 首先啊,全選將資料複製到editplus,或其它的編輯器中,這裡用editplus,然後,兩個(.*?)之間的是鍵值的分隔符: ^(.*?)    (.*?)$ '$1':'$2' 正則的規則,不懂的可以問我。 kouk

Atitit 面試技術點最小化問題法總結 目錄 1. Web 前端 1 1.1. Jq 常用操作哪些?? 1 1.2. 查詢後如何繫結後端資料到表格 2 1.3. 提交後怎麼接受資料 2 2.

Atitit 面試技術點最小化問題法總結     目錄 1. Web 前端 1 1.1. Jq 常用操作哪些?? 1 1.2. 查詢後如何繫結後端資料到表格 2 1.3. 提交後怎麼接受表單資料 2 2. Mvc Springmvc 2 2.1

使用ant design的modal嵌入form,動態獲取資料

最近在做一個公司的專案,使用的是react然後用了ant design,在做一個功能的時候使用了modal,modal裡面還嵌套了一個子元件,就想子元件裡的id能動態獲取然後從介面拉資料,但是始終不行因為componentWillMount這個只進去的時候會渲染,後

POI 將按日期資料彙總到一個excel 大資料量

一. 簡介            現在有按時間分的使用者表,要在每月一號將這些表的資料彙總到一個excel中。每張表的資料量很大。            昨天通宵搞得,只為紀念,方便以後遇見同樣的需求做參考。            之前是想著每天匯出一個excel, 然

淺談web工程BeanUtils的封裝MyBeanUtils,populate方法使用 【接收前端form資料

宣告本測試使用JDK9,Tomcat9.0.10 ,IDEA2018.2  ; 淺談  BeanUtils 的封裝 , BeanUtils  類中方法  populate  (Object  be

關於《JavaWeb開發實戰經典》接收封裝的文字資料出現中文亂碼問題的解決方法

smartupload亂碼問題 今天在寫smartupload的demo時,在接收表單資料時出現了中文亂碼,從網上綜合了各種方法才得以解決。 1.smartupload.html中可見對form使用enctype進行表單封裝 <!DOCTYPE html&

Servlet如何獲取使用者提交的查詢引數或資料

可以通過請求物件(HttpServletRequest)的getParameter()方法通過引數名獲得引數值。如果有包含多個值的引數(例如複選框),可以通過請求物件的getParameterValue

前端頁面把form資料轉換為json格式

$.fn.serializeJson=function(){               var serializeObj={};               var array=this.serializeArray();               var str=th

解決form資料提交不到servlet去的問題

servlet用的baseservlet繼承,反射獲取url地址中的method的地址 @WebServlet("/orders") public class OrderServlet extends BaseServlet{ // 3.增加配送通知單

jQuery使用serialize(),serializeArray()方法取得資料+字串和物件型別兩種提交的方法

原始form表單值獲取方式(手動):$.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上星&position=IT技

Angular 開發小妙招1:提交資料驗證不通過,更改輸入元件的樣式

開發表單時,客戶端資料完整性校驗是必不可少的,在jquery 時代出現了無數的資料驗證外掛也很好用,開發Angular 應用時,angular 內建了一些常用的資料驗證指令。今天要講的不是這些指令如何使用,今天講什麼呢,今天講一些關於驗證樣式的問題,相關的基礎知識在angular.cn 官方文件中都有介紹,在

提交資料,在IE及其它瀏覽器亂碼的解決方案

如在IE下提交表單資料亂碼:        解決方案: 在form表單中新增    onsubmit="document.charset='GBK';"       【注編碼根據各自環境條件指定】 如在其它瀏覽器下提交表單資料亂碼:            acce

Java,當含有檔案上傳時,提交資料的如何讀取(吐血版)

int TeamId = 0;// 用於存放輸出的資訊String message = "";// 在自己的專案中構造出一個用於存放使用者照片的資料夾String projectpath = this.getServletContext().getRealPath("/he