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 Project và Deploy lên máy local hoặc server của bạn.
Ví dụ, tôi đã deploy trên server:
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 Trong bài
0 nhận xét:
Đăng nhận xét