PIXNET Logo登入

Jemmy Walker

跳到主文

部落格全站分類:

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 12月 16 週四 201017:08
  • java.lang.IllegalStateException: Committed之解

  java.lang.IllegalStateException: Committed。大多出現在sendRedirect或forward時發生,通常解法是: request.setAttribute("result", finaldata); request.getRequestDispatcher("calculation.jsp").forward(request, response); // 因為request的attribute屬性要隨著forward跳轉。   而我在Struts 1開發時也有這個問題,當我google到上述解法時,才恍然原來我是用Ajax去call Struts的Action並以JSON回傳,也就是我在Action的內容如下:

JSONArray json = JSONArray.fromObject(list);
logger.debug(json.toString());
PrintWriter out=response.getWriter();
out.println(json);
out.flush();
return null; // error: return mapping.findForward("success");

  因為使用response的getWriter來print和Struts1的findForward等於做了重複的output,out.print可以正常顯示結果後執行findForward就出現上述異常了。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 5月 04 週二 201014:17
  • 標籤迷障II:JSTL與Struts Tag

  花了一天半,終於搞懂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: <html:text name="lazyForm" property="vo.name_tw" />   上述分辨很簡單,真正花時間搞懂的是兩者迴圈用法大異其趣,各有自己的棉角,先說用Struts Tag。其迴圈標籤叫<logic:iterate>:

<logic:iterate name='lazyForm' property='vo.accounts' id='acc'>
    alert('<bean:write name="acc" property="name_tw" />');
</logic:iterate>

  vo下的accounts是一個List,List裡放著Java Bean。<logic:iterate>的id屬性則是Iterator的名字,給標籤內的子標籤如<bean:write>或<html:text>等等struts tag類的使用。用到<logic:iterate>還得做一個無聊卻必須的設定,需在struts_config.xml加入<message-resources>設定,例: <message-resources parameter="com.foo.ApplicationResource" />   即便完全用不到ApplicationResource這個檔,若不設定,就會丟出以下的Exception: Cannot find message resources under key org.apache.struts.action.MESSAGE   而JSTL的迴圈標籤是<c:forEach>,事實也有iterator機制,叫var,而<logic:iterate>的iterator叫id,學標籤真的很煩>"<。例:

<c:forEach items="${lazyForm.map.vo.accounts}" var="acc" varStatus="status" >
    alert('<c:out value="${acc.name_tw}" />');
</c:forEach>

  對照一下和<logic:iterate>用法類似。而我是被varStatus影響到,想取得status.index作為陣列索引,卻不知道var變數原來是一個Iterator,囧rz…。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 5月 03 週一 201016:17
  • LazyValidatorForm在<html:form>標籤迷障

  在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:

<form-beans>
   <form-bean name="restrictedForm" type="org.apache.struts.validator.LazyValidatorForm">
       <set-property property="restricted" value="true"/>
       <form-property name="orderNumber" type="java.lang.Integer" />
       <form-property name="customerName" type="java.lang.String" />
       <form-property name="orderValue" type="java.lang.BigDecimal" />
       <form-property name="orderLines" type="org.apache.commons.beanutils.LazyDynaBean[]" />
   </form-bean>
</form-beans>

  之前試過可以在<html:text>再指定name屬性(即ActionForm名稱),則毋須置於<html:form>底下就能POST到DynaBean成功,但目前會失敗,目前試出來的是,submit可以post到DynaBean,而用Ajax去Post,則DynaBean都無法取到值(偶有成功),在猜是否與jQuery的serialize方法有關?!   另外<form-bean>若把restricted屬性設為true(配置檔粗體字部份),可限制前端要POST的屬性名稱,未定義在<form-bean>裡的<form-property>是不會被當作submit的內容。   此外,LazyValidatorForm的DynaBean使用上還要特別注意一點,比如dynaForm.set("vo", bean);。是把一個JavaBean設給DynaBean的key名為vo,可是當end user點選另一個url操作別的功能,也用到vo這個key name,會造成Cast的問題,所以切換時,該url事先做dynaBean.set("vo", null)予以清空,就不會有問題。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 29 週四 201017:58
  • 在Struts1解決Date型態通透到前端問題

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

public class ActionServlet extends org.apache.struts.action.ActionServlet {
    @Override
    protected void initOther() throws ServletException {
        super.initOther();
        DateConverter d = new DateConverter(null);
        String[] datePattern = { "yyyy/MM/dd", "yyyy/mm/dd HH:mm:ss", "yyyy-MM-dd",  "yyyy.MM.dd" };
        d.setPatterns(datePattern);
        ConvertUtils.register(d, java.util.Date.class);
        ConvertUtils.register(d, String.class);
    }
}

  在原本的ActionServlet的initOther method裡,ConvertUtils已註冊一堆基本型態,如數值。是故在繼承它之後,先執行super.initOther(),再把DateConverter註冊到ConvertUtils。ConvertUtils遇到Date和String這兩個class,都交給DateConverter去轉換,其中String class不止被DateConverter檢查再轉換,像數值類別也是,可參考ActionServlet的原始碼。   之後在web.xml的<servlet>標籤找到<servlet-class>裡的org.apache.struts.action.ActionServlet,替換成你所繼承的class full name。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 28 週三 201014:21
  • LazyValidatorForm:從Server到JSP

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

Accounts t = this.baseService.findById(new Integer(id));
DynaBean dynaForm = (DynaBean) form;
dynaForm.set("vo", t); // vo is a Java Bean

  JSP Code:使用<bean:write> <input type="text" name="USERNAME" id="USERNAME" size="20"
value="<bean:write name="lazyForm" property="vo.username" />" />
  和<html:text>一樣,name屬性是定義在struts_config.xml的form name,其form type就是LazyValidatorForm。而property屬性可以直接用EL,不用弄個${}括起來。其EL表示方式如下: ${lazyForm.map.vo.username}
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 19 週一 201016:20
  • LazyValidatorForm在JSP設值

  在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: <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"/>   而property屬性才是以下取值的方式: DynaBean dynaForm = (DynaBean)form;
String username = (String) dynaForm.get("username");
  然若property屬性為一陣列,則可以在<html:text>等標籤加一屬性:indexed="true"。   LazyValidatorForm本身就是用commons-beanutils處理,若再用PropertyUtils做copy到POJO,應該是不work,遇到了再說。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 16 週五 201001:37
  • Struts-Menu與A CSS Framework的co-work

  在這次開發的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也有相同的設定:

/* body {
  background: #fff;
  font: 12px/1.5em Georgia,Serif;
}*/

ul.glassList {
    list-style: url(../images/aquadot.jpg) disc outside;
    margin-right: 50px;
}
/*
div#content {
    margin:0;
    padding: 1em;
    clear:both;
    width: 400px;
}

div#header {
    margin-bottom: 0px;
}*/

body、div#content和div#header均需註解。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 15 週四 201016:07
  • BeanUtils for Struts and Spring

  經好友指點,原來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,如下:

<struts-config>
    <form-beans>
        <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"/>
    </form-beans>

    <action-mappings>
        <action path="/myActionPath" type="myPackage.MyAction" name="lazyForm" validate="true"/>
    </action-mappings>
</struts-config>

  但一開始就報錯:java.lang.IllegalArgumentException: Resources cannot be null。原因是validate設為true,改為false就可以work,或者在struts_config.xml裡加上如下的標籤,其引用的validator等相關xml可以去找,或是設成空的。

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>

  Action自Request取得ActionForm可以這麼寫:DynaBean dynaForm = (DynaBean)form;。用法就像request.getParameter一樣,甚至可以取得集合類別如后:Map address   = (Map)dynaForm.get("address");。   Commons-BeanUtils甚至提供以下的用法,假設t是一個Java Bean的instance: PropertyUtils.copyProperties(t, form);  // 將ActionForm copy到Java Bean
PropertyUtils.copyProperties(form, t);  // 將Java Bean copy到Action Form
  常常在三層式架構設計裡,最單純的情境是單一table的增改刪查,古早時代是ActionForm是前端到Value Object的Mapping,而JDBC的RowMapper又是Value Object到DB的另一個Mapping,沒有Generate code寫起來會很煩。但現在比較好了,除了前端到中間層是用PropertyUtils.copyProperties 搞定之外,Spring的JDBCTemplate也提供了類似BeanUtils取代了RowMapper,程式片段如下: simpleJdbcTemplate.query(sql, ParameterizedBeanPropertyRowMapper.newInstance(VO.class), args);   ParameterizedBeanPropertyRowMapper實作了RowMapper介面,傳入Value Object的class,就可以和SQL所撈出來的欄位做自動mapping,與Commons-BeanUtils作用相仿。
(繼續閱讀...)
文章標籤

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

  • 個人分類:Struts
▲top
  • 4月 12 週一 201000:30
  • Struts-Menu初體驗

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

    MenuRepository repository = new MenuRepository();

    this.getMenu(list, repository, username, null);
    ServletContext sc = request.getSession().getServletContext();
    MenuRepository defaultRepository =
        (MenuRepository)sc.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
    repository.setDisplayers(defaultRepository.getDisplayers());

    request.getSession().setAttribute("repository", repository);

…

private void getMenu(
    List<Functions> list,
    MenuRepository repository,
    String username,
    MenuComponent pmc)    throws Exception
{
    for (Functions function : list) {
        List<Functions> listSub = this.functionDao.find(sqlWhere, function.getId(), username);
        MenuComponent mc = new MenuComponent();
        if (pmc != null) mc.setParent(pmc);
        mc.setTitle(function.getFunctionname());
        mc.setName("L" + function.getId());
        mc.setLocation(function.getUrl());
        if (listSub != null && listSub.size() > 0) {
            this.getMenu(listSub, repository, username, mc);
        }           
        repository.addMenu(mc);
    }
}

  上面片段取自Struts1 Action的內容,上半段目的是要把MenuRepository設給Session,再由JSP透過Struts-Menu提供的標籤產出Menu Tree,但寫法是有點怪異(紅字部份),這後面提到配置檔時再解說;下半段則是Struts-Menu核心寫法了:   MenuRepository透過addMenu放一堆MenuTree的節點資訊:MenuComponent,所以有四個必要屬性:
  • setName:在MenuRepository的MenuComponent的unique key(為什麼不叫ID?)。
  • setTitle:顯示名稱。
  • setLocation:設定URL。
  • setParent:設定父節點MenuComponent。
  •   對應到JSP寫法如下:

    <%@ page pageEncoding="utf-8" language="java"%>
    <%@ taglib uri="/WEB-INF/tld/jstl/c.tld" prefix="c" %>
    <%@ taglib uri="/WEB-INF/tld/jstl/fmt.tld" prefix="fmt" %>
    <%@ taglib uri="/WEB-INF/tld/jstl/fn.tld" prefix="fn" %>
    <%@ taglib uri="/WEB-INF/tld/struts/struts-html.tld" prefix="html"%>
    <%@ taglib uri="/WEB-INF/tld/struts-menu/struts-menu.tld" prefix="menu"%>
    <%@ taglib uri="/WEB-INF/tld/struts-menu/struts-menu-el.tld" prefix="menu-el"%>
    <HTML>
    <HEAD>
        <TITLE>MENU</TITLE>
        <html:base/>
        <link href="css/struts-menu/menuExpandable.css" rel="stylesheet" type="text/css" media="screen" />
        <link href="css/struts-menu/global.css" rel="stylesheet" type="text/css" media="all" />
        <script src="js/struts-menu/menuExpandable.js" type="text/javascript"></script>
        <link href="css/struts-menu/xtree.css" rel="stylesheet" type="text/css" media="all" />
        <script src="js/struts-menu/xtree.js" type="text/javascript"></script>
    </HEAD>
    <BODY>

    <h3>Function List</h3>
    <script type="text/javascript">
    <menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html" repository="repository" bundle="">
        if (document.getElementById) {
            <c:forEach var="menu" items="${repository.topMenus}">
                <menu-el:displayMenu name="${menu.name}"/>
            </c:forEach> 
        }
    </menu:useMenuDisplayer>

    </script>
    </BODY>
    </HTML>

      紅字為核心所在,是在Java Script使用Struts-Menu的標籤,<menu-useMenuDisplayer>的repository屬性正是被Struts設置的session內容:MenuRepository,而bundle屬性是i18n。所以從上面片段程式看,除了自訂標籤就有struts、struts-menu和公用JSTL之外,還得link一堆css、js。   在配置上也挺複雜的,第一個是要在web.xml加Listener標籤(SiteMesh是加Filter標籤):

    <listener>
        <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
    </listener>

      接著要在struts_config.xml也得加plug-in標籤如下(Struts2好像不用):

    <plug-in className="net.sf.navigator.menu.MenuPlugIn">
        <set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/>
    </plug-in>

      從上面得知還得引入一個menu-config.xml,而若JSP有設置bundle屬性,在<plug-in>標籤之前還要設置<message-resources>標籤。在struts-config.xml,標籤是有順序的。其menu-config.xml如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <MenuConfig>
      <Displayers>
        <Displayer   name="DropDown"
                     type="net.sf.navigator.displayer.DropDownMenuDisplayer"/>
        <Displayer   name="Simple"
                     type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
        <Displayer   name="CoolMenu"
                     type="net.sf.navigator.displayer.CoolMenuDisplayer"/>
        <Displayer   name="CoolMenu4"
                     type="net.sf.navigator.displayer.CoolMenuDisplayer4"/>
        <Displayer   name="MenuForm"
                     type="net.sf.navigator.example.PermissionsFormMenuDisplayer"/>
        <Displayer   name="ListMenu"
                     type="net.sf.navigator.displayer.ListMenuDisplayer"/>
        <Displayer   name="TabbedMenu"
                     type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
        <Displayer   name="Velocity"
                     type="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
        <Displayer   name="XtreeMenu"
                     type="net.sf.navigator.displayer.XtreeMenuDisplayer"/>
        <Displayer   name="CSSListMenu"
                     type="net.sf.navigator.displayer.CSSListMenuDisplayer"/>
      </Displayers>
      <Menus>
      </Menus>
    </MenuConfig>

      回過頭看JSP的<menu-useMenuDisplayer>的name屬性,是參考到名為Velocity的Displayer,Velocity又是一個Web模板系統,想當然爾要引入它們。最後解釋Struts1 Action在設定MenuRepository為何有點奇怪的地方:宣告一個MenuRepository變數,又要從ServletContext取得一個Default的MenuRepository?目的在於取得menu-context.xml內容值(getDispalyers)設給repository。在web initial時,就被存到特定名稱的session,其session name是MENU_REPOSITORY_KEY的常數。所以JSP就能使用Velocity生成Menu Tree。   所以在pom.xml要引入不少東西,如下:

    <dependency>  <!-- struts.version= 1.3.10 -->
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-core</artifactId>
        <version>${struts.version}</version>
    </dependency>
        <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-el</artifactId>
        <version>${struts.version}</version>
    </dependency>
        <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-taglib</artifactId>
        <version>${struts.version}</version>
    </dependency>
    <dependency>
        <groupId>struts-menu</groupId>
        <artifactId>struts-menu</artifactId>
        <version>2.4.3</version>
    </dependency>

    <!-- velocity -->
    <dependency>
        <groupId>velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>velocity-tools</groupId>
        <artifactId>velocity-tools</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>velocity-tools</groupId>
        <artifactId>velocity-tools-view</artifactId>
        <version>1.4</version>
    </dependency>

    <dependency>    <!-- 2009/4/25 -->
        <groupId>opensymphony</groupId>
        <artifactId>sitemesh</artifactId>
        <version>2.4.2</version>
    </dependency>

      我試過用velocity 1.5版會有點問題,所以還是用1.4,而其它struts-menu要用的js、css等檔案及配置,得自行下載放置,參考http://struts-menu.sourceforge.net/。嚴格來說,struts-menu做到這樣算很優秀了,若有quickstart的archetype就更好了,缺點就是配置太多了。
    (繼續閱讀...)
    文章標籤

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

    • 個人分類:Struts
    ▲top
    • 10月 20 週二 200915:54
    • Struts 2.1.6之後

      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)。   第一道菜是Error creating bean with name 'entityManagerFactory' defined in file […略]: Invocation of init method failed; nested exception is java.lang.NoSuchFieldError: TRACE。原本還有個org.slf4j.impl.StaticLoggerBinder的Exception,現在無法重現出,也間接知道問題出在SLF4J身上,我就加dependcy到最新的版本1.5.8: <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.8</version>
    </dependency>   SLF4J全名是Simple Logger Facade for Java,目的在於統一Log4J、java.util.logging、org.apache.commons.logging、logback(沒聽過)等log framework。唉!煩不煩啊!以前南韓政壇有感於政府有一堆養米蟲的委員會太多浪費公帑,經過決議,成立一個委員會來消滅這些委員會…XD。   第二、三道菜其實指的是同一個問題材料所煮。
  • Could not load the FreeMarker template named 'head':
    Attempted: /template/ajax/head.ftl
    The TemplateLoader provided by the FreeMarker Configuration was a: freemarker.cache.MultiTemplateLoader
  • Expression parameters.parseContent is undefined on line 45, column 28 in template/ajax/head.ftl. - Class: freemarker.core.TemplateObject
  •   到了2.1.6版,把原來在struts tag裡的ajax如<struts:head/>、<struts:datetimepicker/>還有tree、treenode等,都移到dojo-plugin,是故需要再加以下的dependcy: <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-dojo-plugin</artifactId>
        <version>${struts.version}</version>    <!-- 跟著最新的Struts2版本跑 -->
    </dependency>   看來Struts2對Dojo挺不錯的。而到2.1.8版,據稱已支援osgi-plugin了。拜這頓飯粒所賜,也領教了Hibernate自動在MySQL生成Table的威力。
    (繼續閱讀...)
    文章標籤

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

    • 個人分類:Struts
    ▲top
    123»

    自訂側欄

    自訂側欄

    個人資訊

    Jemmy
    暱稱:
    Jemmy
    分類:
    好友:
    累積中
    地區:

    熱門文章

    • (1,414)非我族類的DataTables.js:分頁和排序無作用原因
    • (541)Perl的跨行比對
    • (2,911)Java在換行字元的issue
    • (72)Notes的Agent二三事
    • (520)JavaMail初體驗
    • (31)六句聯
    • (1,418)UltraEdit轉大小寫
    • (576)Struts-Menu初體驗
    • (18,352)Windows route初體驗
    • (223)Log4J依不同class產出不同log file之二,加Daily Rolling

    文章分類

    • PostgreSQL (1)
    • Ruby (6)
    • 圖書 (18)
    • 旅行 (8)
    • OSGi (13)
    • 健康 (9)
    • Google (6)
    • 歷史 (5)
    • Spring-Security (5)
    • Java Script (11)
    • Log (8)
    • 娛樂 (25)
    • IT趨勢 (12)
    • 心情 (92)
    • 組織 (41)
    • Java基本功 (18)
    • Regex (19)
    • 新聞與政治 (46)
    • 電腦和網際網路 (47)
    • Maven (28)
    • Spring (31)
    • LotusNotes (12)
    • Java (60)
    • Oracle (17)
    • Struts (21)
    • jQuery (10)
    • 未分類文章 (1)

    最新文章

    • JDOM解析XML字串(非檔案)
    • Android SDK不能用於JDK 64bit
    • 非我族類的DataTables.js:分頁和排序無作用原因
    • java.lang.IllegalStateException: Committed之解
    • PostgreSQL二三事
    • Form/Field V.S. Document/Item
    • Spring Mail
    • Ant generate manifest.mf的class-path清單
    • dhcp.bat
    • Java update Notes的DateTime欄位

    動態訂閱

    文章精選

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: