2012年2月20日 星期一

[AndroidResources] String with HTML tag


    (%1$s)<a href=\"http:\">
    


若是直接使用在 layout 中,則可直接使用 info2

但若如 info 中有變數必須填入則必需 escape

使用 StringFormat 再使用 Html.fromHtml

才 set 給 view


[AndroidIntent] Intent flags when launch App

By debug mode:
FLAG_ACTIVITY_NEW_TASK

From app list:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

From LRU:
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
FLAG_ACTIVITY_NEW_TASK

[AndroidLayout] getDrawingCache()

Bitmap
As a map of bits or an array of bits.
This Bitmap class is very useful when we are working with graphics interfaces like Canvas or OpenGL.

Canvas
Canvas we have control of all the pixels.


getDrawingCache()
  • Android has a maximum drawing cache size. If the drawing cache would be bigger than that, getDrawingCache() returns null.
  • getDrawingCache() will call buildDrawingCache() if the drawing cache is enabled. If you want to get the darwing cache without enabling it, just call buildDrawingCache() before calling getDrawingCahce() (and call destroyDrawingCache() when you're done.)
  • 要取得畫面的 cache,先 setDrawingCacheEnabled() 將 cache 開啟,再用 getDrawingCache() 就可以或取得。
  • 使用 getDrawingCache() 時,若 cache 沒有建立,系統會自動呼叫 buildDrawingCache()。若要更新 cache,則可以呼叫 destroyDrawingCache(),才能建立新的; 或是當設 setDrawingCacheEnabled 為 false,系統也會自動把原來的 cache 銷毀。



* Reference
- Converting Views to Bitmap Images in Android
- android - Bitmap from TextView (getDrawingCache) always null - Stack Overflow
- How drawing cache in View works - Android Developers | Google 網上論壇
- 对View DrawingCache的理解 - JYJ_Block_Science and Technology - 博客频道 - CSDN.NET *

2012年2月16日 星期四

[Design] Data Validation


  • 理論上應要前後端都檢查,這樣自然能防止有人故意要搞破壞,但會有實務上的考量。在後端每執行一件事情都是一個 loading,拖慢速度,因此也可能因為前端已檢查而省略後端部份,但只能在後端才能做的檢查,自然是不可省略。
  • 對資料的任何處理(delete/add/update),都應該用 post,以避免他人僅透過即能執行其功能。
  • method的建立能以是有特地目的功能,還是僅執行固定的功能,而沒有特別意義的。

[Web] iframe, location,

iframe
在 iframe 中 submit 的 url,便是載入 iframe 的 url
供 iframe 呼叫的 function 必須寫在 $(function() {}); 之外


window.location
這樣 request method 是 GET,user 只要打網址就可以執行此動作


$().click(function() { }):
Only set click listener not really do the function in click().

$(function() {} )
[jQuery] ready() vs. onload()
在 DOM 下載完後才執行,以避免 function 使用到尚未載入的 element。


AJAX
適合使用 AJAX 的時機,當想保留當下操作頁面的資訊與狀態。

[Tiles] Cascade



    

    



[Web] 新增資料處理

分頁會共用 session (Ref: [Web] session ID with browser)

所以顯示頁面時 把 Object(ex: Token) 放入 session 且將 Object 的 key 傳給頁面

model.put(ATTRIBUTE_TOKEN, token.getKey);
session.setAttribute(token.getKey(), token);

頁面 submit 時將 key 帶在路徑上

然後便能由 key 取出 session 中相對應的 token

藉此區別不同 tab 間的新增資料

2012年2月15日 星期三

@Transient, @Type

    // getXXX(), isXXX(),都是對於 XXX 的操作
    // 若沒有對到欄位都一定要加上 @Transient
    @Transient
    public String getAttributeA() {}

    @Transient
    public boolean isAttributeB() {}

    // 其實 AttributeC 在 DB 中的 type 是 string
    // 因此使用 @Type 來對應型別
    // "yes_no" 是固定寫法,DB 會寫入 "Y" or "N"
    @Type(type = "yes_no")
    @Column(name = "STRING_ATTRIBUTE_C")
    public boolean isAttributeC() {}

[J2EE] Get values from server on Page

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>






 

 

"${pageContext.request.contextPath}/home"  



"${person.dog.name}"

<%= (Person) request.getAttribute("person").getDog().getName() %>

<%
    String name = request.getAttribute("person").getDog().getName();
    request.setAttributes("name", name);
%>
// => "${name}"


// => "${name}"



"${javax.servlet.forward.servlet_path}"

[Spring] URL Mapping with Controller

@Controller
@RequestMapping("mappingUrlPrefix") - A
public class TestController {

    // 若有設 A 則表示此 method 的 mapping URL is /mappingUrlPrefix/home
    @RequestMapping(value = "/home", method = RequestMethod.POST) 
    public String showHome(...) { }

    // x 是此 url 中的變數,但若 x 的值可能會等於 aaa.bbb.ccc
    // 又是 url 最後面,則必須寫成 {x:.+},若僅寫 {x},則只能判斷到 aaa.bbb
    // 但若是寫在 url 中,則能寫成 "/home/{x}/functions",而能使用
    // 或是參考 reference {x:[a-zA-Z0-9\\.]+}
    @RequestMapping(value = "/home/functions/{x:.+}", method = RequestMethod.POST) 
    public String showInfo(@PathVariable("pathVariable") String x...) {  }
}


* Reference
- Spring MVC @PathVariable 最後一個點(dot)以後的字串(或說副檔名)被切掉了! **

2012年2月14日 星期二

[HTML] Checkbox with Spring or Apache Struts

checkbox 回傳至 server 值如: [1,2,3],ex: List setObjectAttribute(...) {}

可能會收到 [, 2] 這類含有空值的設定值;當 checkboxlist 完全未選擇時,設定值會為 []。


SpringFramework:

<input type="hidden" name="_peopleGroupTags" value="on" />

Apache Struts 2:

Fix for https://issues.apache.org/jira/browse/WW-992

<s:hidden id="
attributeName_0" name="attributeName" value="" />

[jQuery] 限制 textarea 最大可輸入長度

    
// 限制 textarea 最大可輸入長度 return true 才會顯示在畫面上
// $(this).val() 表示目前畫面上的 value,也就是長度並不包含正要輸入的這個字
$('#testAreaId').keypress(function(e) {
    var keyCode = e.keyCode ? e.keyCode : e.which;
    var BACKSPACE_KEY = 8;
    var LEFT_KEY = 37;
    var UP_KEY = 38;
    var RIGHT_KEY = 39;
    var DOWN_KEY = 40;
    var DELETE_KEY = 46;
    var filterKeys = [BACKSPACE_KEY, LEFT_KEY, UP_KEY, RIGHT_KEY, DOWN_KEY, DELETE_KEY];
    var enable = false;
    
    // 因為 FF 會沒有反應,因此多增加此判斷
    for (var i in filterKeys) {
        if (keyCode == filterKeys[i]) {
            enable = true;
            break;
        }
    }
    
    return enable || ($(this).val().length < ${maxLength});
});


[Spring] form 和 Object 的對應

* 對應 form 和 Object
<%
// Get the service bean.
TestService testService = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext())
            .getBean("testService", TestService.class);
%>

<body>
..

     
     

</body>


* 使用 form:form tag
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


    


* 物件過程
  1. Browser request。
  2. Server 向 DB 取出相對應的物件。
  3. Send to Browser showing Object values on page and disconnected with DB。
  4. Submit Object to server。
  5. Server 向 DB 取出相對應的物件 again, 對應傳入的值, 然後將此物件存入 DB。
// 若有此宣告,則在進入 controller 前會先經過此 method
// 然後這裡 return 的 Object 再被送往 controller
@ModelAttribute(ATTRIBUTE_MODEL)
protected Object prepareModelAttribute(....) { }

[JPA] @Embedded, @AttributeOverride

@Embedded
此 attribute 為一個物件。
ex: 原有的 attribute A, B, C 被包裝為 Class X,那麼想使用 X 時就得加上此宣告。

@Embeddable
此物件可做為其他物件的 attribute。

@AttributeOverride
重新指定物件內屬性所對應的欄位名稱,若已是相同的欄位名稱則不需再指定。


@Entity(name = "ObjectX")
@Table(name = "TABLE_NAME")
public class ObjectX {
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "a", column = @Column(name = "X_A")),
        @AttributeOverride(name = "b", column = @Column(name = "X_B"))
    })
    public ObjectY getObjectY() {  return objectY;  }
}

@Embeddable
public class ObjectY {
    @Column(name = "Y_A")
    public String getA() {  return a;  }

    @Column(name = "Y_B")
    public String getB()  {  return b;  }
}