Thứ Sáu, 2 tháng 5, 2014

Hướng dẫn khắc phục lỗi font khi sử dụng đối tượng MultipartRequest trong java

Bài viết dưới đây mình sẽ hướng dẫn các bạn khắc phục hiện tượng lỗi font khi sử dụng đối tượng MultipartRequest.
Như chúng ta đã biết, khi làm việc với một form viết bằng html nếu trên form đó chỉ chứa các textfield thì việc lấy dữ liệu trên các form đó bằng đối tượng Request  thông qua phương thức getParameter thì rất dễ dàng và việc. Tuy nhiên trong một số trường hợp thì thông tin trên form không chỉ là các textfield không mà còn phải kèm theo các tập tin đa phương tiện ví dụ như: hình ảnh,âm thanh,...và một quy định trong form của html là nếu như form đó có chứa các thành phần multimedia thì bắt buộc chúng ta phải khai báo thêm thuộc tính  enctype="multipart/form-data" của form. Và việc lấy dữ liệu trên form lúc này thông qua phương thức getParameter của đối tượng Request là điều trong mơ :D.lúc này nếu chúng ta lấy dữ liệu trên form  bằng cách đó thì chỉ nhận về kết quả là null mà thôi.
Vậy làm sao mình lấy dữ liệu bây giờ ? Bạn yên tâm, lúc làm  đồ án và gặp trường hợp như thế này mình đã đặt ra câu hỏi như vậy. Và google.com.vn quả là một người thầy tuyệt vời, mình đã tìm ra các giải quyết nhờ nó :D. Để lấy dữ liệu được và upload kèm các file multimedia thì chúng ta sẽ sử dụng thêm một thư viện bổ  sung và nó có tên là Oreilly bạn có thể tải về tại đây . Sau khi tải về giải nén ra bạn copy file có tên là cos vào thư mục lib trong thư mục WEB-INF. Bây giờ ta đã có thư viện hỗ trợ rồi. Bước tiếp theo là ta sẻ sử dụng đối tượng MultipartRequest trong thư viện đó, và thông qua hàm getParameter("tenphantutrenform") để lấy dữ liệu.
Các tham số truyền vào khi khởi tạo một đối tượng MultipartRequest là. Đối tượng Request,Thư mục gốc và kích thước tối  đa của file multimedia.
Ví dụ :
MultipartRequest mul=new MultipartRequest(request,".",10*1024*1024)
Đến đây việc lấy dữ liệu coi như đã thành công, tuy nhiên vấn đề đặt ra ở đây là dữ liệu mà chúng ta lấy được lại không như ý muốn đó là vấn đề lỗi FONT. Đây là cái lỗi mà làm mất nhiều thời gian của mình nhất và mình đã thử hỏi google hết cách nhưng thầy ấy đành bó tay, và rồi mình quyết định tìm hiểu sâu hơn về đối tượng MultipartRequest. Và mình đã tìm được ra câu trả lời và cách giải  quyết vấn đề lỗi font khi lấy dữ liệu bằng multipartrequest. Mình hiểu nỗi khổ fix bug của các bạn và nó là động lực để mình viết bài hướng dẫn này, hi vọng những ai gặp phải vấn đề này sẽ tìm được bài hướng dẫn của mình.
Nào bắt đầu. Nguyên nhân lỗi font ở đây đơn giản là do encoding mặc định của Multipartrequest là ISO-8859-1 mà dữ liệu trên form lại là tiếng việt có encodingUTF-8, cho nên khi dữ liệu lấy từ form và truyền vào MultipartRequest sẽ bị convert về chuẩn ISO-8859-1 và dẫn đến tình trạng lỗi font. Mà trong đối tượng MultipartRequest lại có một tham số khởi tạo là set encoding cho nó do đó vấn đề của mình bây giờ là lúc khởi tạo nó chúng ta thêm vào một tham số khởi  tạo encoding có giá trị là UTF-8. và bây giờ đã hết lỗi font.
Cách khởi tạo như sau :MultipartRequest mul=new MultipartRequest(request,".",10*1024*1024,"UTF-8")

Mình xin kết thúc bài hướng dẫn ở đây, hi vọng nó sẽ giúp ích được cho các bạn, chúc các bạn làm bài tốt.và dưới đây là bài code hướng dẫn do mình làm các bạn nếu gặp khó khăn thì tham khảo thêm nhé !

package Controller;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;

import Model.NHANVIEN_MOD;
import object.NHANVIEN_OBJ;

/**
 * Servlet implementation class NHANVIEN_CTR
 */
@WebServlet("/NHANVIEN_CTR")
public class NHANVIEN_CTR extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NHANVIEN_CTR() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        NHANVIEN_OBJ nv_obj=new NHANVIEN_OBJ();
        NHANVIEN_MOD nv_mod=new NHANVIEN_MOD();
        MultipartRequest multi=new MultipartRequest(request,".",10*1024*1024,"UTF-8");
        File file=multi.getFile("hinhanh");
        String myfolder=getServletContext().getRealPath("hinhanh")+"\\";
        String link=myfolder+file.getName();
        file.renameTo(new File(myfolder,file.getName()));
        nv_obj.setManv(multi.getParameter("manv"));
        nv_obj.setHoten(multi.getParameter("hoten"));
        nv_obj.setGioitinh(multi.getParameter("gioitinh"));
        nv_obj.setDiachi(multi.getParameter("diachi"));
        nv_obj.setSdt(multi.getParameter("sodienthoai"));
        nv_obj.setHinhanh(link);
        if(nv_mod.ThemNhanVien(nv_obj)>0)
        {
            response.sendRedirect("NhapThongTinNV.jsp");
        }
        else
        {   
            response.getWriter().print("manv:"+multi.getParameter("manv"));
            response.getWriter().print("gioitinh:"+request.getParameter("gioitinh"));
            response.getWriter().print("sodt:"+request.getParameter("sodienthoai"));
            response.getWriter().print("diachi:"+request.getParameter("diachi"));
            response.getWriter().print("diachi:"+multi.getParameter("hoten"));
        }   
    }
}

 




0 nhận xét:

Đăng nhận xét

Copyright © 2014 Thủ thuật IT All Right Reserved
Designed by THIỀU ANH NHẤT