if you have nested for loop or the for loop need to be break in special condition
use 'break label' can satisfy your demand
●Java
myForLoop: {
for (; ; ;) {
if(someCondition == True)
break myForLoop;
}
}
●Objective-C
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto myForLoop; /* breaks outer loop */
}
}
myForLoop:;
Java is 'pass by value'
昨天被Objective-C的pass by reference、pass by value折騰半天,才發現自己把Java的用法亂套在Objective-C 囧....
紀錄Objective-C之前,先轉錄Java方面正確的說明
Iterate HashMap to get key and value
單取key或value就不說了~直接for each
若要同時取key & value可以這樣寫
HashMap< String, MyData> myHashMap;
for (Map.Entry< String, MyData> entry : map.entrySet()) {
String key = entry.getKey();
MyData value = entry.getValue();
}
How to convert HashMap into ArrayList
// HashMap
HashMap< String, MyCustomDataClass> mData;
// Convert to ArrayList
ArrayList< MyCustomDataClass> myList = new ArrayList
Breaking out of nested loops in Java
如何跳出巢狀Function內某個特定的loop
label1 : for(int i =0;;)
{
for(int g =0;;)
{
break label1;
}
}
上述label1就是想跳出的loop區塊,幫他取名為label1後,就可以指名跳出!
label1 : for(int i =0;;)
{
for(int g =0;;)
{
break label1;
}
}
上述label1就是想跳出的loop區塊,幫他取名為label1後,就可以指名跳出!
java的ArrayList排序
紀錄一下,在android常用到
例如最新的文章的排序要在最高層~
ArrayList myData = new ArrayList();
升冪 ascending
Collections.sort(myData, new Comparator() {
@Override
public int compare(News n1, News n2) {
return n1.Id - n2.Id;
}
});
descending 降冪
Collections.sort(myData,
Collections.reverseOrder(new Comparator() {
@Override
public int compare(News n1, News n2) {
return n1.Id - n2.Id;
}
}));
例如最新的文章的排序要在最高層~
ArrayList
升冪 ascending
Collections.sort(myData, new Comparator
@Override
public int compare(News n1, News n2) {
return n1.Id - n2.Id;
}
});
descending 降冪
Collections.sort(myData,
Collections.reverseOrder(new Comparator
@Override
public int compare(News n1, News n2) {
return n1.Id - n2.Id;
}
}));
Using GlassFish in Eclipse
在Eclipse中使用GlassFish Server前,請先安裝GlassFish和GlassFish Tool,安裝說明如下列網址
Install GlassFish Server
Install GlassFish Tool
接著按照下列步驟設定,設定完成後就能在Eclipse發布resource至GlassFish Server
New Server
選擇GlassFish,我安裝的是3.1所以選這個版本
設定Runtime與GlassFish安裝路徑
此時發現,沒有JDK可選,先將設定步驟暫停一下,回頭設定JDK
========設定JDK 開始========
========設定JDK 結束========
經過四個步驟的JDK設定,再回到設定Runtime與GlassFish安裝路徑,已經有JDK可選了
設定domain,如果設定domain有問題,請參考這篇glassfish\domains\domain1 does not exist
至此已設定完成,再來將想架在GlassFish上的resource加進去即可
Install GlassFish Server
Install GlassFish Tool
接著按照下列步驟設定,設定完成後就能在Eclipse發布resource至GlassFish Server
New Server
選擇GlassFish,我安裝的是3.1所以選這個版本
設定Runtime與GlassFish安裝路徑
此時發現,沒有JDK可選,先將設定步驟暫停一下,回頭設定JDK
========設定JDK 開始========
========設定JDK 結束========
經過四個步驟的JDK設定,再回到設定Runtime與GlassFish安裝路徑,已經有JDK可選了
設定domain,如果設定domain有問題,請參考這篇glassfish\domains\domain1 does not exist
至此已設定完成,再來將想架在GlassFish上的resource加進去即可
com.microsoft.sqlserver.jdbc.SQLServerDriver not found
use MS JDBC Driver in Tomcat / GlassFish提到在GlassFish使用MS的JDBC,必須要把sqljdbc4.jar放到C:\glassfish3\glassfish\domains\domain1\lib\ext位置
結果繼續在同個java專案寫第二隻RESTful,竟然連第一隻都掛了,改了N次寫法,最終還是暫時把最近學@ManyToOne先註解調,先用最簡單測試過的方式撰寫,錯誤竟然變成com.microsoft.sqlserver.jdbc.SQLServerDriver not found,這個錯誤明明就在use MS JDBC Driver in Tomcat / GlassFish解決了不是嗎@@
程式碼改了又改,GlassFish重啟N次,VM記憶體一直被吃滿滿,最後~當我再把sqljdbc4.jar複製一份到C:\glassfish3\glassfish\domains\domain1\lib\位置並且重啟,就好嘞!!
目前是以下二個位置都有sqljdbc4.jar 特此紀錄,之後有看到可供佐證的文章再來確認@@
C:\glassfish3\glassfish\domains\domain1\lib\ext
C:\glassfish3\glassfish\domains\domain1\lib\
然後,這次還有個小心得~自己下command啟動GlassFish Server比Eclipse好用,又快又不會失敗 lol
<後記>
後來在Oracle官網找到一篇Making the JDBC Driver JAR Files Accessible,文中提到jar到底要放哪
copy the JAR files into the domain-dir/lib directory 一般JDBC
copy the JAR files into the domain-dir/lib/ext directory Oracle database with EclipseLink extensions
不過這篇的GlassFish版本是3.0.1說~
針對我用的版本3.1.2.2又在Oracle官網找到Specifying the Persistence Provider for an Application,也是提到要放在domain-dir/lib directory
所以本來的做法明明就對呀@@
再觀察看看好了
結果繼續在同個java專案寫第二隻RESTful,竟然連第一隻都掛了,改了N次寫法,最終還是暫時把最近學@ManyToOne先註解調,先用最簡單測試過的方式撰寫,錯誤竟然變成com.microsoft.sqlserver.jdbc.SQLServerDriver not found,這個錯誤明明就在use MS JDBC Driver in Tomcat / GlassFish解決了不是嗎@@
程式碼改了又改,GlassFish重啟N次,VM記憶體一直被吃滿滿,最後~當我再把sqljdbc4.jar複製一份到C:\glassfish3\glassfish\domains\domain1\lib\位置並且重啟,就好嘞!!
目前是以下二個位置都有sqljdbc4.jar 特此紀錄,之後有看到可供佐證的文章再來確認@@
C:\glassfish3\glassfish\domains\domain1\lib\ext
C:\glassfish3\glassfish\domains\domain1\lib\
然後,這次還有個小心得~自己下command啟動GlassFish Server比Eclipse好用,又快又不會失敗 lol
<後記>
後來在Oracle官網找到一篇Making the JDBC Driver JAR Files Accessible,文中提到jar到底要放哪
copy the JAR files into the domain-dir/lib directory 一般JDBC
copy the JAR files into the domain-dir/lib/ext directory Oracle database with EclipseLink extensions
不過這篇的GlassFish版本是3.0.1說~
針對我用的版本3.1.2.2又在Oracle官網找到Specifying the Persistence Provider for an Application,也是提到要放在domain-dir/lib directory
所以本來的做法明明就對呀@@
再觀察看看好了
Install GlassFish Tool
安裝好GlassFish,要開始在Eclipse中使用!
使用前,請先按照本文在Eclipse中安裝GlassFish Server開發工具
從功能選單的File→New→Others...選擇Server
Server Type根本沒GlassFish可選,那麼就點選右上的Download additional server adapters
有一堆Server Tool可以裝
找到GlassFish來裝
接受使用條款
一路等它安裝,安裝完後重開,成功!
最後,在瀏覽器輸入網址http://localhost:4848/common/index.jsf
若有以下畫面,表示你真的安裝成功^^ (前提是Server有Start喔)
參考文章
Eclipse 整合 GlassFish 3 開發環境
在Eclipse中安裝GlassFish Server開發工具
Eclipse Juno 中安裝 GlassFish
使用前,請先按照本文在Eclipse中安裝GlassFish Server開發工具
從功能選單的File→New→Others...選擇Server
Server Type根本沒GlassFish可選,那麼就點選右上的Download additional server adapters
有一堆Server Tool可以裝
找到GlassFish來裝
接受使用條款
一路等它安裝,安裝完後重開,成功!
最後,在瀏覽器輸入網址http://localhost:4848/common/index.jsf
若有以下畫面,表示你真的安裝成功^^ (前提是Server有Start喔)
參考文章
Eclipse 整合 GlassFish 3 開發環境
在Eclipse中安裝GlassFish Server開發工具
Eclipse Juno 中安裝 GlassFish
Install GlassFish Server
最近在看Java,想要改寫手邊一個小練習,體驗一下Java EE環境下的開發方式
問題來了,新增EJB Project時需要選TargetRuntime,怎麼沒有Tomcat呢?
原來Tomcat只是個Servlet容器,在Java EE是不夠用的,我們需要再找一個較全面的Java EE容器~GlassFish
首先至官網下載GlassFish,本文安裝ogs-3.1.2.2-windows.exe
一路用預設值安裝,若遇到8080 port被Tomcat佔用,解決方式請參考change Tomcat default port 8080 for GlassFish
安裝畫面如下
這個帳密的部分,如果按照預設,那就是不需密碼
安裝過程基本上就是這樣,都選預設值即可Next到底
至於如何在Eclipse中使用GlassFish請參考另一篇
原來Tomcat只是個Servlet容器,在Java EE是不夠用的,我們需要再找一個較全面的Java EE容器~GlassFish
首先至官網下載GlassFish,本文安裝ogs-3.1.2.2-windows.exe
一路用預設值安裝,若遇到8080 port被Tomcat佔用,解決方式請參考change Tomcat default port 8080 for GlassFish
安裝畫面如下
這個帳密的部分,如果按照預設,那就是不需密碼
至於如何在Eclipse中使用GlassFish請參考另一篇
JPA must has Primary Key
根據Java Persistence Book的23.6小節No Primary Key所述,使用JPA一定要有Primary Key!
節錄內容如下
No Primary Key
Sometimes your object or table has no primary key. The best solution in this case is normally
to add a generated id to the object and table. If you do not have this option, sometimes
there is a column or set of columns in the table that make up a unique value. You can use
this unique set of columns as your id in JPA. The JPA Id does not always have to match the
database table primary key constraint, nor is a primary key or a unique constraint required.
If your table truly has no unique columns, then use all of the columns as the id. Typically
when this occurs the data is read-only, so even if the table allows duplicate rows with the
same values, the objects will be the same anyway, so it does not matter that JPA thinks
they are the same object. The issue with allowing updates and deletes is that there is no
way to uniquely identify the object's row, so all of the matching rows will be updated or
deleted.
If your object does not have an id, but its' table does, this is fine. Make the object an
Embeddable object, embeddable objects do not have ids. You will need a Entity that
contains this Embeddable to persist and query it.
以上落落長原文,用中文簡述如下
1. 最好狀況,就是table有primary key(以下簡稱pk),object也有pk(object可想成JPA裡的Entity)
2. 次之狀況,就是table沒有pk,但有unique value,可以改用具備unique value的column或column set(多個column組合,類似複合鍵的感覺)
3. 如果table結構實在連column set都做不出pk,那就改用all column當pk;如果連all column當pk都會遇到資料重複的問題,那也不用擔心,因為這種資料結構通常都是read-only,但如果做update或delete的話,就會是整批同value一起做,object的反應會跟table一樣
4. 如果table有pk,object卻沒有(可能因為某些設計因素你不願提供),那就使用Embeddable object處理
(第4點的Embeddable object本人還不會,之後再細究)
節錄內容如下
No Primary Key
Sometimes your object or table has no primary key. The best solution in this case is normally
to add a generated id to the object and table. If you do not have this option, sometimes
there is a column or set of columns in the table that make up a unique value. You can use
this unique set of columns as your id in JPA. The JPA Id does not always have to match the
database table primary key constraint, nor is a primary key or a unique constraint required.
If your table truly has no unique columns, then use all of the columns as the id. Typically
when this occurs the data is read-only, so even if the table allows duplicate rows with the
same values, the objects will be the same anyway, so it does not matter that JPA thinks
they are the same object. The issue with allowing updates and deletes is that there is no
way to uniquely identify the object's row, so all of the matching rows will be updated or
deleted.
If your object does not have an id, but its' table does, this is fine. Make the object an
Embeddable object, embeddable objects do not have ids. You will need a Entity that
contains this Embeddable to persist and query it.
以上落落長原文,用中文簡述如下
1. 最好狀況,就是table有primary key(以下簡稱pk),object也有pk(object可想成JPA裡的Entity)
2. 次之狀況,就是table沒有pk,但有unique value,可以改用具備unique value的column或column set(多個column組合,類似複合鍵的感覺)
3. 如果table結構實在連column set都做不出pk,那就改用all column當pk;如果連all column當pk都會遇到資料重複的問題,那也不用擔心,因為這種資料結構通常都是read-only,但如果做update或delete的話,就會是整批同value一起做,object的反應會跟table一樣
4. 如果table有pk,object卻沒有(可能因為某些設計因素你不願提供),那就使用Embeddable object處理
(第4點的Embeddable object本人還不會,之後再細究)
use MS JDBC Driver in Tomcat / GlassFish
Tomcat與GlassFish用法大致相同,只有jar包的儲存位置有差異,步驟如下
●下載JDBC Driver
去Microsoft JDBC Driver 4.0 for SQL Server下載sqljdbc4.jar
●把JAR包放到lib資料夾
◎Tomcat
放至Tomcat Server安裝位置的lib資料夾,如果Tomcat安裝在C:\Tomcat\,那就放到C:\Tomcat\lib
◎GlassFish
放至GlassFish Server其domain下的ext資料夾,如果GlassFish安裝在C:\glassfish3\,且domain名稱為domain1,那就放到C:\glassfish3\glassfish\domains\domain1\lib\ext
●定義persistence.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
< persistence-unit name="jpa unit name" transaction-type="RESOURCE_LOCAL">
< provider>org.eclipse.persistence.jpa.PersistenceProvider</ provider>
< exclude-unlisted-classes>false</ exclude-unlisted-classes>
< properties>
< property name="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver" / >
< property name="javax.persistence.jdbc.url"
value="jdbc:sqlserver://sqlserver的位址:1433;databaseName=資料庫名稱" / >
< property name="javax.persistence.jdbc.user" value="資料庫帳號" / >
< property name="javax.persistence.jdbc.password" value="資料庫密碼" / >
</ properties>
</ persistence-unit>
</ persistence>
●下載JDBC Driver
去Microsoft JDBC Driver 4.0 for SQL Server下載sqljdbc4.jar
●把JAR包放到lib資料夾
◎Tomcat
放至Tomcat Server安裝位置的lib資料夾,如果Tomcat安裝在C:\Tomcat\,那就放到C:\Tomcat\lib
◎GlassFish
放至GlassFish Server其domain下的ext資料夾,如果GlassFish安裝在C:\glassfish3\,且domain名稱為domain1,那就放到C:\glassfish3\glassfish\domains\domain1\lib\ext
●定義persistence.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
< persistence-unit name="jpa unit name" transaction-type="RESOURCE_LOCAL">
< provider>org.eclipse.persistence.jpa.PersistenceProvider</ provider>
< exclude-unlisted-classes>false</ exclude-unlisted-classes>
< properties>
< property name="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver" / >
< property name="javax.persistence.jdbc.url"
value="jdbc:sqlserver://sqlserver的位址:1433;databaseName=資料庫名稱" / >
< property name="javax.persistence.jdbc.user" value="資料庫帳號" / >
< property name="javax.persistence.jdbc.password" value="資料庫密碼" / >
</ properties>
</ persistence-unit>
</ persistence>
change Tomcat default port 8080 for GlassFish
安裝GlassFish一開始就出現這個畫面
原來GlassFish要求使用port 4848和8080,可問題是之前已經安裝了也使用8080 port的Tomcat,反正GlassFish比較強大有涵蓋Tomcat的功能,可以直接放棄Tomcat啦,但想想還是不甘心,於是按照How to change Tomcat default port 8080修改了預設port
明明把port改為8082,為何Eclipse拋出錯誤"Serveral port(8080, 8009) required by Tomcat v7 Server at localhost are already in use."呢?
後來把Eclipse中的Server刪除,重新登入(因為VM有其他同事使用所以先自己嘗試登出,而非重開),過了幾分鐘後,我的Tomcat總算復活,可愛貓畫面也如期出現在http://localhost:8082/
幸好解決了,不然用Eclipse寫的服務都全掛@@
Java Bean naming convention
發現Java Bean naming convention的小細節,是因為前文的大小寫把我搞死T_T
我在Java寫Entity依舊沿用在C#開發的習慣→所有英文單詞的第一個字都大寫
例如公司名稱company name,就會被命名成CompanyName
結果轉出來的結果全部都變成第一個字小寫companyName
那為啥Java這麼雞婆要幫你轉呢?原因請看JavaBeans的8.8節
如果還是不喜歡naming被改掉,還有一個小撇步~在getter加上@JsonProperty
private String GroupName;
@JsonProperty("CompanyName")
public String getCompanyName() {
return CompanyName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
參考文章
Where is the JavaBean property naming convention defined?
我在Java寫Entity依舊沿用在C#開發的習慣→所有英文單詞的第一個字都大寫
例如公司名稱company name,就會被命名成CompanyName
結果轉出來的結果全部都變成第一個字小寫companyName
那為啥Java這麼雞婆要幫你轉呢?原因請看JavaBeans的8.8節
如果還是不喜歡naming被改掉,還有一個小撇步~在getter加上@JsonProperty
private String GroupName;
@JsonProperty("CompanyName")
public String getCompanyName() {
return CompanyName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
參考文章
Where is the JavaBean property naming convention defined?
URI names are case-sensitive when using Jersey
標題其實不很正確,嚴格來說是URI names are case-sensitive
不過我第一次寫RESTful Service是使用Miscrosoft的ASP .NET Web API,可能ASP .NET Web API內部有什麼機制處理過,case-sensitive這件事並沒有作用。
這陣子使用Java陣營的Jersey實作RESTful Service,發現無論是URL或request body都有分大小寫,例如
GET
http://localhost:8080/WebDemo1/rest/Group/1 成功, StatusCode:200
http://localhost:8080/WebDemo1/rest/group/1 失敗, StatusCode:404
POST
http://localhost:8080/WebDemo1/rest/Group/ 成功, StatusCode:204
request body {"groupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}
http://localhost:8080/WebDemo1/rest/Group/ 失敗, StatusCode:500 找不到GroupName欄位
request body {"GroupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}
本以為是Java區分大小寫的特性,想說找找有無IngoreCase之類的Func.可用,後來才發現錯怪Java了,其實是Jersey乖乖遵守W3C的標準(請參考6.2.2.1與 6.2.3)
所以透過Jersey開發RESTful Service要小心捏,但如果實在不想使用者因大小寫被擋住,可以考慮這篇文章@FormParam case sensitivity in Java Jersey的解法,或是棄用Jersey跳槽使用JBOSS開發的RESTEasy
參考文章
Case-insensitive URLs with JAX-RS
不過我第一次寫RESTful Service是使用Miscrosoft的ASP .NET Web API,可能ASP .NET Web API內部有什麼機制處理過,case-sensitive這件事並沒有作用。
這陣子使用Java陣營的Jersey實作RESTful Service,發現無論是URL或request body都有分大小寫,例如
GET
http://localhost:8080/WebDemo1/rest/Group/1 成功, StatusCode:200
http://localhost:8080/WebDemo1/rest/group/1 失敗, StatusCode:404
POST
http://localhost:8080/WebDemo1/rest/Group/ 成功, StatusCode:204
request body {"groupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}
http://localhost:8080/WebDemo1/rest/Group/ 失敗, StatusCode:500 找不到GroupName欄位
request body {"GroupName":"MIS","parentID":1,"enable":"1","createCompany":"AAA","createName":"Karen"}
本以為是Java區分大小寫的特性,想說找找有無IngoreCase之類的Func.可用,後來才發現錯怪Java了,其實是Jersey乖乖遵守W3C的標準(請參考6.2.2.1與 6.2.3)
所以透過Jersey開發RESTful Service要小心捏,但如果實在不想使用者因大小寫被擋住,可以考慮這篇文章@FormParam case sensitivity in Java Jersey的解法,或是棄用Jersey跳槽使用JBOSS開發的RESTEasy
參考文章
Case-insensitive URLs with JAX-RS
Serialize Java.util.Date with Jackson JSON Processor
承上篇JSON responce for Jersey without @XmlRootElemen,當我改用JSON時,會發生Date type資料格式不正確的問題,如下圖
解決步驟如下
1. 撰寫一支繼承JsonSerializer的Class,並實作serialize方法,完整程式碼如下
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
public class JsonDateSerializer extends JsonSerializer< Date> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException {
String formattedDate = dateFormat.format(date);
gen.writeString(formattedDate);
}
}
2. 修改前文的Entity(GroupData.java),class加上@JsonAutoDetect,針對要處理的Date欄位,在getter加上@JsonSerialize(using = JsonDateSerializer.class)
@JsonAutoDetect
@XmlRootElement
@Entity
public class GroupData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int GroupID;
private String GroupName;
@Temporal(TemporalType.TIMESTAMP)
private Date CreateDate;
// getter & setter
public int getGroupID() {
return GroupID;
}
public String getGroupName() {
return GroupName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
@JsonSerialize(using = JsonDateSerializer.class)
public Date getCreateDate() {
return CreateDate;
}
public void setCreateDate(Date createDate) {
CreateDate = createDate;
}
}
大功告成
參考文章
How to Serialize Java.util.Date with Jackson JSON Processor / Spring 3.0
How to control Date formatting when Jackson JSON Processor is used with Spring 3.0
解決步驟如下
1. 撰寫一支繼承JsonSerializer的Class,並實作serialize方法,完整程式碼如下
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
public class JsonDateSerializer extends JsonSerializer< Date> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException {
String formattedDate = dateFormat.format(date);
gen.writeString(formattedDate);
}
}
2. 修改前文的Entity(GroupData.java),class加上@JsonAutoDetect,針對要處理的Date欄位,在getter加上@JsonSerialize(using = JsonDateSerializer.class)
@JsonAutoDetect
@XmlRootElement
@Entity
public class GroupData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int GroupID;
private String GroupName;
@Temporal(TemporalType.TIMESTAMP)
private Date CreateDate;
// getter & setter
public int getGroupID() {
return GroupID;
}
public String getGroupName() {
return GroupName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
@JsonSerialize(using = JsonDateSerializer.class)
public Date getCreateDate() {
return CreateDate;
}
public void setCreateDate(Date createDate) {
CreateDate = createDate;
}
}
大功告成
參考文章
How to Serialize Java.util.Date with Jackson JSON Processor / Spring 3.0
How to control Date formatting when Jackson JSON Processor is used with Spring 3.0
JSON responce for Jersey without @XmlRootElement
試Jersey的時候發現網路上的範例不外乎是這樣
●Entity:GroupData.java
@XmlRootElement
@Entity
public class GroupData {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private int GroupID;
private String GroupName;
@Temporal(TemporalType.TIMESTAMP)
private Date CreateDate;
// getter & setter
public int getGroupID() {
return GroupID;
}
public String getGroupName() {
return GroupName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
public Date getCreateDate() {
return CreateDate;
}
public void setCreateDate(Date createDate) {
CreateDate = createDate;
}
}
●RESTful Service:GroupDataResource.java
@Path("/Group")
public class GroupDataResource {
@GET
@Path("{groupid}")
@Produces(MediaType.APPLICATION_JSON )
public GroupData getGroup(@PathParam("groupid") int groupID) {
GroupData gData;
//操作並取回資料gData,略...
return gData;
}
}
成果如下圖
一切都正常,但我不想每次Entity都透過XML來binding,但直接去掉@XmlRootElement又會拋錯,這邊有篇參考文章Configure Jersey/Jackson to NOT use @XmlElement field annotation for JSON field naming寫得不錯,但本人是Java新手XD 暫時先透過修改web.xml設定的方式來解決嚕,解決方式如下
1. 去掉@XmlRootElement
2. 在web.xml加入highlight處
< servlet>
< servlet-name>Jersey REST Service</ servlet-name>
< servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class>
< init-param>
< param-name>com.sun.jersey.config.property.packages</ param-name>
< param-value>com.quanta.WebDemo1</ param-value>
</ init-param>
< init-param>
< param-name>com.sun.jersey.api.json.POJOMappingFeature</ param-name>
< param-value>true</ param-value>
</ init-param>
< load-on-startup>1</ load-on-startup>
</ servlet>
< servlet-mapping>
< servlet-name>Jersey REST Service</ servlet-name>
< url-pattern>/rest/*</ url-pattern>
</ servlet-mapping>
解決後的成果
讚讚~也是JSON格式,但是Date type的資料怪怪的@@
下一篇來解決這個問題吧XD
●Entity:GroupData.java
@XmlRootElement
@Entity
public class GroupData {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private int GroupID;
private String GroupName;
@Temporal(TemporalType.TIMESTAMP)
private Date CreateDate;
// getter & setter
public int getGroupID() {
return GroupID;
}
public String getGroupName() {
return GroupName;
}
public void setGroupName(String groupName) {
GroupName = groupName;
}
public Date getCreateDate() {
return CreateDate;
}
public void setCreateDate(Date createDate) {
CreateDate = createDate;
}
}
●RESTful Service:GroupDataResource.java
@Path("/Group")
public class GroupDataResource {
@GET
@Path("{groupid}")
@Produces(MediaType.APPLICATION_JSON )
public GroupData getGroup(@PathParam("groupid") int groupID) {
GroupData gData;
//操作並取回資料gData,略...
return gData;
}
}
成果如下圖
1. 去掉@XmlRootElement
2. 在web.xml加入highlight處
< servlet>
< servlet-name>Jersey REST Service</ servlet-name>
< servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class>
< init-param>
< param-name>com.sun.jersey.config.property.packages</ param-name>
< param-value>com.quanta.WebDemo1</ param-value>
</ init-param>
< init-param>
< param-name>com.sun.jersey.api.json.POJOMappingFeature</ param-name>
< param-value>true</ param-value>
</ init-param>
< load-on-startup>1</ load-on-startup>
</ servlet>
< servlet-mapping>
< servlet-name>Jersey REST Service</ servlet-name>
< url-pattern>/rest/*</ url-pattern>
</ servlet-mapping>
解決後的成果
讚讚~也是JSON格式,但是Date type的資料怪怪的@@
下一篇來解決這個問題吧XD
JPA annotation @Id
定義JPA需要的Entity Bean時,用來表示Identity的主鍵可以透過註釋@Id描述
擺放的位置有二種可選:宣告處、getter方法
範例如下粉紅色highlight處,二選一即可
@Entity
@Table(name = "Student")
public class Student {
@Id private Integer studentid;
private String name;
@Id
public Integer getStudentid() {
return studentid;
}
public void setStudentid(Integer studentid) {
this.studentid = studentid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
擺放的位置有二種可選:宣告處、getter方法
範例如下粉紅色highlight處,二選一即可
@Entity
@Table(name = "Student")
public class Student {
@Id private Integer studentid;
private String name;
@Id
public Integer getStudentid() {
return studentid;
}
public void setStudentid(Integer studentid) {
this.studentid = studentid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
how to setting Servlet in Dynamic Web Project
撰寫Servlet一定要記得在web.xml設定Servlet的mapping、Name等資訊,如下
< servlet>
< servlet-name>HelloServlet</ servlet-name>
< servlet-class>com.demo.WebDemo1.HelloServlet
</ servlet>
< servlet-mapping>
< servlet-name>HelloServlet</ servlet-name>
< url-pattern>/hello.get</ url-pattern>
</ servlet-mapping>
但專案不大可能只有一支Servlet,因為是Java新手,查了許多資料發現網路上也是不少錯誤資訊@@ 紀錄一下方便日後查找
多個Servlet就直接額外新增多組servlet和servlet-mapping的設定即可
< servlet>
< servlet-name>HelloServlet</ servlet-name>
< servlet-class>com.demo.WebDemo1.HelloServlet
</ servlet>
< servlet-mapping>
< servlet-name>HelloServlet</ servlet-name>
< url-pattern>/hello.get</ url-pattern>
</ servlet-mapping>
< !-- Another(i use Jersey) -->
< servlet>
< servlet-name>Jersey REST Service</ servlet-name>
< servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class>
< init-param>
< param-name>com.sun.jersey.config.property.packages</ param-name>
< param-value>com.demo.WebDemo1</ param-value>
</ init-param>
< load-on-startup>1</ load-on-startup>
</ servlet>
< servlet-mapping>
< servlet-name>Jersey REST Service</ servlet-name>
< url-pattern>/rest/*</ url-pattern>
</ servlet-mapping>
< servlet>
< servlet-name>HelloServlet</ servlet-name>
< servlet-class>com.demo.WebDemo1.HelloServlet
</ servlet>
< servlet-mapping>
< servlet-name>HelloServlet</ servlet-name>
< url-pattern>/hello.get</ url-pattern>
</ servlet-mapping>
但專案不大可能只有一支Servlet,因為是Java新手,查了許多資料發現網路上也是不少錯誤資訊@@ 紀錄一下方便日後查找
多個Servlet就直接額外新增多組servlet和servlet-mapping的設定即可
< servlet>
< servlet-name>HelloServlet</ servlet-name>
< servlet-class>com.demo.WebDemo1.HelloServlet
</ servlet>
< servlet-mapping>
< servlet-name>HelloServlet</ servlet-name>
< url-pattern>/hello.get</ url-pattern>
</ servlet-mapping>
< !-- Another(i use Jersey) -->
< servlet>
< servlet-name>Jersey REST Service</ servlet-name>
< servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</ servlet-class>
< init-param>
< param-name>com.sun.jersey.config.property.packages</ param-name>
< param-value>com.demo.WebDemo1</ param-value>
</ init-param>
< load-on-startup>1</ load-on-startup>
</ servlet>
< servlet-mapping>
< servlet-name>Jersey REST Service</ servlet-name>
< url-pattern>/rest/*</ url-pattern>
</ servlet-mapping>
訂閱:
文章 (Atom)