Как в jsp скрыть адресную строку
Перейти к содержимому

Как в jsp скрыть адресную строку

  • автор:

Скрытое поле

Часто возникает ситуация, когда требуется передать в форме некоторые промежуточные данные, которые не должны изменяться пользователем. Более того, такие данные не должны показываться пользователю, поскольку носят технический характер и обычно служат для передачи некоторой информации от страницы к странице. Для этой цели применяется скрытое поле, оно не отображается на странице и прячет своё содержимое от пользователя. Посетитель не может в него ничего внести или напечатать.

Синтаксис создания скрытого поля.

Атрибуты перечислены в табл. 1.

Табл. 1. Атрибуты скрытого поля

Атрибут Описание
name Имя поля для его идентификации обработчиком формы.
value Значение поля, определяющее, какая информация будет отправлена на сервер.

Пример использования скрытых полей приведен в примере 1.

Пример 1. Использование скрытого поля

HTML5 IE Cr Op Sa Fx

    Скрытое поле   

Напишите любимое слово и нажмите кнопку Отправить (никакие данные не будут передаваться на сервер!):

В данном примере показано создание двух скрытых полей, одно из них носит имя name и получает значение Vasya , а второе именуется password со значением pupkin . В результате отправки формы обработчику, указанному в атрибуте action , программа может легко прочитать эти данные и интерпретировать их по усмотрению разработчика.

Как в jsp скрыть адресную строку

В методы doGet и doPost сервлета, которые обрабатывают запрос, в качестве одного из параметров передается объект HttpServletRequest , с помощью которого можно получить отправленные сервлету данные, то есть параметры запроса. Для этого в классе HttpServletRequest определены два метода:

  • getParameter(String param) : возвращает значение определенного параметра, название которого передается в метод. Если указанного параметра в запросе нет, то возвращается значение null.
  • getParameterValues(String param) : возвращает массив значений, который представляет определенный параметр. Если указанного параметра в запросе нет, то возвращается значение null.

Получение данных из строки запроса

Передавать значения в сервлет можно различными способами. При отправке GET-запроса значения передаются через строку запроса. Стандартный get-запрос принимает примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2.

Например, определим следующий сервлет:

import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); // получаем параметр id String try < writer.println("

Id:" + id + "

"); > finally < writer.close(); >> >

В данном случае мы предполагаем, что в сервлет в get-запросе передается значение/параметр по имени id. С помощью вызова request.getParameter(«id») мы получаем значение этого параметра и затем отправляем его в ответ пользователю. При этом стоит учитывать, что неважно, что мы будем передавать извне — целое или дробное число, отдельный символ, в любом случае метод getParameter возвратить строку.

Запустим приложение и обратимся к сервлету:

Запрос GET к сервлету

В случае выше значение для параметра id не указано, мы просто вводим в адресной строке браузера название ресурса — в данном случае http://localhost:8081/helloapp/hello , где helloapp — название приложения, а hello — конечная точка, к которой примонтирован сервлет. Поэтому метод getParameter(«id») возвращает значение null.

Теперь передадим значение для параметра id:

Передача данных в сервлет

Параметры в строке запроса указываютя после названия ресурса после знака вопроса: http://localhost:8081/helloapp/hello?id=5 . В данном случае параметр id равен 5.

Подобным образом можно передавать несколько параметров. Например, изменим сервлет следующим образом:

import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String name = request.getParameter("name"); String age = request.getParameter("age"); try < writer.println("

Name: " + name + "; Age: " + age + "

"); > finally < writer.close(); >> >

В данном случае сервлет получает два параметра: name и age. Мы можем передать значения для них, набрав в адресной строке, например, http://localhost:8081/helloapp/hello?name=Tom&age=34 . При передаче некольких параметров они отделяются друг от друга знаком амперсанда &. Подобным образом мы можем передать и большее количество параметров.

Параметры сервлета Java

Передача массивов

В примерах выше передавались одиночные данные — отдельные строки. Но также мы можем передавать наборы значений. Например, изменим сервлет следующим образом:

import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String[] nums = request.getParameterValues("nums"); try < writer.print("

Numbers: "); for(String n: nums) writer.print(n + " "); writer.println("

"); > finally < writer.close(); >> >

Если в сервлет передается массив значений, то для его получения у объекта HttpServletRequest применяется метод getParameterValues() , который получает название параметра и возвращает массив строк. В данном случае мы ожидаем, что параметр будет называться nums. Затем значения из этого параметра в цикле передаются в ответ клиенту.

Запустим сервлет и передадим ему значения

Передача в сервлет Java массив значений

При передаче массива через строку запроса указываются несколько значений с одним и тем же именем: http://localhost:8081/helloapp/hello?nums=1&nums=2&nums=3 .

Получение данных из форм

Еще одним распространенным способом отправки данных является отправка форм. Добавим в проект страницу index.html со следующим кодом:

    User Form   
Name:

Age:

Gender: Female Male

Country:

Courses: Java SE Java FX Java EE

Как правило, формы отправлются с помощью запроса POST, поэтому у элемента формы определен атрибут method=»POST» . Сама форма будет отправляться на ресурс «/hello», с которым будет сопоставляться сервлет. На самой форме есть множество полей ввода, в том числе набор чекбоксов, из которых можно выбрать сразу несколько значений.

Отправка форм в сервлет

Теперь определим сервлет, который будет обрабатывать эту форму:

Данный сервлет будет обрабатывать запросы к по адресу «/hello», на который отпавляется форма. Поскольку отправка формы осущетвляется с помощью метода POST, то для обработки запроса определен метод doPost . Метод doPost принимает те же параметры, что и метод doGet.

С помощью методов getParameter() и getParameterValues() также получаем значения параметров. В данном случае названия параметров представляют названия полей ввода отправленной формы.

Причем поскольку на форме несколько чекбоксов, которые имеют одно и то же имя, то соответственно сервлету передается набор значений, который получаем с помощью метода getParameterValues() . Все остальные поля представляют одиночные значения, поэтому для получения их данных применяется метод getParameter() .

Работа с сервлетами для чайников. GET / POST

В прошлой статье Создание сервлетов для чайников. Пошаговое руководство я описал, как создать сервлеты и попытался объяснить, как это работает. В этой статье мы научим наши сервлеты работать с UI через HTTP-запросы GET и POST.

На самом деле, этих запросов намного больше, но для чистоты эксперимента мы разберём только два основных.

  • GET — обрабатывает адресную строку, которая получается при вызове сервлета. Например, site.com/example?action=test&id=10&admin=true
  • POST — обрабатывает загруженный контент (картинку, файл, строки, объектные данные), в общем, всё, что можно передать через HTTP
  • простой объект класса Bot, который будет иметь имя, серийник и id
  • страницу, на которую мы будем выводить данные объекта
  • страницу, на которой мы будем менять данные объекта
  • сервлет, который будет обрабатывать соответствующие запросы
/** * Синглтон-класс Bot. * Для чистоты эксперимента это будет синглтон. * * Created by promoscow on 26.07.17. */ public class Bot < private Integer id; private String name; private String serial; private static Bot ourInstance = new Bot(); public static Bot getInstance() < return ourInstance; >private Bot() < >public Bot(String name, String serial, Integer id) < this.name = name; this.serial = serial; this.id = id; >public Integer getId() < return id; >public void setId(Integer id) < this.id = id; >public String getName() < return name; >public void setName(String name) < this.name = name; >public String getSerial() < return serial; >public void setSerial(String serial) < this.serial = serial; >@Override public String toString() < return "Bot botServlet web.BotServlet 0  botServlet /bot 

Пишем вот такую страницу bot.jsp (пока просто копируем, потом разберём):

     Bot   

Bot info

ID: $ | Name: $ | Serial number: $ Update

Эта страница выводит нам данные бота.

обрабатывает аргумент «bot», при чём мы даём понять, что это объект класса Bot. $ и прочие подобные — это переменные, которые мы берём из полученного в аргументе объекта (это будет в сервлете).

Отметим, что ссылка Update переводит на адрес bot?action=update содержит данные для GET-запроса.

Также, у нас будет страница, которая отправляет изменённые данные бота (update.jsp):

    Update   
ID:
" placeholder="$" />
Name:
" placeholder="$" />
Serial number:
" placeholder="$" />

Мы также получаем данные бота и вставляем их в поля, меняем их и отправляем изменённые данные в POST-запросе. Отметим, что POST-запрос инициируется через отправку формы

где method=«post» означает, что данные формы попадут в POST, а action=«bot?action=submit» означает, что после отправки формы произойдёт переход по адресу bot?action=submit

Разберём для наглядности одно поле формы:

" placeholder="$" />

По нажатию кнопки Save все введённые данные будут отправлены в метод doPost() нашего сервлета. В данной строчке, мы задаём новый id.

Ну и давайте добавим самую примитивную страницу index.html, содержащую единственную ссылку на страницу bot:

Мы закончили с jsp / html и можем перейти, наконец, к моему любимому Java-коду.

import model.Bot; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Bot Servlet class. * * Created by promoscow on 26.07.17. */ public class BotServlet extends HttpServlet < private Bot bot; @Override public void init(ServletConfig config) throws ServletException < super.init(); bot = new Bot("Amigo", "228274635", 1); >@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doGet"); String action = request.getParameter("action"); request.setAttribute("bot", bot); switch (action == null ? "info" : action) < case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; >> @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doPost"); request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); if ("submit".equals(action)) < bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); >request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); > >

Сервлет содержит 3 метода: init(), doGet() и doPost().

init() — вызывается при первой инициализации сервлета и единожды исполняет написанный в нём код. В нашем случае, создаётся экземпляр класса Bot.

doGet() — обрабатывает запрос GET.

doPost() — обрабатывает запрос POST.

Теперь мы по цепочке пройдём логику выполнения приложения и разберём, что как работает.

Итак, загружаем проект в Tomcat. Перед нами — одинокая ссылка «Bot». Нажимаем её.

Мы переходим в сервлет BotServlet. Метод doGet() исполняется всегда (ведь адресная строка есть всегда), метод doPost() исполняется только по запросу (у нас он есть —

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < //просто выводим в консоль, что мы заходили в метод doGet System.out.println("Enter doGet"); //здесь мы уже начинаем работать с адресной строкой. в ссылке "bot?action=update" (bot.jsp, 20 строчка) после вопросительного знака идут пары ключ-значение, разделённые знаком &. у нас есть пара action=update. Вызываем значение (параметр) по ключу action, у нас это update и заносим результат в String. String action = request.getParameter("action"); //загодя вносим в запрос атрибут, при исполнении сервлета он будет отправлен в целевую строку. атрибут вносится вместе с ключом. в нашем случае, мы вносим объект bot со всеми его полями как атрибут и задаём ключ "bot", по которому мы потом вызовем данные объекта в jsp-странице request.setAttribute("bot", bot); switch (action == null ? "info" : action) < //если параметр имеет значение update (action=update), мы отправляемся на строку /update.jsp, где будем изменять данные бота (и отправляем туда атрибут bot) case "update": request.getRequestDispatcher("/update.jsp").forward(request, response); break; //если параметр пустой (action == null ? "info"), отправляемся на страницу bot.jsp, где мы увидим данные бота (и по дефолту тоже) case "info": default: request.getRequestDispatcher("/bot.jsp").forward(request, response); break; >>

Как видите, метод doGet() работает с адресной строкой, извлекает из неё атрибуты и обрабатывает их. Инструментарий метода doGet() велик, например, в строке может содержаться ?action=update&id=23847&admin=true (к примеру), мы можем извлечь id, отправить на доработку робота с полем id, равным 23847 и сделать его админом.

Поскольку в index.html атрибут адресной строки по ссылке имеет значение update, мы исполняем эту часть кода doGet():

request.setAttribute("bot", bot); request.getRequestDispatcher("/update.jsp").forward(request, response);

— добавляем атрибут с объектом bot и ключом «bot» и отправляем всё это на страницу /update.jsp

В странице update.jsp мы вносим новые значения в формы, соответствующие полям класса Bot и отправляем всё по адресу «bot?action=submit». Повторю — в этой статье не ставится задача разбирать тэги jsp/html, для этого есть Справочник по HTML.

Итак, мы нажимаем кнопку «Save». Поскольку форма содержит method=«post» action=«bot?action=submit», мы обрабатываем данные, полученные в форме, в методе doPost(). В этом методе можно как обрабатывать входящие данные, так и извлекать атрибуты адресной строки.

@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < System.out.println("Enter doPost"); //правилом хорошего кода будет задать кодировку UTF-8 — в метод могут приходить параметры, скажем, на кириллице (опять же, мы можем дать нашему боту кириллическое имя) request.setCharacterEncoding("UTF-8"); //извлекаем значение параметра action и сохраняем в Stiring, как мы это делали в методе doGet() String action = request.getParameter("action"); //если action=submit, назначаем нашему боту новые значения, которые мы получили в метод. это делается также, извлекая параметры. у каждого параметра из формы есть своё имя, по этому имени мы извлекаем значение (например, в разбираемой выше строчке формы update.jsp name="id" value=$мы задаём нашему боту новый id, извлекая его в строчке bot.setId(Integer.parseInt(request.getParameter("id"))); if ("submit".equals(action)) < bot.setId(Integer.parseInt(request.getParameter("id"))); bot.setName(request.getParameter("name")); bot.setSerial(request.getParameter("serial")); >//опять запихиваем объект bot в атрибут и возвращаемся на страницу /bot.jsp, где наблюдаем изменения request.setAttribute("bot", bot); request.getRequestDispatcher("/bot.jsp").forward(request, response); >

Вот и вся статья. Мы отработали в сервлете запросы POST и GET через соответствующие методы doPost() и doGet().

Целью статьи является создание понимания у начинающих разработчиков JavaEE, как работают запросы в сервлетах и по какой логике выстраивается работа с этими запросами в Java-коде.

Это вторая моя статья на тему сервлетов, запуск первого сервлета мы разбирали в статье Создание сервлетов для чайников. Пошаговое руководство

Скрыть адресную строку мобильного браузера

Дано: страница без прокрутки (полноэкранный слайдер) Условия: должны поддерживаться основные браузеры Android и iOS Проблема: на малых экранах мобильных устройств, адресная строка занимает многовато места. Да, и слайдер не презентабельно смотрится. Вопрос: есть ли способ с помощью css или javascript/jQuery скрыть ненависную адресную строку? UPD 20.09.2023: Теперь имеются новые единицы измерения: svh и svw (small viewport height/width), наименьший активный размер вьюпорта; lvh и lvw (large), наибольший активный размер вьюпорта; dvh и dvw (dynamic) — автоматом вписывается во вьюпорт. Поддержка браузерами: https://caniuse.com/viewport-unit-variants

Отслеживать

Constantine Tretyakoff

задан 1 дек 2016 в 23:20

Constantine Tretyakoff Constantine Tretyakoff

447 4 4 серебряных знака 15 15 бронзовых знаков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *