метод 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-странице. Возможно ли это?

1246   5  

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 / сервлеты с помощью те учебники.

Читайте также:


обновление: в соответствии с обновлением вашего вопроса (что довольно важно, вы не должны удалять части вашего исходного вопроса, это сделает ответы бесполезными .. скорее добавить информация в новом блоке), оказывается, что вы излишне устанавливаете тип кодировки формы в 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.

  1. метод 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 и т. д.)

  1. метод 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.

может быть, вы передаете данные через get, а не post?

<form method="get" ..>
..
</form>

если у вас <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

    Ничего не найдено.