some characters cannot be mapped using “ISO-8859-1″ character encoding eclipse

Khi làm việc với dự án nào đó với elipse có thể bạn mắc lỗi này:

some characters cannot be mapped using “ISO-8859-1″ character encoding.
Either change the encoding or remove the characters which are not supported
by the “ISO-8859-1″ character encoding

Hãy bình tĩnh làm theo các bước:

1. Trong eclipse: Chọn Help -> Software Updates -> Add Site

2. Nhập địa chỉ site này vào http://propedit.sourceforge.jp/eclipse/updates/

3. Next -> next liên tục -> restart lại eclipse

=> Bạn sẽ không còn bực mình khi đụng tới các file properties có kí tự UTF-8 nữa!

Good luck!

Tham khảo http://propedit.sourceforge.jp/howto_eclipseplugin_install_en.html

Java pass by value hay pass by reference

Chắc hẳn những bạn đã học qua C, C++ sẽ có suy nghĩ như thế khi qua học java. Bên C,C++ thì có cả 2 kiểu trên pass by valuepass by reference, thực chất pass by reference trong C++ là khai báo 1 biến alias khác tên nhưng cùng địa chỉ với biến ban đầu.

Ví dụ:
hoanvi1(int &a,int &b) là pass by refererence còn hoanvi2(int *a,int *b) và hoanvi3(int a,int b) là pass by value.
Khi gọi hàm hoanvi1 thì biến trong hàm hoanvi1 và biến truyền vào là 1(cùng 1 địa chỉ)
Còn khi gọi hàm hoanvi2,hoanvi3 thì giá trị của biến thưc được gán cho biến hình thức, hoặc địa chỉ của con trỏ thực sự được copy và gán cho con trỏ hình thức

Xem thêm:  http://www.codeprovn.com/forums/viewtopic.php?f=17&t=1945

Còn bên JAVA:

Pass by value có thể hiểu là bạn truyền trị số(giá trị của biến) của 1 biến này vào 1 biến khác

Vd: int x=3;

int y = x; // giá trị của biến x(3) sẽ được copy và gán vào y

Đối với kiểu dữ liệu object thì sao.

Vd:  A obj_a = new A();

A obj_b = obj_a; //obj_a , obj_b sẽ cùng tham chiếu tới 1 đối tượng kiểu A

Khi đó mọi thay đổi tới đối tượng A từ obj_b hoặc obj_a đều gây ảnh hưởng đến đối tượng A là 1 thể hiện của class A.

 

Tại sao lại như thế. Khi bạn gán obj_b=obj_a, địa chỉ đối tượng mà obj_a tham chiếu tới sẽ được copy lại và gán cho obj_b.Sau phép gán này thì obj_b sẽ tham chiếu tới đối tượng A. Chú ý là chỉ copy địa chỉ chớ obj_a và obj_b không cùng 1 địa chỉ, do đó Reference to Object is pass by value

Java is pass-by-value.

For primitives, you pass a copy of the actual value.

For references to objects, you pass a copy of the reference (the remote control).

Tham khảo: http://www.javaranch.com/campfire/StoryPassBy.jsp

So sánh 2 phương thức Post, Get

Notice: Bài viết này được tôi viết từ thời còn sinh viên, lúc còn non trẻ – thời mà restful cũng chưa ra những standard như hiện nay (2015). Các bạn đọc và so sánh với những kiến thức hiện tại nhé. Tôi sẽ cố gắng cập nhật nội dung bài viết này sớm  😀

Trong lập trình web. Để xử lý việc nhận gửi thông tin từ  1 form của người dùng nhập vào là rất thường xuyên. Chúng ta thường sử  dụng 2 phương thức POST và GET (ngoài các phương thức sẽ được sử dụng khi làm việc với RESTFUL webservice như PUT, DELETE sẽ được trình bày ở các bài sau liên quan đến RESTFUL webservice) . Tuy nhiên lúc nào sử  dụng POST, lúc nào sử  dụng GET ? Câu hỏi đó ko dễ trả lời vì có những cái chúng ta thường xuyên dùng 1 cách thói quen, chỉ biết dùng sao cũng chạy cả nên rất ít người hiểu rõ và trả lời được câu hỏi này.
Sau đây là sự  giống nhau và khác biệt giữa chúng.
* Giống nhau:  Đều gửi dữ liệu tới server để xử lý, sau khi người dùng nhập thông tin vào Form
* Khác nhau:
** POST:Bảo mật hơn POST vì dữ liệu được gửi ngầm, không xuất hiện trên URL
** GET:Dữ liệu được gửi tường minh, chúng ta có thể nhìn thấy trên URL, đây là lý do khiến nó không bảo mật so
với POST

**GET thực thi nhanh hơn POST vì nhứng dữ  liệu gủi đi luôn được Webbrowser cached lại

**Khi dùng phương thức POST thì server luôn thực thi và trả về kết quả cho client, còn GET sẽ xem xét ứng với cùng 1 yêu cầu  sẽ xem trong cached có kết quả tương ứng với yêu cầu sẽ trả về ngay không cần phải thực thi các yêu cầu đó ở phía server

** Đối với những dự liệu luôn được thay đổi thì chúng ta nên sử  dụng phương thức POST, còn dữ  liệu ít thay đổi chúng ta dùng phương thức GET để truy xuất và xử lý nhanh hơn

Session và HttpSessionListener

Ten ten ten tèn!
Hi hi hi. Chào mọi người! Rất hân hạnh được gặp các bạn tại blog của mình.
Bài viết này mình sẽ trình bày về HttpSessionListener và ứng dụng của nó vào thực tế.
Đầu tiên mình sẽ nói lại về định nghĩa sesssion.
Session nói chung và trong jsp hay servlet nói riêng là 1 interface được cung cấp để lưu trữ các thông tin trong 1 phiên làm việc của bạn trên trang web.Phiên làm việc ở đây có thể hiểu là một quá trình thao tác của bạn từ lúc truy cập vào 1 trang web để mua hàng đến khi bạn thoát khỏi trang đó.
Trong jsp thì đối tượng session được khai báo 1 cách implicit tức là nó nằm trong nhóm những thành phần có sẵn của 1 trang jsp bạn chỉ việc sử dụng nó bắng chính tên session. Còn trong servlet thì bạn phải get nó từ Request  và cú pháp như sau
HttpSession session = request.getSesssion().
Tiếp theo là 1 số thuộc tính và phương thức quan trọng của session.
Ở đây mình chỉ nói những thuộc tính và phương thức hay dùng tới.

session.invalidate() — hủy session và hủy các đối tượng liên quan tới session
session.setAttribute(name,value) — hàm này dùng để set 1 biến và giá trị của nó vào session ví dụ:session.getAttribute(“user”,”loga”);
session.getAttribute(name) — hàm lấy về giá trị của 1 biến ví dụn session.getAttribute(“user);
session.setMaxInactiveInterval(khoảng thời gian) — hàm này set 1 khoảng thời gian kể từ request cuối cùng từ client tới server cho đến khi session invalidate, khoảng thời gian ở đây tính bằng giây. Ví dụ bạn setMaxInactiveInterval(10) thì tính từ lần request cuối cùng từ client tới server nếu không có 1 request nào mới trong khoảng thời gian 10s này thì session sẽ invalidate, nhưng nếu trong khoảng thời gian 10 s đó có 1 request từ client tới server thì session sẽ tự động gọi setMaxInactiveInterval(10) ;

Trên đây đó là những gì cơ bản nhất về session.Tiếp theo mình sẽ đi vào HttpSessionListener.
Tại sao tui phải quan tâm tới HttpSessionListener? Câu trả lời là: Khi làm việc với session bạn muốn bắt sự kiện khi session được tạo ra và khi session được kết thúc. Ví dụ bạn muốn đếm số người đang online trên trang web của bạn thì bạn sẽ nghĩ là: ”à, mình phải biết được khi nào session được tao ra thì mình tăng biến đêm lên 1, còn khi session bị hủy(invalidate) thì giảm biến đếm 1, tát nhiên biến đếm này phải là biến static trong 1 class nào đó”. Để làm được như vậy thì mình dùng tới HttpSessionListener (ai có cách khác xin chỉ giáo).
Vậy thì HttpSessionListener có gì mà làm đươc thế?

Thưa, HttpSessionListener là 1 interface có 2 method sau:
1.sessionCreated() — bắt sự kiện khi session được tạo ra
2.sessionDestroyed() — bặt sự kiện khi session kết thúc(invalidate)

Ủa mà cái HttpSessionListener là 1 interface thì làm sau mà gọi đọc 2 cái hàm trên được nhỉ. Rất đơn giản bạn chỉ cần tạo 1 class mới implement HttpSessionListener là bạn có thể kiểm sóat được khi nào thì sessionCreated, khi nào thì sessionDestroyed.

Chú ý: Để sử dụng được HttpSessionListener bạn nhớ thêm
<listener>
    <listener-class>MySessionLister</listener-class>
</listener>

vào trong file web.xml, MySessionListener là 1 class implement interface HttpSessionListener. À, còn 1 điều lưu ý nữa là trong file xml bạn có thể chỉnh thời gian timeout cho 1 session (tương tự setMaxInactiveInterval) như sau:

<session-config>
<session-timeout>
30
</session-timeout>
</session-config>

Vậy thì ứng dụng HttpSession vào thực tế như thế nào, làm cái cho dễ hiểu thử coai? Okay dưới đây mình trình bày ví dụ đếm số người online(thực chất là đếm số session, tuy nhiên sẽ không chính xác lắm nếu bạn test với 1 máy mở nhiều hơn 1 trình duyệt khác nhau) trên 1 trang web cực kỳ đơn giản đẻ các bạn có thể hiểu thêm về session và HttpSessionListener.
Đâu tiên bạn tạo 1 class MySessionListener như sau

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package listener;

import java.util.Date;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
*
* @author loga
*/
public class MySessionListener implements HttpSessionListener{

private static int songuoionline=0;

//ham de lay bien so nguoi online
public static int getSonguoionline() {
return songuoionline;
}

public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession(); //lay session từ HttpSessionEvent
Date now = new Date();
System.out.println(“Da tao session co ID “+ session.getId()+” vao thoi diem ” + now );
System.out.println(“Dang có ” + songuoionline +” online”);
songuoionline ++;
}

public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession(); //lay session từ HttpSessionEvent
Date now = new Date();
System.out.println(“Da huy session co ID “+ session.getId()+” vao thoi diem ” + now );
songuoionline –;
}

}

Sau đó trong file web.xml add thêm đoạn code này vào:

<listener>
<listener-class>listener.MySessionListener</listener-class>
</listener>

Ta có file web.xml hoàn chình như sau:

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.5″ xmlns=”http://java.sun.com/xml/ns/javaee&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”&gt;
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>listener.MySessionListener</listener-class>
</listener>
</web-app>
Chú ý: listener là 1 tên package chứa class MySessionListener

Tiếp đến tạo trang demsonguoionline.jsp như sau:

<%–
Document   : songuoionline
Created on : Jun 22, 2009, 10:06:32 PM
Author     : loga
–%>

<%@page contentType=”text/html” pageEncoding=”UTF-8″%>
<%@page import=”listener.MySessionListener” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
http://www.w3.org/TR/html4/loose.dtd”&gt;

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>Demo HttpSessionListener</title>
</head>
<body>
<h2>Hiện có <%=MySessionListener.getSonguoionline()%> online</h2>
</body>
</html>

Thử chạy coi nào, bạn hãy thử 2 đến 3 trình duyệt khác nhau tương ứng 3 user trên máy. Cái này gọi là so nguoi online vẫn chưa đúng lắm. Để đếm số người online đúng hơn thì bạn nên kiểm tra ip để  tránh tình trạng 1 ip có nhiều hơn 1 session khi đó biến đếm của chúng ta sẽ không chính xác. Tuy nhiên đây chỉ là 1 ví dụ minh họa đơn giản để các bạn có thể hiểu rõ hơn về session cũng như HttpSessionListener.

Link demo http://mega.1280.com/file/ASK8MKPS/  [ this link is currently unavailable ]
Tham khảo:
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
http://www.roseindia.net/servlets/ListenerSession.shtml

Chúc các bạn thành công!