Trong bài Hướng dẫn viết công cụ dịch văn bản trong Java mà tôi đã đăng chỉ dừng lại ở mức chạy trên Console (J2SE). Điều đó khiến cho nhiều bạn chưa hình dung ra được việc áp dụng thực tiễn như nào? Hay không biết các bước và lộ trình để hoàn thiện 1 sản phẩm dành cho người dùng cuối như nào?

Bài viết này là câu trả lời cho các thắc mắc, mong đợi của các bạn đã email và pm trên FaceBook cho tôi. Tôi sẽ hướng dẫn bạn cách phát triển ứng dụng cho người dùng cuối (End-User) bằng việc kết hợp các công nghệ J2SE + J2EE + Android để sản xuất ứng dụng.

Ví dụ trong bài viết này sẽ sử dụng lại các kỹ thuật xử lý dịch văn bản trên Google Translate từ bài viết trước và kèm theo việc hướng dẫn bạn xây dựng Web Service để dùng trong ứng dụng Android.


Hướng triển khai ứng dụng




Để triển khai ứng dụng dịch văn bản trong Android, tôi đưa ra 2 hướng xử lý như sau:

Hướng 1: Đưa các phần xử lý core cho việc bóc tách dữ liệu từ Google Translator vào trong ứng dụng Android. Điều này có nghĩa, mọi mã xử lý từ việc POST/GET, bóc tách JSON, hiển thị dữ liệu trên giao diện sẽ nằm hết trong app này.

Hướng 2: Tách ứng dụng này thành 3 phần khác nhau:
2.1. Phần Core: được viết bằng Java core sẽ xử lý dữ liệu đầu vào/đầu ra.
2.2. Phần Web: được viết bằng Servlet sẽ xử lý các request từ ứng dụng Android và trả về dữ liệu.
2.3. Phần App Android: đơn giản chỉ bao gồm các component cho việc nhập/xuất và thực hiện request dịch văn bản lên Web Service được deploy trên server.

Với 2 hướng này, tôi đề xuất thực hiện hướng xử lý thứ 2 bởi vì các phần logic xử lý sẽ được tách biệt khỏi app và nằm ở phía Server (Server-Side). Phía Client (Client-Side) sẽ được giảm tải các phần mã xử lý nghiệp vụ phức tạp. Với hướng phát triển này, nếu logic xử lý nghiệp vụ dịch văn bản có nâng cấp hoặc sửa đổi cũng không ảnh hưởng tới app hoặc phải đợi 2-3 ngày người dùng cuối mới có thể update được phiên bản mới trên Google Play, dễ maintain, khiến app trở nên linh động trong việc xử lý và hiển thị thông tin.



Triển khai dự án


Phần Core xử lý dữ liệu đầu vào/ra bạn có thể xem trong bài viết này.

A. Chúng ta sẽ thực hiện phần Web như sau:

Tạo 1 Project Java Web Application:


Add Project Code4LifeVnTranslatorCore:




Tạo 1 Servlet vn.code4life.translator.service.Code4LifeVnTranslatorServlet:



Sau khi tạo xong Servlet, bạn viết mã xử lý request/response như sau:

package vn.code4life.translator.service;

import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import vn.code4life.translator.GoogleTranslator;
import static vn.code4life.translator.GoogleTranslator.*;

/**
 *
 * @author code4lifevn
 */
@WebServlet(name = "Code4LifeVnTranslatorServlet", urlPatterns = {"/translate"})
public class Code4LifeVnTranslatorServlet extends HttpServlet {

    private static GoogleTranslator translator = new GoogleTranslator();

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //=> Thiết lập dữ liệu trả về là dạng JSON
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        //=> Xử lý request
        String query = URLDecoder.decode(request.getParameter("q"), "UTF-8");
        LANGUAGE srcLang = LANGUAGE.AUTO;
        LANGUAGE destLang = LANGUAGE.AUTO;
        String srcLangRequestParam = request.getParameter("s");
        String destLangRequestParam = request.getParameter("d");

        if ("vi".equalsIgnoreCase(srcLangRequestParam)) {
            srcLang = LANGUAGE.VIETNAMESE;
        } else if ("en".equalsIgnoreCase(srcLangRequestParam)) {
            srcLang = LANGUAGE.ENGLISH;
        }

        if ("vi".equalsIgnoreCase(destLangRequestParam)) {
            destLang = LANGUAGE.VIETNAMESE;
        } else if ("en".equalsIgnoreCase(destLangRequestParam)) {
            destLang = LANGUAGE.ENGLISH;
        }

        //=> Translator
        translator.setSrcLang(srcLang);
        translator.setDestLang(destLang);
        StringBuilder dataResultBuilder = new StringBuilder();
        try {
            dataResultBuilder.append(translator.translate(query));
        } catch (Exception exception) {
            dataResultBuilder.append(exception.getMessage());
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("data", dataResultBuilder.toString());
  
        //=> Xử lý Response
        try (ServletOutputStream out = response.getOutputStream()) {
            out.write(jsonObject.toJSONString().getBytes());
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

Add thêm thư viện json_simpile_1.1.1:


Bước cuối cùng bạn Build ProjectDeploy lên máy local hoặc server của bạn. 



Ví dụ, tôi đã deploy trên server:


Ok, phần web như vậy đã xong. (Bạn có thể chạy thử nghiệm trên IP mạng LAN)

B. Viết ứng dụng Android:

Trong phần này, tôi sẽ thiết kế 1 ứng dụng Android đơn giản có nhiệm vụ gửi các request lên service dịch văn bản, nhận dữ liệu trả về và hiển thị nó trên giao diện.

Tạo 1 Android Application Project mới:



Về giao diện, tôi thiết kế đơn giản như sau:



AndroidManifest.xml:



    
    
    
        
            
                

                
            
        
    





Mã xử lý Class vn.code4life.translator.MainActivity của app như sau:

package vn.code4life.translator;

import java.net.URLEncoder;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class MainActivity extends Activity {
    private EditText txtOrgText;
    private EditText txtTranslatedText;
    private Button translateButton;
    private RadioGroup rdGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtOrgText = (EditText) this.findViewById(R.id.txtOrgText);
        txtTranslatedText = (EditText) this.findViewById(R.id.txtTranslatedText);
        translateButton = (Button) this.findViewById(R.id.button1);
        rdGroup = (RadioGroup) this.findViewById(R.id.radioGroup1);

        handleTranslator();
    }

    private void handleTranslator() {
        translateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread() {
                    @Override
                    public void run() {
                        String requestText = txtOrgText.getText().toString();
                        RadioButton opt = (RadioButton) MainActivity.this.findViewById(rdGroup.getCheckedRadioButtonId());
                        String optValue = opt.getText().toString();
                        String srcLang = "";
                        String destLang = "";
                        if ("Vi -> En".equalsIgnoreCase(optValue)) {
                            srcLang = "vi";
                            destLang = "en";
                        } else if ("En -> Vi".equalsIgnoreCase(optValue)) {
                            srcLang = "en";
                            destLang = "vi";
                        }
                        try {
                            JSONObject result = getJSON(requestText, srcLang, destLang);
                            final String translatedText = result.getString("data");
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    txtTranslatedText.setText(translatedText);
                                }
                            });
                        } catch (Exception exception) {
                            exception.printStackTrace();
                        }
                    }
                }.start();
            }
        });
    }

    private JSONObject getJSON(String text, String srcLang, String destLang) throws Exception {
        //=> Build request url
        final String SERVICE_URL = "http://api.code4life.vn:88/TranslatorService/translate?q=";
        String requestURL = new StringBuilder()
            .append(SERVICE_URL).append(URLEncoder.encode(text, "UTF-8"))
            .append("&s=").append(srcLang)
            .append("&d=").append(destLang).toString();

        //=> Make A Request
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(requestURL);
        HttpResponse httpResponse = httpClient.execute(httpGet);

        //=> Get Response Data
        JSONObject respObject = null;
        if (httpResponse.getStatusLine().getStatusCode() == 200) {
            String respData = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
            respObject = new JSONObject(respData);
        }
        return respObject;
    }
}


Demo ứng dụng khi chạy trên máy thật:



Tôi vừa hướng dẫn các bạn hoàn chỉnh các bước phát triển 1 ứng dụng từ phần core của ứng dụng cho tới các thành phần hướng tới người dùng cuối với ngôn ngữ lập trình Java. Hy vọng, bài viết giúp bạn có cái nhìn thực tế hơn về việc phát triển ứng dụng và định hướng được cách làm ra những sản phẩm của riêng bạn.

(Service Translator API được sử dụng trong bài viết đã undeploy trên server vì lí do bảo mật và tài nguyên máy chủ. Bạn hãy thử deploy trên tài nguyên của riêng bạn nhé ^^).

Đừng quên Like, +1 và chia sẻ blog cho mọi người nếu bạn thấy bài viết này có ích đối với bạn. ^^

Tải về toàn bộ dự án:
http://www.mediafire.com/download/2iqrx5rh6bz5ejy/Code4LifeVn_Translator_Project.zip

0 nhận xét:

Đăng nhận xét

 

code4lifevn team

Thanh niên nghiêm túc :)

Name: Manh Do

Age: years old

Job: Senior Java and Mobile Developer

Country: VietNam

Name: Hung Nguyen

Age: years old

Job: Android Developer

Country: VietNam

Name: Trung PH

Age: years old

Job: Senior iOS and Android Developer

Country: VietNam

Name: Điệp NT

Age: years old

Job: Senior .Net and Android Developer

Country: VietNam