目前分類:Struts (21)

瀏覽方式: 標題列表 簡短摘要

  java.lang.IllegalStateException: Committed。大多出現在sendRedirect或forward時發生,通常解法是:

request.setAttribute("result", finaldata);

Jemmy 發表在 痞客邦 留言(0) 人氣()

  花了一天半,終於搞懂JSTL與Struts Tag之間的差異。JSTL的S是Standard,既是standard,存取session沒有再依附其它framework如Struts。以近日Survey的LazyValidatorForm為例,要把它當作attribute裡一個變數取值:

<c:out value="${lazyForm.map.vo.name_tw}" />

  lazyForm是定義在struts_config.xml的一個<form-bean> name,即LazyValidatorForm的別名。LazyValidatorForm是落實動態存取的Java Bean,其實作原型就是放一個map。是故lazyForm後接一個map,而vo是一個Java Bean,name_tw則是該vo的欄位。相形之下用Struts Tag就乾淨多了,不會無由來找個map:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  在OOP的設計裡,屬性名稱叫name、id、type、property等,在不同的套件或框架下,未必全然等義。在良葛格網站這篇文章寫著<html:form>的name屬性是struts_config.xml的ActionForm的name,實際上是type屬性,而且<html:form>根本連id、name屬性都沒有,強加反而造成JSP編譯錯誤。而<html:text>、<html:submit>等若不放在<html:form>下,POST到Server端是無法用DynaBean取值的,只能用request.getParameter取得。

  而ActionForm若是LazyValidatorForm,從Server傳到Client沒有問題,但從Client POST到Server,倘若使用<html:form>,則需在struts_config.xml裡,在<form-bean>下加<form-property>子標籤,如此,像<html:text property="customerName">的值才能POST到DynaBean:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Date型態是自有程式設計以來,必須又難以通透到每個程式裡的資料型態,不僅具字串與數值特徵,其Format更因地而異,Locale觀念就包括了日期如何顯示。而往往遷就於前端面頁並不真的認識Date,就把Value Object的日期型態改為String,也造成前端到middle tier需要一個VO,而middle tier到後端又是另一個VO。

  在Struts1,要把JSP的日期欄位post到後端時變成Date型態,需繼承ActionServlet覆寫initOther method,如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  LazyValidatorForm若是從JSP –> Struts,是使用<html:text property="username" size="16" name="lazyForm"/>。那Struts –> JSP又該如何顯示設置呢?

  Action Class Code:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  在BeanUtils for Struts and Spring一節裡,Form Bean設成LazyValidatorForm就具有DynaForm的效果,而如何在JSP裡設定呢?

<html:text property="username" size="16" name="lazyForm"/>

  name屬性指向struts-config.xml的form bean裡的LazyValidatorForm:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  在這次開發的Framework內,引用了SiteMesh和Struts-Menu,而SiteMesh的範例是引用Maven的Struts2的quickstart,該quickstart的頁面佈局是用一套叫A CSS Framework寫成的,有自己的CSS檔;而Struts-Menu的自訂標籤也自己的CSS檔,造成畫面不如預期。

  頁面布局不外乎有Header、Navigation、Content和Footer等區域,所以這兩個Framework的CSS設定也無巧不巧都採取相同的命名,特別是<body>和<div id="context">,而CSS通常採用base路徑取得自己需要的圖檔,往往就需要在JSP設定<base>標籤或是Struts1的<html:base/>才能work。也因此終找到讓A CSS Framework和Struts-Menu共同work的解法,也就是在Struts-Menu提供的global.css檔裡,註解掉以下的內容,因為A CSS Framework也有相同的設定:

Jemmy 發表在 痞客邦 留言(1) 人氣()

  經好友指點,原來HTML的<input>裡的id和name屬性還有細微的區分。Struts1的ActionForm只會接受name屬性,而JavaScript在搜索Element時,若沒有name屬性,則改查id屬性。

  Struts1演至2008年底釋出1.3.10版,當中最為人詬病的ActionForm設計有了替代方案-引用Bean Utilities。根據http://www.niallp.pwp.blueyonder.co.uk/lazyactionform.html的說明,可以在form-bean引用LazyValidatorForm,LazyValidatorForm係從Apache的Commons-BeanUtils的DynaBean演化而來不用再自己寫ActionForm,如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  起初誤會Struts-Menu和Site-Mesh是同一個。Struts-Menu整合Struts1要設定不少東西才能work,不只是在Maven設定Jar,還要下載一堆css、js和圖檔。沒有像Struts2有提供一個quickstart的archtype那樣方便。這次倒過來,先講程式再推到設定。

    MenuRepository repository = new MenuRepository();

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Struts 2.1.8版於今年九月三十日釋出。早在2.1.6版釋出,就有不少變革,手上電腦簡體書進度就跟不上。畢竟Struts2的版本其實都該減1,因為Struts 1和Struts 2關係是八竿子打不著,硬湊而成。

  情形是我把一本叫程序天下的JPA裡的blog飯粒移到Maven去煮,用最新的Struts 2.1.8和Spring 2.5.6去調味,原光碟裡的lib附了太多未必用到的過期罐頭(jar)。

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Struts2的自訂標籤會不會管太多了點,在<s:select>產出時竟會自動生成<tr><td>後再把自己的<select>放進去,導致排版老出狀況。

  後來解法是在struts.properties檔把struts.ui.theme屬性從xhtml改成simple。或是在strust.xml加一條如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  試著把在Struts 1下所寫的權限程式碼移植到Struts 2,有看到Struts 2的有個建議作法與Struts 1是可以mapping的。就是Struts2的Action去implement兩個介面:

public class RoleAction extends BaseAction implements Preparable, ModelDriven<AaModel> {

Jemmy 發表在 痞客邦 留言(0) 人氣()

  除了Log是我的小罩門,前端Web更是我的大罩門。幾天研究下來雖有斬獲,但對Struts2的Web設計概念仍嫌模糊,記錄一些已知問題:

  • 重啟Web Server(如Jetty、Tomcat),在login後submit竟無法post,console訊息紋風不動。而解決方式是不要在LoginAction做Validate,如下:

//@RequiredStringValidator(message = "Please enter password!", trim = true)  這個就別用了。

Jemmy 發表在 痞客邦 留言(0) 人氣()

  著手修改struts2-archetype-quickstart所預設的頁面。使用SiteMesh作為頁面配置,位在WEB-INF/decorators的main.jsp,而main.jsp引入/styles/main.css進行頁面配置,我當時卡在這裡調不出我要的頁面寬度。現在整理使用SiteMesh如下:

1.web.xml增加Filter:該filter會使用sitemesh.xml(和web.xml放一起)

Jemmy 發表在 痞客邦 留言(0) 人氣()

2005-02-10 17:10:49,016 DEBUG [org.apache.commons.digester.Digester.sax] - <endElement(,,attribute)>
2005-02-10 17:10:49,016 DEBUG [org.apache.commons.digester.Digester] - <  match='taglib/tag/attribute'>

Jemmy 發表在 痞客邦 留言(0) 人氣()

  印象中第一次聽到Jetty Server是在前兩三年的Open Source的Semilar場合,當時以為是用於Perl,後來才知它是100% pure Java寫成的Web Server,有什麼與眾不同的地方還不知道,不過像Struts2的Maven預設使用它,而近來也有Eclipse的Plugin的支援,踹了不少冤枉路。以下是在Eclipse 3.5建置方式:

  第一種:plugin http://www.webtide.com/eclipse,這種方式可以在Server view多出Jetty的選擇,但有個麻煩是,Maven專案並不是Web專案,在Server按右鍵選[Add and Remove]時,maven專案不能被篩選出deploy。

Jemmy 發表在 痞客邦 留言(0) 人氣()

  粉久沒再踹Struts 2了,web.xml可以設個Filter減少struts.xml的配置,其實就是用注釋替代。飯粒如下:

(web.xml)

Jemmy 發表在 痞客邦 留言(0) 人氣()

  受命研發Framework時,是跳過Struts 1直接整合Struts 2和Spring 2。現在得補上Struts 1被Spring管理的技巧:

1. web.xml delegate to struts-config.xml (Struts 1) and applicationContext.xml (Spring)

(1) Configuration about spring

    <context-param>
        <param-name>contextConfigLocation</param-name>

Jemmy 發表在 痞客邦 留言(0) 人氣()

Struts 2真的是很多功能與Spring2有重複的功能,但Struts 2強項是學Ruby on Rails,在表現層的url映射與可搭配多種前端顯示技術,而Spring2則在IoC部份略勝一籌。而在Struts 2在給Spring2托管,是否所有資源都被Spring2主宰?目前是個疑問。
<listener>

Jemmy 發表在 痞客邦 留言(0) 人氣()

看了Struts2的Sample整合Spring和JPA還是無法deploy,所幸昨天跑了一趟書局,買了Struts2權威指南(簡體),還是可以簡單的上手:
lib要放的內容如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

1 2