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. :)