java code基本上我看跟3是一樣的XD...
就是那個hibernate currentSession怪怪的QQ...
就照基本的spring分吧~
不過偶省掉了一個有些版本在寫的interface/implement...
我通常使用非特定的物件來處理~
因為return資料的型態為json格式, 在Java上不用定死的Bean物件~
轉而利用List, Map來組成~
好處是不用處理特定的型態~ Json物件裡面還是有要分String/int/...bala
取用也要放對才有正確的型態~
不過用基礎物件的話~ 只要放好Integer/Double/String....etc...balabala...
甚至於null, 裡面若還是List/Map 多層也都會正確轉換~
要注意的大概是Date型態~ 自動轉換會變成非常複雜的js Date物件~
所以我大多是在轉入Map時~ 用SimpleDateFormat先轉成需要的字串格式就可以了~
spring協助處理了一些uri pattern的問題~
不過也會因為他包過~ 造成有時候不知道發生了什麼事~
碰過的幾項注意事項大概就是
1. uri pattern的結尾不要輸入有點"."的資料~
bad pattern: /aaa/{num}
因為spring會自己把"."後面的資料切掉~ 對數字來說~ 數字就錯了!!...ex: 11.993 --> 11
避免方式大概就是在會有點的資料多一個/, 或是不要以他為最後一個參數
call use: http://xxxxxxx/aaa/11.993/
或是改pattern為 /aaa/{num}/input
2. pattern變數有空白
bad pattern: /aaa/{emp ty}/input
空白有時候很小~ 很容易沒看到XD...然後他就莫名的GG了
3. pattern和底下的變數名稱不一樣
copy 來copy去的時候~ 挺容易發生的...
4. 不同method使用到重覆的pattern
這個應該很好理解~ 命名規則最好一開始就能先有個規則~ 以免剛好跟共同開發的人~ 心有靈兮一點通後就打架了...
5. 中文轉碼問題...
因為web server本身就可以設定編碼(若不設定會看local/OS地區, 或你安裝的那一包...有時候外在主機環境~ 是不能改web server設定的~ 就只能從程式動)... 而filiter也可以設定... spring也會有小聰明...連Broswer都很貼心的幫你轉(FF/Chrome會, 老IE不會....)
為了可以write once..run anywhere....別人好心幫你搬家完後也不會出事 ...
最保險的還是前後端講好~ 前端先encodeURIComponent~
這樣子永遠不會被誰多轉一次
sample code
-----------------------------------
Controller
----------------------------------
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.apache.log4j.Logger;
import java.util.*;
@Controller
public class SampleController {
@Autowired
SampleService theService;
@RequestMapping(value={"/test/list"}, method = RequestMethod.GET)
public @ResponseBody List fn1(Model model){
return theService.test1();
}
}
-------------------------------------------
Service
-------------------------------------------
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Component
public class SampleService {
@Autowired
SampleDao dao = null;
public List test1() {
return dao.test1();
}
}
-----------------------------------------
Dao
----------------------------------------
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Component;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.type.StringType;
import org.hibernate.type.TimestampType;
import org.hibernate.type.IntegerType;
import java.util.*;
import java.text.SimpleDateFormat;
import com.iisi.commons.DBQuickUtils;
@Repository
public class SampleDao {
Logger logg = Logger.getLogger(this.getClass());
@Autowired
SessionFactory sessionFactory;
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Session curSession() {
Session ses = sessionFactory.getCurrentSession();
return ses;
}
public List test1() {
String sql = "select * from test_table";
SQLQuery qry = curSession().createSQLQuery(sql);
qry = qry.addScalar("id", IntegerType.INSTANCE).addScalar("name", StringType.INSTANCE)
.addScalar("utime", TimestampType.INSTANCE);
List lst = qry.list();
List re = hibernateResultToMap(lst, sf, new String[]{"ID", "NAME", "TIME"});
return re;
}
}
沒有留言:
張貼留言