Ответ 1
Введение
Вы должны использовать doGet()
, когда хотите перехватить HTTP Запросы GET. Вы должны использовать doPost()
, когда хотите перехватить HTTP POST-запросы. Все это. Не переносите это на другой или наоборот (например, в неудачный автогенератор Netbeans processRequest()
). Это не дает полного смысла.
GET
Обычно HTTP GET-запросы idempotent. То есть вы получаете точно такой же результат каждый раз, когда выполняете запрос (оставляя авторизацию/аутентификацию и чувствительный к времени характер результатов поиска страницы, последних новостей и т.д.). Мы можем поговорить о запросе на закладку. Нажав на ссылку, щелкнув закладку, введя необработанный 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 не являются идемпотентными. Если конечный пользователь заранее отправил 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);
}
}
}
Вы видите, что если t211 > находится в БД (то есть имя пользователя и пароль действительны), то User
будет помещен в область сеанса (то есть "вошел в систему" ), и сервлет будет перенаправлен на некоторые основные (этот пример относится к http://example.com/contextname/home
), иначе он установит сообщение об ошибке и переадресует запрос обратно на ту же страницу JSP, чтобы сообщение отображалось ${error}
.
В случае необходимости вы можете также "скрыть" login.jsp
в /WEB-INF/login.jsp
, чтобы пользователи могли получить к нему доступ только сервлетом. Это позволяет очистить URL http://example.com/contextname/login
. Все, что вам нужно сделать, это добавить 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
, как представляется, объявлены как переменные экземпляра сервлета &mdash, что НЕ threadsafe). Поэтому я настоятельно рекомендую немного узнать о базовом Java SE API, используя учебники Oracle (см. Главу "Trails Covering the Basics" ) и как правильно использовать JSP/Servlets с помощью этих учебных пособий.
См. также:
- Страница наших сервлетов
- Java EE веб-разработка, с чего начать и какие навыки мне нужны?
- Возврат сервлета и статус HTTP 404 Запрошенный ресурс (сервлет) недоступен "
- Показать JDBC ResultSet в HTML на странице JSP с использованием шаблонов MVC и DAO
Обновить: согласно обновлению вашего вопроса (что довольно важно, вы не должны удалять части своего исходного вопроса, это сделало бы ответы бесполезными.. скорее добавьте информацию в новую блок), оказывается, что вы ненужно устанавливаете тип кодировки формы multipart/form-data
, Это отправит параметры запроса в другой композиции, чем (по умолчанию) application/x-www-form-urlencoded
, который отправляет параметры запроса в виде строки запроса (например, name1=value1&name2=value2&name3=value3
). Вам нужно только multipart/form-data
, когда у вас есть элемент <input type="file">
в форме для загрузки файлов, которые могут быть несимвольными данными (двоичные данные). Это не так в вашем случае, поэтому просто удалите его, и он будет работать, как ожидалось. Если вам когда-либо понадобится загружать файлы, вам придется установить тип кодировки так и самостоятельно проанализировать тело запроса. Обычно вы используете Apache Commons FileUpload, но если вы уже используете новый API Servlet 3.0, вы можете просто использовать встроенные средства, начиная с с HttpServletRequest#getPart()
. См. Также этот ответ для конкретного примера: Как загрузить файлы на сервер с помощью JSP/Servlet?