метод dopost и doget С в сервлеты
Я разработал HTML-страницу, которая отправляет информацию в сервлет. В сервлете я использую методы doGet() и doPost():
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
в коде html-страницы, который вызывает сервлет:
<form action="identification" method="post" enctype="multipart/form-data">
User Name: <input type="text" name="realname">
Password: <input type="password" name="mypassword">
<input type="submit" value="Identification">
</form>
когда я использую method = "get" в сервлете я получаю значение id и пароль, однако при использовании method = "post", id и пароль установлены в null. Почему бы мне не получить значения в этом случае?
еще одна вещь, я хотел бы знать, как использовать данные генерируется или проверяется сервлетом. Например, если сервлет, показанный выше, аутентифицирует пользователя, я хотел бы распечатать идентификатор пользователя на своей HTML-странице. Я должен быть в состоянии отправить строку 'id' в качестве ответа и использовать эту информацию в моей HTML-странице. Возможно ли это?
5 ответов:
введение
вы должны использовать
doGet()когда вы хотите перехватить на HTTP GET requests. Вы должны использоватьdoPost()когда вы хотите перехватить на HTTP POST запросы. Вот и все. Не порт с одного на другое или наоборот (например, в NetBeans' несчастных автоматическиprocessRequest()метод). Это не имеет никакого смысла.GET
обычно, HTTP GET запросы являются идемпотентных. Т. е. вы получаете точно такой же результат каждый раз, когда выполняете запрос (оставляя авторизацию/аутентификацию и чувствительный ко времени характер страницы-Результаты поиска, последние новости и т. д.-вне рассмотрения). Мы можем говорить о заметном запросе. Щелчок по ссылке, щелчок по закладке, ввод необработанного URL-адреса в адресной строке браузера и т. д. Все это вызовет запрос HTTP GET. Если сервлет прослушивает указанный URL-адрес, то его
doGet()метод будет вызван. Это обычно используется для preprocess запрос. Т. е. делать некоторые бизнес-вещи перед представлением вывода HTML из JSP, например, сбор данных для отображения в таблице.@WebServlet("/products") public class ProductsServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Product> products = productService.list(); request.setAttribute("products", products); // Will be available as ${products} in JSP request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } }<table> <c:forEach items="${products}" var="product"> <tr> <td>${product.name}</td> <td><a href="product?id=${product.id}">detail</a></td> </tr> </c:forEach> </table>также просмотр / редактирование подробных ссылок, как показано в последнем столбце выше, обычно являются идемпотентными.
@WebServlet("/product") public class ProductServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Product product = productService.find(request.getParameter("id")); request.setAttribute("product", product); // Will be available as ${product} in JSP request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response); } }<dl> <dt>ID</dt> <dd>${product.id}</dd> <dt>Name</dt> <dd>${product.name}</dd> <dt>Description</dt> <dd>${product.description}</dd> <dt>Price</dt> <dd>${product.price}</dd> <dt>Image</dt> <dd><img src="productImage?id=${product.id}" /></dd> </dl>POST
запросы HTTP POST не являются идемпотентными. Если конечный пользователь заранее отправил форму сообщения по URL-адресу, которая не выполнила перенаправление, то URL-адрес не обязательно закладки. Представленные данные формы не отражаются в URL-адресе. Копирование URL-адреса в новое окно/вкладку браузера может не обязательно давать точно такой же результат, как после отправки формы. Такой URL-адрес тогда не является заметным. Если сервлет прослушивает указанный URL-адрес, то его
doPost()будет называться. Это обычно используется для postprocess запрос. Т. е. сбор данных из представленной HTML-формы и выполнение некоторых бизнес-задач с ним (преобразование, проверка, сохранение в БД и т. д.). Наконец, обычно результат представляется в виде HTML с переадресованной страницы JSP.<form action="login" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="login"> <span class="error">${error}</span> </form>...который может быть использован в сочетании с этой частью сервлета:
@WebServlet("/login") public class LoginServlet extends HttpServlet { @EJB private UserService userService; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userService.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect("home"); } else { request.setAttribute("error", "Unknown user, please try again"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } }вы видите, если
Userнаходится в БД (т. е. имя пользователя и пароль действительны), тоUserбудет помещен в область сеанса (т. е. "вошел в систему"), и сервлет перенаправит на некоторую главную страницу (этот пример идет вhttp://example.com/contextname/home), то это установит сообщение об ошибке и перенаправит запрос обратно на ту же страницу JSP, чтобы сообщение отображалось${error}.вы можете при необходимости "спрятать"
login.jspна/WEB-INF/login.jspтак что пользователи могут получить к нему доступ только с помощью сервлета. Это сохраняет URL-адрес чистый!--18-->. Все, что вам нужно сделать, это добавитьdoGet()к сервлету вот так:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); }(и обновить ту же строку в
doPost()соответственно)что сказал, Я не конечно, если он просто играет и стреляет в темноте, но код, который вы опубликовали, не выглядит хорошо (например, с помощью
compareTo()вместоequals()и копаться в именах параметров вместо того, чтобы просто использоватьgetParameter()иidиpasswordкажется, объявлены как переменные экземпляра сервлета - что не является threadsafe). Поэтому я настоятельно рекомендую узнать немного больше о базовом Java SE API, используя учебники Oracle (смотри главу "тропы Покрывая основы") и как правильно использовать JSP / сервлеты с помощью те учебники.Читайте также:
- наша страница Вики сервлетов
- Java EE web development, с чего начать и какие навыки мне нужны?
- сервлет возвращает "HTTP Status 404 запрошенный ресурс (/servlet) недоступен"
- показать JDBC ResultSet в HTML на странице JSP использование MVC и DAO pattern
обновление: в соответствии с обновлением вашего вопроса (что довольно важно, вы не должны удалять части вашего исходного вопроса, это сделает ответы бесполезными .. скорее добавить информация в новом блоке), оказывается, что вы излишне устанавливаете тип кодировки формы в
multipart/form-data. Это позволит отправить параметры запроса в другом составе, чем (по умолчанию)application/x-www-form-urlencodedкоторый отправляет параметры запроса в виде строки запроса (напримерname1=value1&name2=value2&name3=value3). Вам нужно толькоmultipart/form-dataкогда у вас есть<input type="file">элемент в форме для загрузки файлов, которые могут быть несимвольные данные (двоичные данные). Это не так в вашем случае, так что просто удалите его, и он будет работать, как ожидалось. Если вам когда-нибудь понадобится загрузить файлы, вам нужно будет установить тип кодировки so и самостоятельно проанализировать тело запроса. Обычно вы используете Apache Commons FileUpload там Для, но если вы уже на новом новом сервлете 3.0 API, то вы можете просто использовать встроенные средства, начиная сHttpServletRequest#getPart(). См. Также этот ответ для конкретного примера:как загрузить файлы на сервер с помощью JSP / Servlet?
как GET, так и POST используются браузером для запроса одного ресурса с сервера. Для каждого ресурса требуется отдельный запрос GET или POST.
- метод GET чаще всего (и является методом по умолчанию) используется браузерами для получения информации с серверов. При использовании метода GET третий раздел пакета запроса, который является телом запроса, остается пустым.
метод GET используется одним из двух способов: Когда нет метода указано, что когда вы или браузер запрашивает простой ресурс, такой как HTML страница, рисунок и т. д. Когда форма отправлена, и вы выбираете method=GET на теге HTML. Если метод GET используется с HTML-формой, то данные, собранные через форму, отправляются на сервер путем добавления"?"в конец URL-адреса, а затем добавление всех пар имя=значение (имя поля html-формы и значение, введенное в это поле), разделенных "&" Образец: ПОЛУЧИТЬ / султаны / магазин / / form1.jsp?name=Sam%20Sultan&iceCream=vanilla HTTP / 1.0 необязательный заголовок headeroptional>>
данные формы name=value будут храниться в переменной среды QUERY_STRING. Эта переменная будет отправлена в программу обработки (например, JSP, Java servlet, PHP и т. д.)
- метод POST используется при создании HTML-формы, а метод request=POST-как часть тега. Метод POST позволяет клиенту отправлять данные формы сервер в теле запроса (как обсуждалось ранее). Данные кодируются и форматируются аналогично методу GET, за исключением того, что данные передаются в программу через стандартный вход.
пример: Почта / султаны / магазин / / form1.JSP HTTP/1.0 необязательный заголовок headeroptional > > name=Sam%20Sultan&iceCream=vanilla
при использовании метода post переменная среды QUERY_STRING будет пустой. Преимущества / Недостатки от Вам и после
преимущества метода GET: Чуть быстрее Параметры могут быть введены через форму или путем добавления их после URL Страница может быть закладки с его параметрами
недостатки метода GET: Можно только отправить 4K стоит данных. (Вы не должны использовать его при использовании поля textarea) Параметры видны в конце URL
преимущества метода POST : Параметры не отображаются в конце URL-адреса. (Польза для чувствительного данные) Можно отправить больше, что 4K стоит данных на сервер
недостатки метода POST : Не может быть закладки с его данными
реализации сервлет контейнера он полностью реализует интерфейс.метод service() будет автоматически перенаправляться в doGet() или doPost () по мере необходимости, поэтому вам не нужно переопределять метод service.
если у вас
<form action="identification" >для вашей html-формы данные будут передаваться с помощью " Get " по умолчанию, и, следовательно, вы можете поймать это с помощью функции doGet в вашем коде сервлета java. Таким образом, данные будут передаваться под заголовком HTML и, следовательно, будут видны в URL-адресе при отправке. С другой стороны, если вы хотите передать данные в теле HTML, то используйте Post:<form action="identification" method="post">и поймать эти данные в функции doPost. Это было, данные будут передаваться под телом html, а не в заголовке html, и вы не увидите данные в URL после отправки формы.примеры из моего html:
<body> <form action="StartProcessUrl" method="post"> ..... .....примеры из моего кода сервлета java:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); String surname = request.getParameter("txtSurname"); String firstname = request.getParameter("txtForename"); String rqNo = request.getParameter("txtRQ6"); String nhsNo = request.getParameter("txtNHSNo"); String attachment1 = request.getParameter("base64textarea1"); String attachment2 = request.getParameter("base64textarea2"); ......... .........
Comments