Повторив пример 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 Файл такой:
TODO supply a title
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 страничке. Ура!.
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ