2012-01-03 5 views
1

Я пытаюсь использовать метод encodeURL в jsp для кодирования URL с символом «%».Как закодировать URL со специальным символом «процент»?

response.encodeURL(/page1/page2/view.jsp?name=Population of 91% in this place)

Всякий раз, когда кнопка нажата, отображается "The website cannot display the page" ошибка.

Но если вы вручную измените символ "%" на "%25", как на этом «Population of 91%25 in this place», отобразится правильная страница.

Также когда "%" символ помещается в конце концов, как это «In this place Population of 91%», то страница отображается правильно, но я заметил, что в адресной строке его все еще отображается как "%", а не "%25" и до сих пор его работы.

Когда я искал вокруг, его упоминается только использовать другие методы, как encodeURI() & encodeURIComponent().

Можете ли вы предложить мне решение, при этом используя метод encodeURL для корректного отображения страницы, даже если есть "%" символ. Должен ли я использовать replace() или почему не работает метод encodeURL()?

ответ

1

Метод HttpServletResponse#encodeURL() на самом деле вводит в заблуждение. Прочтите javadoc, чтобы узнать, что он на самом деле делает (при необходимости добавьте jsessionid). См. Также In the context of Java Servlet what is the difference between URL Rewriting and Forwarding?, чтобы узнать об амбигентах в мире JSP/Servlet.

В стороне сервлета, вам нужно URLEncoder#encode() вместо:

String url = "/page1/page2/view.jsp?name=" + URLEncoder.encode("Population of 91% in this place", "UTF-8"); 
// ... 

В стороне JSP, однако, вам нужно JSTL<c:url> тег вместо (avoid Java code in JSP!):

<%@ page pageEncoding="UTF-8" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
... 

<c:url var="url" value="/page1/page2/view.jsp"> 
    <c:param name="name" value="Population of 91% in this place" /> 
</c:url> 

<a href="${url}">link</a> 

<form action="${url}"> 
    <input type="submit" value="button" /> 
</form> 
1

Результат вашего код:

%2Fpage1%2Fpage2%2Fview.jsp%3Fname%3DPopulation%20of%2091%25%20in%20this%20place 

Вы должны кодировать только значение строки запроса.

... = "/page1/page2/view.jsp?name=" + URLEncoder.encode('Population of 91% in this place'); 

?

0

В вашем примере, вы можете использовать c:url и c:param теги:

<c:url value="/page1/page2/view.jsp"> 
    <c:param name="name" value="Population of 91% in this place" /> 
</c:url> 

В частности, c:param тег URL-закодировать значение атрибута. Я просто столкнулся с ситуацией, когда мне нужно было создать URL-адрес с querystring, содержащим значение, которое начиналось с знака фунта. Без кодирования url знак фунта был интерпретирован браузером как начало якорной части. Я добавил тэг c:param, и знак фунта был закодирован, что позволяет ожидать ожидаемого поведения, следуя ссылке.

Смежные вопросы