Самая первая проблема с которой сталкивается русскоязычный jsp программист – это кодировка.
Простейший код
<body>
<%
out.print(“Привет, мир!”);
%>
Еще раз привет!
</body>
На выходе даст нечитабельные символы.
HTML тэг meta – естественно не спасет. Выход формируется java-машиной, которая сама решает как поступать с символами. При этом она законно не обращает внимание на семантику контента, который она генерирует.
Решается проблема просто – директивой page.
<%@ page contentType="text/html;charset=windows-1251" language="java"%>
<body>
<%
out.print(“Привет, мир!”);
%>
Еще раз привет!
</body>
Теперь контент получится в правильной кодировке. Осталось, только, не забыть указать с помощью тэга meta кодировку браузеру.
Примечание: хоть запись cp1251 и windows-1251, по идеи, идентичны, однако из-за различных серверных настроек на некоторых системах могут возникнуть проблемы с одним из вариантов.
2. Получение данных из формы
В jsp есть объект request, с помощью которого можно получить входные параметры:
<form id="FormName" action="a.jsp" method="get" name="FormName">
<input type="text" name="name" size="10">
<input type="submit" name="submitButtonName" value="Submit">
</form>
<%
String name = request.getParameter( “name” );
%>
Все очень просто, до тех пор, пока нам не надо включить в форму
<FORM action="a.jsp" METHOD=post enctype="multipart/form-data">
<input type="file" name="file1">
Что бы загружался именно файл, а не его имя, необходимо установить enctype="multipart/form-data"
После этого мы лишаемся всех преимуществ объекта request. Метод getParameter работать прекращает.
Решение этой проблемы – несколько не тривиально. Для того, что бы получить данные – надо написать свой uploader.
В общем виде делается так:
String header = request.getHeader("Content-Type");
String boundary = "--" + header.substring(header.indexOf("boundary=") + 9 );
Из заголовка HTTP пакета получаем boundary.
После этого получаем все тело request:
StringBuffer data = new StringBuffer();
try
{
ServletInputStream in = request.getInputStream();
BufferedInputStream bf = new BufferedInputStream((InputStream)in);
int bit;
while((bit = bf.read()) != -1)
{
data.append((char)bit);
}
}
catch(java.io.IOException e )
{
}
Далее пробежаться по всем под-телам, находящимся между двух boundary, выделить из каждого под-тела заголовок, узнать тип под-под-тела, выделить его и в зависимости от типа – обработать. Заголовок и под-под-тело отделены друг от друга строкой “\n\n”.
3. Опять кодировка
Допустим у нас есть массив байт (byte[]) и мы точно знаем, что там находится текст на русском языке. Необходимо из массива байтов получить массив символов (char[]).
Если мы напишем char_var[0] = (char)byte_var[0]; то компилятор это пропустит, но корректной работы не дождемся.
Проблема решается просто.
byte[] byte_var = new byte[100];
ByteToCharCp1251 nn = new ByteToCharCp1251();
char[] char_var = nn.convertAll(byte_var);
Впервые опробовал фичу оперы "Fit to window width" - понравилось26.05.05 18:31 Автор: amirul <Serge> Статус: The Elderman