Thứ Ba, 6 tháng 8, 2013

Lấy URL bằng đối tượng Request

Để lấy URL của website ví dụ: http://www.google.com.vn/ ta dùng cú pháp:

String  url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); 
Để lấy đường dẫn thực trên server ví dụ "E:\tomcat\demo\" ta dùng:

String path  = request.getSession().getServletContext().getRealPath("/")

Thứ Hai, 5 tháng 8, 2013

Coppy and Remove file trong Java

Trong lập trình nhiều khi chúng ta phải thao tác với file, ngoài việc đọc và ghi, thì còn phải coppy và delete file, delete file theo .extend
Class util  hỗ trợ mục đích của ta:
FileUtil.java
package vn.ds.util;

import java.io.*;

public class FileUtil {

 /**
  * Coppy data từ một file nguồn vào file đích
  */
 public static void copyFile(File source, File dest) throws IOException {

  if (!dest.exists()) {
   dest.createNewFile();
  }
  InputStream in = null;
  OutputStream out = null;
  try {
   in = new FileInputStream(source);
   out = new FileOutputStream(dest);
   // Transfer bytes from in to out
   byte[] buf = new byte[1024];
   int len;
   while ((len = in.read(buf)) > 0) {
    out.write(buf, 0, len);
   }

  } catch (Exception ex) {
   System.out.println("error");
  } finally {
   in.close();
   out.close();
  }
 }

 /**
  * Coppy tất cả các file trong thư mục nguồn đến thư mục đích
  */
 public static void copyDirectory(File sourceDir, File destDir)
   throws IOException {
  if (!destDir.exists()) {
   destDir.setWritable(true);
   destDir.mkdirs();
  } else {
   destDir.setWritable(true);
  }
  File[] children = sourceDir.listFiles();
  for (File sourceChild : children) {
   String name = sourceChild.getName();
   File destChild = new File(destDir, name);
   if (sourceChild.isDirectory()) {
    copyDirectory(sourceChild, destChild);
   } else {
    copyFile(sourceChild, destChild);
   }
  }
 }

 /**
  * xoá một thư mục (bao gồm các file trong thư mục đó)
  */
 public static boolean delete(File resource) throws IOException {
  if (resource.isDirectory()) {
   File[] childFiles = resource.listFiles();
   for (File child : childFiles) {
    delete(child);
   }
  }
  return resource.delete();
 }

 /**
  * xoá các file trong một thư mục có đuôi mở rộng là một parameter
  * 
  * @param String
  *            ext
  */
 public static void deleteFile(String folder, String ext) {

  GenericExtFilter filter = new GenericExtFilter(ext);
  File dir = new File(folder);

  // list out all the file name with .txt extension
  String[] list = dir.list(filter);

  if (list.length == 0)
   return;

  File fileDelete;

  for (String file : list) {
   String temp = new StringBuffer(folder).append(File.separator)
     .append(file).toString();
   fileDelete = new File(temp);
   boolean isdeleted = fileDelete.delete();
  }
 }

 /**
  * lớp filter để để lọc các file có đuôi mở rộng là một parameter được
  * truyền vào trong constructor method
  */
 public static class GenericExtFilter implements FilenameFilter {

  private String ext;

  public GenericExtFilter(String ext) {
   this.ext = ext;
  }

  public boolean accept(File dir, String name) {
   return (name.endsWith(ext));
  }
 }

}



Thks & Rgds!!!

Thứ Tư, 31 tháng 7, 2013

Tạo connection pool MySQL trong java

Trước tiên ta xây dựng lớp Logger để ghi lại những thông báo hoặc ném ra lỗi, điều này rất cần thiết đối với dự án lớn, đặc biết là có nhiều lớp, nhiều hàm, khi debug, fix error. có thể sử dụng lớp Logger của gói java.util hoặc org.apache.log4j, để đơn giản ta xây dựng lớp Logger gồm 2 method là log method để in thông báo và error method để thông báo lỗi.
public class Logger {
 private String classname;

 public Logger(String classname) {
  this.classname = classname;
 }

 public void log(String msg) {
  System.out.println("[" + this.classname + "] " + msg);
 }

 public void error(String msg) {
  System.out.println("[ERROR] [" + this.classname + "] " + msg);
 }
}

Bây giờ ta xây dựng lớp để tạo connections pool đến MySQL trong Java, sự quan trọng và cần thiết cũng như khái niệm về connection pool trong lập trình thì có thể search trên google.com. ở đây ta không đề cập đến. Lớp kết nối sẽ có tên là DBPool:
  public class DBPool {
    private static Logger logger = new Logger("DBPool"); // biến logger của lớp Logger trên
    private static LinkedList pool = new LinkedList(); // pool để chứa các connections
    public final static int MAX_CONNECTIONS = 10;  // số connection tối đa trong pool là 10, tuỳ ý!!
    public final static int INI_CONNECTIONS = 2; // số connection khi bắt đầu khởi tạo là 2
}
Các phương thức quan trọng trong lớp:
Phương thức tạo một kết nối:
public static Connection makeDBConnection() throws SQLException {
        Connection conn = null;
        try {
            Class.forName(DBConfig.getProperties("_mf_driver", ""));
            logger.log("URL:" + DBConfig.getProperties("_mf_url", ""));
            logger.log("User:" + DBConfig.getProperties("_mf_user", ""));
            conn = DriverManager.getConnection(
             DBConfig.getProperties("_mf_url", ""),
             DBConfig.getProperties("_mf_user", ""),
                DBConfig.getProperties("_mf_passwd", ""));
            
        } catch (ClassNotFoundException ex) {
            throw new SQLException(ex.getMessage());
        }catch (Exception e) {
   // TODO: handle exception
  }
        return conn;
    }
Phương thức khởi tạo số connections theo biến INI_CONNECTIONS:
public static void build(int number) {
        logger.log("Establishing " + number + " connections...");
        Connection conn = null;
        release();
        for (int i = 0; i < number; i++) {
            try {
                conn = makeDBConnection();
            } catch (SQLException ex) {
                logger.log("Error: " + ex.getMessage());                
            }
            if (conn != null) {
                pool.addLast(conn);
            }
        }
        logger.log("Number of connection: " + size());
    }
Phương thức lấy về connection, khi các class khác cần connect DB, thì chỉ cần gọi phương thức này là được:
public static Connection getConnection() {
        Connection conn = null;
        try{
         synchronized (pool) {
             conn = (java.sql.Connection) pool.removeFirst();
         }
         if (conn == null) {
          conn = makeDBConnection();
         }
         try {
             conn.setAutoCommit(true);
         } catch (Exception ex) {}
         
        } catch(Exception e){            
            logger.error("Method getConnection(): Error executing >>>" + e.toString());
            try {
             logger.log("Make connection again.");
    conn = makeDBConnection();
    conn.setAutoCommit(true);
   } catch (SQLException e1) {
   }
   logger.log(""+conn);
        }
        return conn;
    }

Phương thức đóng một kết nối có trong pool:
 public static void putConnection(java.sql.Connection conn) {
        try { // Ignore closed connection
            if (conn == null || conn.isClosed()) {
                logger.log("putConnection: conn is null or closed: " + conn);
                return;
            }
            if (pool.size() >= MAX_CONNECTIONS) {
                conn.close();
                return;
            }
        } catch (SQLException ex) {}

        synchronized (pool) {
            pool.addLast(conn);
            pool.notify();
        }
    }
Phương thức đóng và xoá tất cả connection trong pool:
public static void release() {
        logger.log("Closing connections in pool...");
        synchronized (pool) {
            for (Iterator it = pool.iterator(); it.hasNext(); ) {
                Connection conn = (Connection) it.next();
                try {
                    conn.close();
                }
                catch (SQLException e) {
                    logger.error(
                        "release: Cannot close connection! (maybe closed?)");
                }
            }
            pool.clear();
        }
        logger.log("Release connection OK");
    }
Ngoài ra còn có các phương thức khác trong lớp DBPool như sau:
//  phương thức close một connection và preparedStatement
public static void releaseConnection(Connection conn, PreparedStatement preStmt) {       
        putConnection(conn);
        try {
            if (preStmt != null) {
                preStmt.close();
            }
        } catch (SQLException e) {}
    }

    public static void releaseConnection(Connection conn, PreparedStatement preStmt, ResultSet rs) {
        releaseConnection(conn, preStmt);
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {}
    }

    public static void releaseConnection(Connection conn, PreparedStatement preStmt, Statement stmt, ResultSet rs) {
        releaseConnection(conn, preStmt, rs);
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {}
    }
    public static void releaseConnection(Connection conn, CallableStatement cs, ResultSet rs) {
     putConnection(conn);
        try {
            if (cs != null) {
             cs.close();
            }
            if(rs!=null){
             rs.close();
            }
        } catch (SQLException e) {}
    }
Để sử dụng lớp DBPool này ta thử demo với lớp EmployeeDAO dùng để lấy tất cả các nhân viên và để thêm một nhân viên.
public ArrayList getall() {
  String sql = "SELECT * FROM employee";
  ArrayList lst = new ArrayList();
  conn = DBPool.getConnection();
  try {
   psmt = conn.prepareStatement(sql);
   rs = psmt.executeQuery();
   while (rs.next()) {
    Employee employee = new Employee();
    employee.setId(rs.getInt("EmployeeId"));
    employee.setName(rs.getString("EmployeeName"));
    lst.add(employee);
   }
  } catch (SQLException e) {
   logger.error("Error: Not get all employee " + e.getMessage());
   e.printStackTrace();
  } finally {
   DBPool.releaseConnection(conn, psmt, rs);
  }
  return lst;
 }

  public void insert(Employee employee) {
  String sql = "INSERT INTO employee(name) VALUES(?)";
  conn = DBPool.getConnection();
  try {
   psmt = conn.prepareStatement(sql);
   psmt.setString(1, employee.getName());
   psmt.executeUpdate();
  } catch (SQLException e) {
   logger.error("Error: Not insert employee! " + e.getMessage());
   e.printStackTrace();
  } finally {
   DBPool.releaseConnection(conn, psmt);
  }
 }
Cuối cùng cần import các thư viện sau vào:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.LinkedList;
Để connect tới được CSDL MySQL ta dùng gói mysql-connector-java_5.1.14.jar. còn nếu dùng maven thì có thể thêm doạn dependency sau:

 mysql
 mysql-connector-java
 5.1.14

Thanks & Rgds!

Thứ Hai, 29 tháng 7, 2013

Một số kỹ thuật thông dụng trong MySQL

1. Sử dụng Regx trong truy vấn
Tìm ra tất cả các nhân viên có lastName bắt đầu bằng chữ M, B hoặc T
SELECT lastname,firstname
FROM employees
WHERE lastname REGEXP  '^(M|B|T)'
2. Sử dụng LIMIT
Để lấy ngẫu nhiên một dòng:
SELECT * FROM table  ORDER BY RAND()  LIMIT 1
lấy ngẫu nhiên n dòng:
SELECT * FROM table  ORDER BY RAND()  LIMIT n
Cách trên giải quyết tốt trên những bảng dữ liệu có kích cở nhỏ. Với những bảng lớn thì nó sẽ cho kết quả chậm do phải sắp xếp lại toàn bộ bảng rồi sau đó mới tiến hành lấy ngẫu nhiên. Để giải quyết vấn đề này, chúng ta giải quyết như sau:
·  Trước tiên, lấy ngẫu nhiên ID của một cột. Cột này nên là khóa chính và giá trị tăng tuần tự.
·   Sau đó, lấy ra các dòng dữ liệu dựa trên ID mà chúng ta đã chọn
SET @ID = FLOOR(RAND( )* N) + 1;
 SELECT *  FROM table  WHERE ID >= @ID LIMIT 1
Phân trang
SELECT *
FROM table_name
LIMIT page, limit
page: trang hiện tại
limit: số dòng hiển thị trên một trang

Regular Expressions in Javascript

Tham khảo tại:
http://www.w3schools.com/jsref/jsref_obj_regexp.asp
http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/
ví dụ:
yyyy-mm-dd:
/^(\d{4})-(\d{1,2})-(\d{1,2})$/
file đuôi .wav :
/(\.wav)$/
áp dụng:
re = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
if (frm.date.value != '' && !frm.date.value.match(re)) {
alert("Invalid date format: " + frm.date.value);
form.date.focus();
return false;
}

Thks & rgds!

Javascript - Chỉ cho phép nhập số vào textbox

Javascript code:
function isNumberKey(evt)
    {
       var charCode = (evt.which) ? evt.which : event.keyCode;
       if(charCode == 59 || charCode == 46)
        return true;
       if (charCode > 31 && (charCode < 48 || charCode > 57))
          return false;
       return true;
    }
HTML code:

Jquery - chọn tất cả các dòng trong một bảng

sử dụng Jquey để chọn tất cả các dòng trong bảng


 
 


 
ID Name

kết quả:
Xoá các dòng đã chọn
function del() {
  var elLength = document.frm.elements.length;
  var flag = false;
  for ( var i = 0; i < elLength; i++) {
   var type = frm.elements[i].type;
   var name = frm.elements[i].name;
   if (type == "checkbox" && frm.elements[i].checked && name == 'items') {
    flag = true;
    break;
   }
  }
  if (!flag) {
   alert("You not select any record!");
   return false;
  } else {
   var r = confirm("Are you sure delete records?");
   if (!r)
    return false;
   else
    return true;
  }
 }
HTML code:

Ở phía server xử lý là:
String a[] = request.getParameterValues("items"); // lấy về một mảng  id của các đối tượng
  if (a != null)
   dao.delete(a); // hàm xoá nhiều bản ghi ở lớp DAO