使用servlet上的doGet()方法处理繁重的操作

时间:2013-06-20 16:17:05

标签: java jsp java-ee servlets

我正在处理的工具只能发送GET请求,我需要使用请求中包含的信息来处理繁重的操作。然后,这些操作返回一个String,其中包含我将用于重定向的URL。

在做了一些研究之后,我发现doGet()方法更多地用于预处理请求,而doPost()可以用于后处理。

有什么办法可以使用doGet()方法进行这些繁重的操作?如果我必须使用doPost()方法,如何将我的请求“转”为POST请求?

感谢。

编辑:我已经尝试在doGet方法中处理这些繁重的操作。但似乎servlet不会等到生成用于重定向的url String。我已经读过尝试在性能方面同步你的doGet()方法是一件坏事。

编辑2 - 关于我正在尝试做的事:我正在研究的工具是Oracle解决方案。您可以在客户端中启动自定义操作,包括Web应用程序。启动自定义操作将向应用程序发送GET请求,其中包含有关您从中启动应用程序的页面的所有信息(用户,项目选择等),然后应用程序使用此信息来处理我所谈论的繁重操作。操作包括使用相同的ID在Oracle客户端上创建新会话,根据所选项目进行查询,创建XML数据,甚至使用位于Oracle服务器上的外部程序。最后,它返回一个下载URL,您可以从中下载PDF报告,我使用此URL重定向应用程序。

这是servlet代码:

package com.servlets;

import java.io.IOException;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.actions.agileSessionHandler;
import com.actions.BOMComparisonReport;

public class DefaultServlet extends HttpServlet {

    public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{

        agileSessionHandler handler = new agileSessionHandler(...);
        BOMComparisonReport report = new BOMComparisonReport(...);
        handler.setSessionObject(request);
        String url = report.generateBOMReport(...);
        request.setAttribute("redirectURL", url);
        this.getServletContext().getRequestDispatcher( "/WEB-INF/BOMCompDefault.jsp" ).forward( request, response );
    }

}

3 个答案:

答案 0 :(得分:1)

  

我已经尝试在doGet方法中处理这些繁重的操作。但似乎servlet不会等到我用于重定向的url String生成

听起来好像你正在开一个新线程并完全忘记它。这在Java EE环境中是一个非常糟糕的主意。不要那样做。只需在同一个线程中进行处理(即根本不创建new Thread())。如果你真的想以异步方式进行,那么你应该使用例如EJB上的@Asynchronous方法,然后使用轮询或推送来通知客户端进度/结果。

无论您是在GET还是POST请求中执行此操作都无关紧要。关键是,GET请求是幂等的,可收藏的,可重新执行的,每次都具有完全相同的结果。考虑SQL SELECT查询。 POST请求不是。它们将用于操纵服务器端的数据。考虑执行SQL UPDATEDELETE查询。您不希望在每个F5印刷机上修改或删除您的数据,或者甚至在搜索机器人出现索引GET链接时,对吗?

答案 1 :(得分:0)

如果您想将请求“转”为POST请求,您只需从doPost调用doGet方法,但如果您想要{{}},则不会更改任何内容{1}}功能。

如果您的工具正在发送大量请求参数,那么所有参数都将附加在url中,这根本不安全。

如果POST请求,可成功管理的网址长度也会因容器而异。

正如The New Idiot所说,幂等性意味着一遍又一遍地执行相同的操作而不会产生任何副作用

方法GET是幂等的,因为它只是要求资源并反复请求资源不会导致任何问题,但GET包括表单提交和多次输入表单数据可以造成严重问题。     尝试考虑一下您的资金交易多次购买单个onlien 时的例子。

资源的简单链接是POST个请求,您可以将它们加入书签并一遍又一遍地请求。

GET请求的安全性较低,因为所有参数都在网址中可见,而GET请求更安全,因为它们未显示在网址的任何位置。

大多数情况下,POST网址可​​以是2048个字符,这意味着您可以发送有限的数据。   在GET方法的情况下,要发送的数据没有限制

答案 2 :(得分:0)

恕我直言,重度操作没有POSTGET方法的分类。GET是幂等的,而POST不是。 GET是幂等意义,因此多次应用的相同操作应产生相同的结果,而POST则具有副作用。

GET顾名思义用于从服务器获取内容,而POST应该用于将数据发布到服务器以进行进一步处理。但是,没有人可以阻止你实现非幂等GET方法。

根据Wikipedia

  

GET 请求指定资源的表示。请注意,GET不应用于导致副作用的操作,例如使用它在Web应用程序中执行操作。其中一个原因是机器人或爬虫可以任意使用GET,这不应该考虑请求应该产生的副作用。

     

POST 将要处理的数据(例如,从HTML表单)提交到标识的资源。数据包含在请求正文中。这可能会导致创建新资源或更新现有资源或两者。

使用GET,您可以使用查询字符串有限数据发布到服务器,并且由于URL不能具有无限长度,因此它们也受到限制。此外,数据显示在浏览器窗口中。

  

我已经读过尝试在性能方面同步你的doGet()方法是一件坏事。

你想做什么?每个请求都有自己的线程执行doGet()方法。