Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > service vs doGet-doPost


Автор: check 6.1.2007, 13:40
Такой скорее теоретический вопрос относительно сервлетов...
Есть ли какой-то практический смысл в использовании методов doGet и doPost
вместо единого метода service для обработки и GET и POST запросов?
Или это просто дело вкуса?
Эккель в своей книге пишет: "я никогда не видел объяснения, которое заставило 
бы меня поверить, что это не просто интертность мышления CGI программистов, 
которые привыкли обращать внимание, используется ли GET или POST".

Автор: Greg 6.1.2007, 14:15
Чесно говоря,трудно представить себе логику приложения,которая бы зависела от метода передачи параметров в HTTP запросе.
Я,например,не встречался с такого рода задачами,где разделение логики работы на POST и GET оправдывало бы себя.

Автор: check 6.1.2007, 15:40
В общем,  да, здравый смысл подсказывает что такое разделение реально не нужно.
Просто хотел в этом удостовериться.  
Тот же Эккель пишет: "Однако держите в уме, что я что-то упустил, что, возможно, является хорошей причиной в пользу использования doGet( ) и doPost( )".

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

Автор: Maksym 6.1.2007, 15:48
check
Иногда необходимо, чтобы параметры запроса передвались в браузерной строке и были видны пользователю. Хороший пример -- Яндекс: скопировал браузерную строку и можешь вызывать запрос в сдед раз одним кликом, или отправить другу...

Автор: check 6.1.2007, 16:14
Maksym,  речь не об том.  Я не собирался тут обсуждать целесообразность существования
методов POST и GET smile  Попробуйте-ка передать параметр через  ссылку методом POST  smile (конечно можно с помощью AJAX, но не будем об извращениях).

Но в сервлете метод service совершенно одинаковым образом обрабатывает GET и POST запросы,
однако в литературе в основном рекомендуют создавать для получения гетов и постов отдельные методы doGet и doPost.  Вот я и хотел узнать - это просто дань традиции, или это действительно для чего-то нужно. 

Автор: Maksym 6.1.2007, 17:15
check
Сори, я понял smile Всегда использовал service. Но думаю, для более глубокого понимания имеет смысл глянуть какой метод используют разработчики mvc фремворков (в сервлетах struts или в jsf реализациях).

Автор: Greg 6.1.2007, 17:59
Вот пример из кода ActionServlet в Struts 1.2.4:
Код

...
/**
     * <p>Process an HTTP "GET" request.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    public void doGet(HttpServletRequest request,
              HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }


    /**
     * <p>Process an HTTP "POST" request.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    public void doPost(HttpServletRequest request,
               HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }

    /**
     * <p>Perform the standard request processing for this request, and create
     * the corresponding response.</p>
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception is thrown
     */
    protected void process(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {

        ModuleUtils.getInstance().selectModule(request, getServletContext());
        ModuleConfig config = getModuleConfig(request);

        RequestProcessor processor = getProcessorForModule(config);
        if (processor == null) {
           processor = getRequestProcessor(config);
        }
        processor.process(request, response);

    }
...


Вот кстати,http://www.jguru.com/faq/view.jsp?EID=8824 про это пишет человек на jguru.com.
Оффтоп:
Когда я впервые начал изучать Java,я понял,что это не просто новый язык,а новый мир со своими правилами и особенностями.Стилю написания программ,как оказалось в этом мире,отводилась далеко не самая последняя роль.И это всё благодаря очень логичному языку Java,в котором кажется всё расставлено на свои места и нет ничего лишнего.
Даже если логика приложения не зависит от метода передачи данных,всё равно переопределять метод service считается дурным тоном,хоть это и уменьшает размер кода.Например потому,что в где-нибудь в далёком кошмарном будущем эта зависимость может появиться.

Автор: check 6.1.2007, 22:48
Greg,  убедил. Меняю во всех своих сервлетах service на doGet и doPost.
Благо, сервлетов пока не так много.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)