JavaRush/Java блог/Архив info.javarush/AJAX и другие языки
Izhak
22 уровень

AJAX и другие языки

Статья из группы Архив info.javarush
участников
AJAX и другие языки - 1 Повторив пример netbeans.org/kb/docs/web/ajax-quickstart_ru.html я получил работающее в общем приложение, но только для английского языка. С руским языком всё обстоит очень плохо. Что же делать? Ответ нашёлся после долгого тыканья и поиска. Для начала немного вводных ссылок. Учебник по AJAX (несколько примеров на закрепление, чтобы совсем уж не бояться этого словосочетания). http://www.wisdomweb.ru/AJAX/send.php Учебник по HTML http://htmlacademy.ru/ Итак, создадим проект как в netbeans.org/kb/docs/web/ajax-quickstart_ru.html (при заранее запущенном tomcat). Для тестирования зададим html Файл такой: AJAX и другие языки
TODO write content

Введите слово
Вот результат
а javascript такой /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ var res_div; var type_in; var req; var res_temp_div; function go(){ res_div.innerHTML="вот я"; } function what_i_type(){ var res_inp = encodeURIComponent(type_in.value); //res_temp.innerHTML=decodeURIComponent(res_inp); } function start_ajax(){ res_div.innerHTML="start_ajax"; var url = "answertest?action=complete&id=" + encodeURIComponent(type_in.value); res_temp_div.innerHTML= "answertest?action=complete&id=" + encodeURIComponent(type_in.value); res_div.innerHTML="url"; req = init_ajax_request(); res_div.innerHTML="init_ajax_request"; req.open("GET", url, true); req.onreadystatechange = callback_ajax; req.send(null); res_div.innerHTML="wait answer"; } function init_ajax_request(){ if (window.XMLHttpRequest) { if (navigator.userAgent.indexOf('MSIE') !== -1) { isIE = true; } return new XMLHttpRequest(); } else if (window.ActiveXObject) { isIE = true; return new ActiveXObject("Microsoft.XMLHTTP"); } } function init_ajax(){ res_div = document.getElementById("res"); type_in= document.getElementById("testCont"); res_div.innerHTML="init_ajax"; res_temp_div= document.getElementById("res_temp"); } function callback_ajax(){ res_div.innerHTML="callback_ajax"; if (req.readyState === 4){ res_div.innerHTML="4"; if (req.status === 200){ res_div.innerHTML=req.responseText+" "+decodeURIComponent(req.responseText); } } } Здесь много всяких лишних мест, но оно всё вылезло в процессе тестирования, что удобно смотреть результат прямо на страничке, хочется видеть, на каком этапе мы находимся и т.д. Что здесь важно - фукция encodeURIComponent(type_in.value) является максимально стандартизованной, и ей надо пользоваться при работе с нестандартными кодировками, а не escape() или encodeURI(), которые не очень стандартны :). Обратно закодировать полученную строку можно при помощи decodeURIComponent(what). Нпример, decodeURIComponent(encodeURIComponent(type_in.value)) будет выдавать то же, что и type_in.value. Дальше добавляем сервлет, правда вызов сервлета у меня /answertest в отличии от того, который показан в инструкции от нетбинс, но это всегда можно поправить. На шаге о создании сервлета, подпункт 3 устанавливаем галочку add information to deployment descriptor. Ну и код сервлета для тестирования вышел вот таким /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package my.iplolma.testajax; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author i.polma */ public class AnswerTestServlet extends HttpServlet { /** * Processes requests for both HTTP GET and POST * methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ private ServletContext context; TestAjaxController testController; @Override public void init(ServletConfig config) throws ServletException { this.context = config.getServletContext(); if(testController == null){ testController=new TestAjaxController(); } } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); //testController.initres(request.getParameter("id")); } // /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String targetId = URLDecoder.decode(request.getParameter("id"), "UTF-8"); boolean res = testController.initres(targetId); response.setCharacterEncoding("UTF-8"); response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); if (res){ response.getWriter().write(targetId); } } /** * Handles the HTTP POST method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// } Здесь собственно интересен метод doGet(). Для того, чтобы не латинские символы передать обратно в ответ на запрос обязательно добавить строку response.setCharacterEncoding("UTF-8"); функция URLDecoder.decode(request.getParameter("id"), "UTF-8"); является стандартной для преобразования изменённого с помощью encodeURIComponent() метода в javascript к нормальному виду не латинских букв. а URLEncoder.encode(temp, "UTF-8"); служит для преобразования данных к закодированному виду. я сделал себе следующий Java контроллер для тестирования /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package my.iplolma.testajax; import java.net.URLDecoder; import java.net.URLEncoder; /** * * @author i.polma */ public class TestAjaxController { String temp; boolean out; public TestAjaxController(){ out = false; } public boolean initres(String str_in){ out = false; try{ if (str_in != null){ temp = URLDecoder.decode(str_in, "UTF-8"); out = true; } } catch(Exception e){} return out; } public String getres(){ String res="null"; try{ if (out){ res = URLEncoder.encode(temp, "UTF-8"); } } catch (Exception e){} return res; } } И всё - теперь можно спокойно делать что угодно на стороне сервера, и отображать это на HTML страничке. Ура!.
Комментарии
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
У этой страницы еще нет ни одного комментария