Как получить параметры из URL с помощью JSP

193

В JSP как получить параметры из URL?

Например, у меня есть URL, который www.somesite.com/Transaction_List.jsp?accountID=5
я хочу получить 5.

Есть ли request.getAttribute ("accountID"), как для сеансов или что-то подобное?

Джош Валун
источник

Ответы:

178

В запросе GET параметры запроса берутся из строки запроса (данные после знака вопроса в URL). Например, URL-адрес http://hostname.com?p1=v1&p2=v2 содержит два параметра запроса - - p1 и p2. В запросе POST параметры запроса берутся как из строки запроса, так и из опубликованных данных, которые закодированы в теле запроса.

Этот пример демонстрирует, как включить значение параметра запроса в сгенерированный вывод:

Hello <b><%= request.getParameter("name") %></b>!

Если страница была доступна с URL:

http://hostname.com/mywebapp/mypage.jsp?name=John+Smith

результирующий вывод будет:

Hello <b>John Smith</b>!

Если имя не указано в строке запроса, вывод будет:

Hello <b>null</b>!

В этом примере используется значение параметра запроса в скриптлете:

<%
    if (request.getParameter("name") == null) {
        out.println("Please enter your name.");
    } else {
        out.println("Hello <b>"+request. getParameter("name")+"</b>!");
    }
%>
Саджад Бахмани
источник
97
Скриплеты считаются плохой практикой.
BalusC
14
Не забудьте xmlEncode .. это в настоящее время уязвимо для отраженного xss
Esailija
5
-1 для уязвимости XSS. Также было бы -1 для использования скриптлета, когда работа может быть выполнена с использованием EL, если бы я мог голосовать дважды. Серьезно, НЕ ДЕЛАЙТЕ ЭТОГО .
Жюль
Предложение использования скриптлетов при наличии лучшего решения вредно для качества кода.
Сукету Бхута
2
Относительно «Сценарии считаются плохой практикой», см. Этот ответ в другом вопросе об альтернативах.
Pixelstix
243

Об неявных объектах языка унифицированных выражений в руководстве по Java EE 5 написано:

Неявные объекты

Язык выражений JSP определяет набор неявных объектов:

  • pageContext: Контекст для страницы JSP. Обеспечивает доступ к различным объектам, в том числе:
    • servletContext: Контекст сервлета страницы JSP и любых веб-компонентов, содержащихся в одном приложении. См. Доступ к веб-контексту.
    • session: Объект сеанса для клиента. См. Поддержание состояния клиента.
    • request: Запрос, запускающий выполнение страницы JSP. См. Получение информации из запросов .
    • response: Ответ, возвращаемый страницей JSP. См. Построение ответов.
  • Кроме того, доступно несколько неявных объектов, которые обеспечивают легкий доступ к следующим объектам:
    • param: Сопоставляет имя параметра запроса с одним значением
    • paramValues: Сопоставляет имя параметра запроса с массивом значений
    • header: Сопоставляет имя заголовка запроса с одним значением
    • headerValues: Сопоставляет имя заголовка запроса с массивом значений
    • cookie: Сопоставляет имя файла cookie с одним файлом cookie
    • initParam: Сопоставляет имя параметра инициализации контекста с одним значением
  • Наконец, есть объекты, которые разрешают доступ к различным переменным области действия, описанным в разделе Использование объектов области.
    • pageScope: Сопоставляет имена переменных в области страниц с их значениями
    • requestScope: Сопоставляет имена переменных в области запроса с их значениями
    • sessionScope: Сопоставляет имена переменных в рамках сеанса с их значениями
    • applicationScope: Сопоставляет имена переменных в области приложения с их значениями

Интересные части выделены жирным шрифтом :)

Итак, чтобы ответить на ваш вопрос, вы должны иметь доступ к нему следующим образом (используя EL):

${param.accountID}

Или, используя JSP Scriptlets (не рекомендуется):

<%
    String accountId = request.getParameter("accountID");
%>
Паскаль Тивент
источник
Есть ли что-то, что вы должны сделать, чтобы включить EL? Я использую jboss6, и когда я использую $ {param.accountID}, он обрабатывается как обычный текст из браузера.
simgineer
@simgineer Во-первых, файл ДОЛЖЕН быть JSP, а не просто HTML. Прочитайте следующие разделы: Язык выражений, значение переменной не отображается , выражения EL не оцениваются в JBoss AS 4.2.2 , Язык выражений в JSP не работает .
informatik01
81

Используйте EL (язык выражений JSP):

${param.accountID}

Тейлор Лиз
источник
1
Это обрабатывает URL-декодирование?
Викингстев
@vikingsteve да, это так
Нил Макгиган
2
Но он не обрабатывает перекодирование как сущности HTML / XML, что необходимо для предотвращения XSS. Используйте JSTL, <c:out value="${param.accountID}" />чтобы сделать это.
Жюль
21

Если я могу добавить комментарий здесь ...

<c:out value="${param.accountID}"></c:out>

не работает для меня (он печатает 0).

Вместо этого это работает:

<c:out value="${param['accountID']}"></c:out>

Леа Массио
источник
Стоит отметить: параметр содержит больше значений, чем просто аргументы запроса URL (например, значения в карте модели). если вам нужно конкретно проверить, есть ли значение в аргументах запроса URL (и, например, будет ли оно отправлено как часть отправки формы), вы можете посмотреть на $ {pageContext.request.queryString} - но оно не разбито на хорошая карта вроде params есть.
Пол
4
String accountID = request.getParameter("accountID");
Johannes
источник
0

Например, вы хотели удалить тему записи с ее subject_id

@RequestMapping(value="subject_setup/delete/{subjectid}",method = RequestMethod.GET)
public ModelAndView delete(@PathVariable int subjectid) {
    subjectsDao.delete(subjectid);
    return new ModelAndView("redirect:/subject_setup");
}

и параметр будет использоваться для ввода по вашему запросу

public int delete(int subjectid) {
    String sql = "update tbl_subject set isdeleted= '1' where id = "+subjectid+"";
    return template.update(sql);
}
Ainz Ooal Gown
источник
0

www.somesite.com/Transaction_List.jsp?accountID=5

Для этого URLесть вызов метода request.getParameterв java, если вы хотите, чтобы здесь был приведен номер int, аналогично для строкового значения, приведенного в string. так что для вашего требования, просто скопируйте прошлое ниже строки на странице,

int  accountId =(int)request.getParameter("accountID");

Теперь вы можете вызывать это значение, используя accountIdвсю страницу.

здесь accountIdесть имя параметра, с помощью которого вы также можете получить более одного параметра, но это не работает. Он будет работать только с GETметодом, если вы нажмете POSTзапрос, тогда они будут ошибкой.

Надеюсь, это полезно.

Джей Патель
источник
0

страница 1: страница сведений 2: <% String id = request.getParameter ("userid");%> // теперь вы можете использовать идентификатор для запроса sql подробного продукта hsql

ноль
источник