Wednesday 26 December 2012

Object Date tidak bind apabila guna dijit.form.DateTextBox

Perkara ini terjadi dalam Spring 3.05.
Apabila ada data daripada model, tidak display pada view apabila gunakan dijit.form.DateTextBox.
Perkara ini tidak terjadi pada textbox biasa di mana binding  (input/output) ke model nampak ok.

Punca:

Mungkin kerana tidak menggunakan Spring.addDecoration sebaliknya menggunakan property dojo pada element html.

Penyelesaian:

Setakat ini menggunakan Spring.addDecoration nampak ok.

Perkara berkaitan:

Spring-js-resources perlu ditambah kerana perlukan Spring.js dan SpringDojo.js
Sekarang guna spring-js-resources-2.3.0

Langkah-langkah yang telah diambil:
  1. lib DOJO 1.8.0 telah dipindahkan ke META-INF/web-resources/
  2. xxx-servlet.xml telah diubah untuk membenarkan carian pada classpath/resources

Dev info:

Codename APR
Spring 3.05
Dojo 1.8.0

DOJO 1.7 + Spring 3.05 config

fuiyo, masalah pulak dengan Dojo ni.

Hari ini belajar macam mana nak guna static file daripada jar.

Config dalam xxx-servlet.xml
      <!-- Turns on support for mapping requests to Spring MVC @Controller methods   
           Also registers default Formatters and Validators for use across all @Controllers -->  
      <mvc:annotation-driven />  
      <!-- Handles HTTP GET requests for /resources/** by efficiently serving   
           up static resources -->  
      <mvc:resources location="/, classpath:/META-INF/web-resources/" mapping="/resources/**" />  

Kemudian import
 <spring:url value="/scripts/dojo-release-1.8.0/dojo/dojo.js" var="dojo_url" />  
 <spring:url value="/scripts/dojo-release-1.8.0/dijit/themes/claro/claro.css" var="claro_url" />  
 <spring:url value="/app/resources/spring/Spring.js" var="spring_url" />  
 <spring:url value="/app/resources/spring/Spring-Dojo.js" var="spring_dojo_url" />  
 <!-- dojo -->  
 <script src="${dojo_url}" type="text/javascript" data-dojo-config="isDebug: true,parseOnLoad: true" />  
 <script src="${spring_url}" type="text/javascript" ><!-- /required for FF3 and Opera --></script>  
 <script src="${spring_dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --></script>  
 <script type="text/javascript">  
      require(["dojo/parser", "dijit/MenuBar", "dijit/MenuBarItem", "dijit/PopupMenuBarItem", "dijit/DropDownMenu", "dijit/MenuItem"]);  
 </script>  

Link /app/resources/spring/ based on setting in current project only.

Dev info:
Codename APR

Tuesday 25 December 2012

Request method 'POST' not supported bila guna RequestMethod.DELETE dan RequestMethod.PUT

Hahaha, kelakar lak bila kenangkan error ni, ingatkan Spring 3.0.5 tak support ka, atau tak guna teknologi REST ... tapi rupa-rupanya ada config yang perlu ditambah dalam web.xml.

Lain kali sila jangan buat lagi.

Thanks to +Osman McGee for this solution. :)

 Archiq: kena ada ni kot..  
 <filter>  
      <filter-name>HttpMethodFilter</filter-name>  
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>  
 </filter>  
 pastu mapping dia..  
 <filter-mapping>  
      <filter-name>HttpMethodFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
 </filter-mapping>  

Dev info:
Codename APR.

Friday 21 December 2012

Ibatis 2: SQL Map untuk Oracle DB Procedure.

 <procedure id="StaffAppraisal.updateKra" parameterClass="map">  
      <![CDATA[  
       {  
           #p_return_val,jdbcType=DECIMAL,mode=OUT# = call appraisal.update_kra(   
                #p_staff_id,jdbcType=VARCHAR,mode=IN#,   
                #p_appraisal_seq,jdbcType=VARCHAR,mode=IN#,  
                #p_session_code,jdbcType=VARCHAR,mode=IN#,   
                #p_year,jdbcType=VARCHAR,mode=IN#,  
                #p_kra,jdbcType=VARCHAR,mode=IN#,   
                #p_errmsg,jdbcType=VARCHAR,mode=OUT#  
           )  
       }  
      ]]>  
 </procedure>  

Dev info : 
Codename= APAR
DB = Oracle 10G

Contoh DAO (tiada kena mengena dengan map di atas):
...
      public String sendEmail (String formOwnerId, String emailType, String refCode)  
      {  
           String errorMesej = null;  
           Map<String,String> param = new HashMap<String,String>();  
           param.put("p_staff_id"     , formOwnerId);  
           param.put("p_email_type", emailType);  
           param.put("p_ref"          , refCode);  
           param.put("p_errmsg"     , refCode);  
           this.getSqlMapClientTemplate().update("EMAIL.sendEmail", param);  
           errorMesej = param.get("p_errmsg");  
           return errorMesej;  
      }  

...


How to call an Oracle 10G procedure in ibatis 2?

Wednesday 19 December 2012

dijit.form.Button : calling javascript function

Ini adalah cara sesuai untuk masukkan function js dalam button dojo.
Jika function onClick digunakan melalui cara biasa, ada masalah ketika rendering.
Masalahnya? cari sendiri... hehehe.
 <button data-dojo-type="dijit.form.Button" type="button"      id="btnCancel"  
      data-dojo-props="onClick:function(){window.location='<c:out value="${cancel_url}" />';}" >Cancel</button>  

Tuesday 18 December 2012

dijit.form.DateTextBox example

 <form:input path="asEndDate" id="endDate" type="text" data-dojo-type="dijit.form.DateTextBox"  
      data-dojo-props="onChange: function() {dijit.byId('fromDate').constraints.max = arguments[0];  
      dijit.byId('asReviewStart').constraints.max = arguments[0];  
      dijit.byId('asReviewEnd').constraints.max = arguments[0];            
      }, required: true, constraints:{datePattern: '${datePattern}'}" />  

dojox.widget.DialogSimple: not validate while submit

gunakan dojox.widget.DialogSimple untuk 1 form. Dalam form ini ada dijit.form.DateTextBox dengan option required=true.

Apabila form ini dalam 1 page biasa, DateTextBox  itu akan validated apabila submit.

Namun apabila form ini dimuatkan dalam DialogSimple, tiba2 sahaja validation tidak berfungsi (validation berlaku, namun form masih dihantar).

Penyelesaian:

Gunakan dojo form

<form:form name="aprSessionSetupForm" id="aprSessionSetupForm" modelAttribute="aprSession" action="${formMethod}" data-dojo-type="dijit/form/Form" >

kemudian tambah skrip


<script type="dojo/on" data-dojo-event="submit">
        if(this.validate()){
            return true;
        }else{      
            return false;
        }
        return true;
</script>

jasperreports-4.5.0 : java.lang.NoSuchFieldError: PRINTSCALING

java.lang.NoSuchFieldError: PRINTSCALING

Masalah muncul ketika sistem generate pdf.

Lib:
jasperreports-4.5.0.jar

Solution:
Update itext to latest version, current version is itext-2.1.7

Framework:
Spring 3.0.5

Friday 14 December 2012

dojox.widget.DialogSimple : Unable to load

Error:

 RequestError: Unable to load /slaps/app/setup/aprSession/edit/APRS1?dojo.preventCache=1355475120302 status: 404  
 .cache.dojo/errors/create/</</_56d()dojo.js (line 15)  
 _3dd()dojo.js (line 15)  
 _3e9()dojo.js (line 15)  
 ...);var _350=_33a(_34e,{el:1});var qt=_34e.tag;var _351=("*"==qt);var ecs=_300()["...  

Punca: 

Tidak boleh load sebab tiada request mapping sesuai dalam controller

javax.validation.ValidationException: Unable to find a default provider

Masalah:

javax.validation.ValidationException: Unable to find a default provider 

Penyelesaian: 

include Hibernate Validator versi 4.1

Rujukan: 

http://stackoverflow.com/questions/2231100/spring-mvc-3-validation-unable-to-find-a-default-provider
http://stackoverflow.com/questions/3982950/javax-validation-validationexception-unable-to-find-default-provider

Environment:

Ibatis 2, Spring 3.05

Projek terlibat:

apr

Wednesday 12 December 2012

Sitemesh: Pattern tidak dikenali Spring framework

Adoiyai, masalah besar gak ni. Sitemesh tak gunakan mapping untuk pattern yang disytiharkan.

 <decorator name="default" page="deco-default.jsp">  
      <pattern>*/main*</pattern>  
      <pattern>*/list*</pattern>  
      <pattern>*/marking/*</pattern>  
 </decorator>  

Kesemua pattern di atas tidak dikenali, sebaliknya sitemesh hanya kenal pattern "/app".

Baca punya baca, rupa-rupanya kerana hanya "/app" sahaja yang ditunjukkan kepada Sitemesh oleh Spring.

Rujuk blog ini untuk keterangan: http://fahadshaon.wordpress.com/2012/07/24/sitemesh-2-with-spring-mvc-3-multiple-layout-for-multiple-controller/.

Namun solution gunakan "*.html" agak drastik maka solution lain perlu dicari. Akhirnya tiba ke forum berikut: http://stackoverflow.com/questions/2859014/sitemesh-and-spring-mvc-decorator-pattern-problems.

Setelah buat class ConfigDecoratorMapperSpringMvcSupport yang extend ConfigDecoratorMapper
 /**  
  *   
  */  
 package apr.external;  
 import java.util.Properties;  
 import javax.servlet.ServletException;  
 import javax.servlet.http.HttpServletRequest;  
 import org.apache.log4j.Logger;  
 import com.opensymphony.module.sitemesh.Config;  
 import com.opensymphony.module.sitemesh.Decorator;  
 import com.opensymphony.module.sitemesh.DecoratorMapper;  
 import com.opensymphony.module.sitemesh.Page;  
 import com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper;  
 import com.opensymphony.module.sitemesh.mapper.ConfigLoader;  
 /**  
  * Created by IntelliJ IDEA.  
  * User: Inf-root  
  * Date: 30.06.11  
  * Time: 1:00  
  *  
  */  
 public class ConfigDecoratorMapperSpringMvcSupport extends ConfigDecoratorMapper {  
   private static final Logger LOG = Logger.getLogger(ConfigDecoratorMapperSpringMvcSupport.class);  
   private ConfigLoader configLoader = null;  
    /** Create new ConfigLoader using '/WEB-INF/decorators.xml' file. */  
   public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {  
     LOG.debug("init()...");  
     super.init(config, properties, parent);  
     try {  
       String fileName = properties.getProperty("config", "/WEB-INF/decorators.xml");  
       configLoader = new ConfigLoader(fileName, config);  
     }  
     catch (Exception e) {  
       throw new InstantiationException(e.toString());  
     }  
   }  
   /** Retrieve {@link com.opensymphony.module.sitemesh.Decorator} based on 'pattern' tag. */  
   public Decorator getDecorator(HttpServletRequest request, Page page) {  
     LOG.debug("getDecorator()...");  
     String thisPath = request.getServletPath();  
     LOG.debug("\tThisPath: " + thisPath);  
     String requestURI = request.getRequestURI();  
     LOG.debug("\t\tGet request URI: " + requestURI);  
     //TODO check indexes  
     thisPath = "/springURITemplate" + requestURI.substring(request.getContextPath().length(), requestURI.length() - 1);  
     LOG.debug("\t\t\tThisPath: " + thisPath);  
     String name = null;  
     try {  
       name = configLoader.getMappedName(thisPath);  
     }  
     catch (ServletException e) {  
       e.printStackTrace();  
     }  
     LOG.debug("\tResolved decorator name: " + name);  
     Decorator result = getNamedDecorator(request, name);  
     LOG.debug("Decorator is null ? " + (result == null));  
     return result == null ? super.getDecorator(request, page) : result;  
   }  
 }  

modify sitmesh.xml untuk override Decorator Mapper yang digunakan.

 <mapper class="apr.external.ConfigDecoratorMapperSpringMvcSupport">  
      <param name="config" value="${decorators-file}" />  
 </mapper>  

hasilnya pattern yang disebut tadi telah berjaya dikenali. :)

Tuesday 20 November 2012

M2E : Class not found

Masalah yg sering dihadapi nakama adalah class not found, merujuk kepada library Maven dependencies.
Padahal semua library ada di folder masing2.

Solution yang simple namun menjadi

  1. Clean project & re-compile.. kalau tak jadi juga
  2. Pergi ke folder yg simpan library Maven dan delete folder bg class file yg bermasalah, then re-compile.
Mungkin PC tu tak cukup power nak auto clean & recompile semua library tu kot.

JSP Tag: forEach example

    <table>
      <c:forEach var=
"person" items="${people.people}" varStatus="rowCounter">
        <c:choose>
          <c:when test=
"${rowCounter.count % 2 == 0}">
            <c:set var=
"rowStyle" scope="page" value="odd"/>
          </c:when>
          <c:otherwise>
            <c:set var=
"rowStyle" scope="page" value="even"/>
          </c:otherwise>
        </c:choose>
        <tr 
class="${rowStyle}">
          <td>$
{person.name}</td>
          <td>$
{person.age}</td>
          <td>$
{person.height}</td>
        </tr>
      </c:forEach>
    </table>


Detail, please refer: crazysquirrel.com

Nota:
Tutorial ini tunjukkan bagaimana untuk gunakan varStatus dan property count yang telah disediakan.

Thursday 15 November 2012

WebFlow: Error semasa transition utk hasil evaluate Boolean

ERROR:

org.springframework.webflow.engine.NoMatchingTransitionException: No transition was matched on the event(s) signaled by the [1] action(s) that executed in this action state 'checkAuthorization' of flow 'marking/apr'; transitions must be defined to handle action result outcomes -- possible flow configuration error? Note: the eventIds signaled were: 'array<String>['no']', while the supported set of transitional criteria for this action state is 'array<TransitionCriteria>[true, false]'


Punca:

Silap nilai transition semasa evaluate function yang memulangkan nilai Boolean


 <action-state id="checkAuthorization">
     <evaluate expression="aprService.isAuthorized(requestScope.viewerId, requestScope.aprId)" />
     <transition on="true" to="markingEntry" />
     <transition on="false" to="summary" />

</action-state>

Sepatutnya true dan false itu ditukarkan kepada yes dan no.

Wednesday 14 November 2012

Ibatis: Invalid column name

java.sql.SQLException: Invalid column name


  1. Semak dan pastikan semua colum dalam sql ada pada result-mapping.



at com.ibatis.sqlmap.engine.type.StringTypeHandler.getResult(StringTypeHandler.java:35)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getPrimitiveResultMappingValue(ResultMap.java:619)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getResults(ResultMap.java:345)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:384)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:300)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:189)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:139)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
at org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:295)
at org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:1)
at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)
at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:293)

Thursday 8 November 2012

SPRING 3.06: redirect ke 1 controller dari 1 controller yang lain

Menggunakan kaedah prefix redirect

  1. jika controller return objek ModelAndView

return new ModelAndView("redirect:app/staff/list");

  1. jika controller return String

return "redirect:app/staff/list";


Dev info: APR || SPRING 3.05

SVN & STS: Attempted to lock an already-locked dir

Tetiba sahaja Spring Toolsuite report satu masalah apabila mahu update sync-ed files daripada SVN server:
Attempted to lock an already-locked dir

Rupa2nya masalah ni mudah sangat untuk dibaiki, cuma perlu Referesh/Cleanup projek:

  1. Klik-kanan projek
  2. Pilih team
  3. Pilih Refresh/Cleanup



Tuesday 30 October 2012

Error: No data display on view - SISv3

If you modify the generated code by SPRING-ROO, make sure the name used in controller and view was right/same, since we use different convention compared to ROO's generated items.

Dev info:
IMS-SISv3 || SPRING || ROO

Monday 29 October 2012

Spring: java.lang.IllegalStateException

Neither BindingResult nor plain target object for bean name 'id' available as request attribute

Solusi:

  1. Check pada view sama ada bean "id" dipanggil. 
    1. Jika perlu, provide bean/BindingResult pada controller, 
    2. jika tidak, remove daripada view tersebut.


DevInfo:
Spring 3.06 || IMS-SISv3 

Tuesday 16 October 2012

DOJO 1.7: TabContainer - selected tab PROGRAMMATIC


ni yg aku buat kat hostel.
Hantar 1 parameter drpd controller nama dia tabId

uiModel.addAttribute("tabId","blockInfo");
return "collegemains/show";

then baca dalam page
then set value xxxSelected;
last print value xxxSelected masa generate tab.
tapi cara ni guna programmatic, cuba cari guna declarative.

<script type="text/javascript">
 dojo.ready(function()
{
var tc = new dijit.layout.TabContainer({style: "height: 100%; width: 100%;"}, "tc-hostelInfo");
var blockInfoSelected = false;
var hostelPersonnelInfoSelected = false;
var hostelHouseInfoSelected = false;
if ("${param.tabId}"=='blockInfo') { blockInfoSelected=true;}
if ("${param.tabId}"=='hostelPersonnelInfo') { hostelPersonnelInfoSelected=true;}
if ("${param.tabId}"=='hostelHouseInfo') { hostelHouseInfoSelected=true;}
var cpBlock = new dijit.layout.ContentPane({
        title: "Hostel Block",
        href : "${tabHostelBlockUrl}page=1&size=${empty param.size ? 10 : param.size}", 
        selected: blockInfoSelected, parseOnLoad: blockInfoSelected
        });
   var cpFellow = new dijit.layout.ContentPane({  
    title: "Hostel Personnel",
         href : "${tabHostelPersonnelUrl}page=1&size=${empty param.size ? 10 : param.size}",
         selected: hostelPersonnelInfoSelected, parseOnLoad: hostelPersonnelInfoSelected
        });
  
   var cpUnit = new dijit.layout.ContentPane({  
    title: "Hostel Unit",
         href : "${tabHostelHouseUrl}page=1&size=${empty param.size ? 10 : param.size}",
         selected: hostelHouseInfoSelected, parseOnLoad: hostelHouseInfoSelected
        });
   
   tc.addChild(cpBlock);
    tc.addChild(cpFellow);
    //tc.addChild(cpUnit);
   
tc.startup();
});
</script>


Dev info: Code=IKCM-APR || Framework=DOJO,SPRING || Language=JAVA,JSP

DOJO 1.7: dijit.layout.TabContainer - selected tab

ada declaration camni
<div data-dojo-type="dijit/layout/ContentPane" title="My first tab" data-dojo-props="selected:true">
so, pada page yg ada tab, sebelum <html>
declare

<c:if test="${not empty tabId}">
<c:choose>
//contohnya hantar uiModel.addAttribute("tabId","studyLeave");
// tapi aku tak sure sama ada leh guna test="${tabId eq 'studyLeave'}" atau test="${tabId=='studyLeave'}"
<c:when test="${tabId eq 'studyLeave'}">
<c:set var="studyLeaveSelected" value="true" />
</c:when>
<c:otherwise>
//kat sini set utk tab yg memula nk tunjuk kalau takde tab yg kita select
<c:set var="studyLeaveSelected" value="true" />
</c:otherwise>
</c:choose>
</c:if>

pastu pada declaration
<div data-dojo-type="dijit/layout/ContentPane" title="My first tab" data-dojo-props="selected:<c:out value="${studyLeaveSelected}" default="false" /> ">


Dev info: Code: IKCM-APR || Framework: DOJO, SPRING

Thursday 11 October 2012

Displaytag: Total pada footer

Boleh rujuk sendiri rujukan displaytag, ini nota ringkas buat diriku yang mudah lupa..

Apa yang penting:

  1. varTotal kena assign value, contoh varTotal="total"
  2. property total="true" kena set pada column
  3. boleh display guna variable pada (1) tadi, contoh ${total.column3}.
    1. setakat ni memang guna columnN dimana N ialah kedudukan/indeks column yg anda mahu display total bermula dengan nilai 1.

Monday 8 October 2012

Ibatis 2: ORA-00911: invalid character error


org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested
exception is com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/icms/biz/dao/ibatis/maps/StaffExpertise.xml.
--- The error occurred while applying a parameter map.
--- Check the STEXP.getActSEBSId-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: java.sql.SQLException: ORA-00911: invalid character 

        at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLEx
ceptionTranslator.java:97)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(Abstrac
tFallbackSQLExceptionTranslator.java:72)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(Abstrac
tFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(Abstrac
tFallbackSQLExceptionTranslator.java:80)
        at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:212
)

Friday 5 October 2012

IBATIS 2 SQL Map: LIKE + '%'

Jumpa 1 isu dengan SQL Mapping apabila cuba gunakan LIKE dengan '%' dalam SQL Map framework IBATIS 2 

Thursday 4 October 2012

<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>


Notes on CDATA sections:
  • A CDATA section cannot contain the string "]]>". 
  • Nested CDATA sections are not allowed.
  • The "]]>" that marks the end of the CDATA section cannot contain spaces or line breaks.

Tuesday 2 October 2012

Ingat semula + RnD: cv-Online

Study cv-online untuk integrasi fungsi carian kepakaran pekerja.

Cuba kekalkan fungsi sedia ada, tapi dropdown dynamic gunakan DWR should be better.

[ Spesifikasi ]

  • SPRING 2.5.6
  • DWR 2.0.6

[ Kaji ]

  • controller
    • gunakan konfigurasi xml.
  • layout
    • DWR nampak promising, boleh alter table row dynamically
      • test DWR di http://machine:port/appsName/dwr/index.html , tapi mesti set param debug=true dulu.
      • DWR dalam projek ini rujuk kepada spring-dispatcher-servlet (org.springframework.web.servlet.DispatcherServlet), maka config dalam web.xml tidak diperlukan.
      • Konfig DWR ada dalam appsName-servlet.xml.
  • return value
    • ada bugs dengan special character, apar-online gunakan satu field khas untuk js.
      • cari kaedah untuk hantar value tanpa melalui parameter since ada pendapat mengatakan value pada dom object akan automatically converted.

Monday 24 September 2012

IBATIS 2 SQL Map : Contoh hantar lebih 1 parameter gunakan java.util.Map


Contoh kita ada function dalam DAO IMPL:
public List<StaffSupervise> getExtSuperviseList(String staffId, String superviseCategory, String communityServiceType)
{
Map<String,String> paramMap = new HashMap<String, String>();
paramMap.put("p_staff_id", staffId);
paramMap.put("p_supervise_category", superviseCategory);
paramMap.put("p_comm_srvc_type", communityServiceType);

try{
@SuppressWarnings("unchecked")
List<StaffSupervise> list = this.getSqlMapClientTemplate().queryForList("STAFF_SUPERVISE.getStaffExtSuperv", paramMap);
return list;
} catch (Exception e){
e.printStackTrace();
return new ArrayList<StaffSupervise>();
}
}

Utk SQL Mapping pula 
(since structure CV-Online dgn APR berbeza sikit, abaikan perbezaan naming mapping.)

  <select id="STAFF_SUPERVISE.getStaffExternalSuperviseByCategoryAndSrvcType" resultMap="StaffSuperviseResultMap_3" parameterClass="java.util.Map" >
select ss.*,
om_name institution_desc, ql_desc level_desc, null duration_month
from staff_supervise ss, organization_main, qualification_level
where ss_institution = om_seq(+)
and ss_supervise_level = ql_code(+)
and ss_supervise_category = #p_supervise_category#
and ss_supervise_type = #p_comm_srvc_type#
and ss_staff_id = #p_staff_id#
  </select>

Dev info:
Code = APR, CV-Online
Framework = SPRING 2.5.6, IBATIS 2

Thursday 20 September 2012

Displaytag: Nota format Date


<display:table name="${trainingYear.trainingList}" class="dataTable" uid="row" export="false" excludedParams="*" varTotals="totals">
<display:column style="text-align:center;width:100px;"  titleKey="page.label.date.from"  escapeXml="false">
<fmt:formatDate type="date" value="${row.stStartDate}" pattern="dd-MMM-yyyy" />
</display:column>

</display:table>

Ok, sekarang aku xnak hard-code dd-MMM-yyyy, tapi aku nak camni:
  1. masukkan dlm message bundle, code = patent.display.date= dd-MMM-yyyy
  2. pada page untuk display:
    • gunakan <spring:message /> untuk set 1 variable, katakan namanya datePattern
    • gunakan datePattern tu pada property pattern dalam <fmt:formateDate />
Untuk info lanjut pasal displaytag ni leh gi ke page http://www.displaytag.org/1.2/

Tuesday 18 September 2012

STS: something wrong with MAVEN's project nature

Something wrong with a new project imported from SVN since no Maven's project nature embedded.

Right click project folder >> Maven >> Enable Dependency Management

Saturday 8 September 2012

STS: Web Project Settings >> Context root

Something weird happen when migrate ISAS to APR.
The root still point to ISAS while APR was expected.

Tuesday 17 July 2012

DOJO 1.7: Compound or Composite Key in DataGrid + JsonRestStore

Isu: 

Penggunaan id komposit pada property idAttribute, penggunaan idAttribute yang salah akan menyebabkan data yang berulang dipaparkan.


Framework: 

Spring 3 + DOJO 1.7 + JPA


dojox.data.JsonRestStore
dojox.grid.DataGrid


Penyelesaian:

1. Gunakan fungsi toJson() dalam kelas domain/POJO/model.


import flexjson.JSONSerializer;


...



public String toJson() {
     return new JSONSerializer().exclude("*.class").serialize(this);
}




2. Umpukkan nilai kepada property idAttribute. Contoh:




var poStore = new JsonRestStore({
target: "${listUrl}/ajaxUnits/${blockId}?", 
idAttribute:"id.toJson" , 
syncMode: true });

Dalam contoh di atas, id komposit itu dinamakan sebagai "id" di dalam kelas domain/POJO/objek dengan getter dan setter-nya. Contoh:


@Valid
@EmbeddedId
private CollegeHouseMainPK id;



public CollegeHouseMainPK getId() {
return this.id;
}


public void setId(CollegeHouseMainPK id) {
this.id = id;
}



Keyword yang digunakan untuk penyelesaian ini:


  • prevent duplicate data in datagrid
  • JsonRestStore idAttribute composite key
  • JsonRestStore identifier
  • redundant json data dojo datagrid

Penasihat

  • Osman Sulaiman, IKCM Sdn Bhd.







Monday 16 July 2012

DOJO 1.7: Child properties access on JSON + DataGrid

Katakan kita diberi data JSON:

[{"id":{"chmCompanyCode":"U","chmCollegeCode":"BMI","chmBlockCode":"SB-A","chmHouseCode":"1F-18"},"chmActive":"Y","chmCapacity":4,"chmCurCapacity":4,"chmFreeCapacity":0,"chmHouseDesc":"LEVEL 1","chmLevel":1}]


Untuk akses id.chmHouseCode dan set pada layout untuk datagrid:

gridLayout = [
{ name: "id", field: "id"},
{ name: "Code", field: "_item", formatter:function(item){return item.id.chmHouseCode;}},
{ name: "Name", field: "chmHouseDesc"},
{ name: "Capacity", field: "chmCapacity"}];


Cuma ubah BLUE FONT sahaja, yang lain maintain.


Masalahnya, tak boleh sorting apabila gunakan _item atau get.

Friday 13 July 2012

DOJO 1.7: DataGrid + JsonRestStore

Framework: SPRING 3.06 + DOJO 1.7

<script type="text/javascript">
function prepareDatagrid(){
require(['dojox/grid/DataGrid', 'dojox/data/JsonRestStore'],
   function(DataGrid, JsonRestStore)
{

console.log("showCollegeBlock.jsp");
console.log("${urlCollegeHouses}");

gridLayout = [
             { name: 'Code', field: 'id.chmHouseCode', editable: true},
             { name: 'Name', field: 'chmHouseDesc'},
             { name: 'Capacity', field: 'chmCapacity'}];
           

var poStore = new JsonRestStore({target: "${urlCollegeHouses}/ajaxUnits/${hostelId}?" });

// use the query results returned from the server
/*create a new grid*/
   var grid = new DataGrid({
       id: 'grid',
       store: poStore,
       structure: gridLayout,
       rowSelector: '20px'});


   /*append the new grid to the div*/
   grid.placeAt("gridDiv");
   /*Call startup() to render the grid*/
   grid.startup();
 
});}
</script>

Selain itu boleh guna kaedah manual fetching:


poStore.fetch({
onComplete: function(items){
grid = new dojox.grid.DataGrid({
store: poStore,
items: items,
structure: gridLayout
}, "gridDiv");
  
grid.startup();
}
});

Monday 9 July 2012

SPRING 3.06: Form tidak binding ke domain

Framewok: SPRING 3.06
DB: MySQL 5
Bahasa: Java 6


Isu:

Value yang dihantar ke dalam form (JSP) menggunakan HIDDEN tag tidak bind automatik ke domain.


Punca:

  • 2012-07-09: Tiada setter untuk property yang terlibat pada domain.

Wednesday 15 February 2012

Ibatis : Retrieve value from Oracle DB's function

SQL Mapping
 <parameterMap class="map" id="getJobDescParam">  
      <parameter property="p_job_code" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>  
 </parameterMap>  
 <select id="getJobDesc" parameterMap="getJobDescParam" resultClass="java.lang.String">  
      select hr_util.get_job_desc(?) from dual  
 </select>  
Contoh kod DAO
      public String getJobDesc(String jobCode)   
      {  
           String returnString;  
           Map<String, Object> map = new HashMap<String, Object>();  
           map.put("p_job_code", jobCode);  
           // Reference com.icms.biz.dao.ibatis.maps.StaffMain.xml  
           returnString = (String)getSqlMapClientTemplate().queryForObject("getJobDesc",map);  
           if(StringUtils.isEmpty(returnString)){  
                returnString = "-";  
           }  
           return returnString;  
      }