首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在servlet上使用doGet()方法处理大量操作

在servlet上使用doGet()方法处理大量操作
EN

Stack Overflow用户
提问于 2013-06-20 16:17:04
回答 3查看 885关注 0票数 0

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

经过一些研究,我发现doGet()方法用于预处理请求,而doPost()则可以用于后处理。

有任何方法可以使用doGet()方法来执行这些繁重的操作吗?如果我必须使用doPost()方法,如何将我的请求“转换”为POST请求?

谢谢。

编辑:我已经尝试在doGet方法中处理这些繁重的操作。但是,servlet似乎不会等到生成了用于重定向的url字符串。我已经看到,尝试从性能上同步doGet()方法是一件坏事。

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

以下是servlet代码:

代码语言:javascript
代码运行次数:0
运行
复制
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 );
    }

}
EN

回答 3

Stack Overflow用户

发布于 2013-06-20 16:34:04

我已经尝试在doGet方法中处理这些繁重的操作。但是,servlet似乎不会等到我用来重定向的url字符串生成之后。

听起来好像你在启动一个新的线程,却完全忘记了它。在Java环境中,这是一个非常糟糕的想法。别干那事。只需在完全相同的线程中进行处理(即根本不创建new Thread() )。如果您真的打算异步执行,那么您应该在EJB上使用例如@Asynchronous方法,然后利用轮询或推送将进度/结果通知客户端。

不管你是在GET还是POST请求中都这样做。关键是,GET请求是幂等的、可书签的、可重执行的,每次结果完全相同。考虑一下SQL SELECT查询。POST请求不是。它们将用于操纵服务器端的数据。请考虑执行SQL UPDATEDELETE查询。您不希望您的数据在每一个F5新闻中都被修改或删除,甚至当搜索机器人来索引get链接时也是如此,对吗?

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 16:19:15

如果要将请求“转换”为POST请求,只需从doGet调用doPost方法即可,但如果需要POST功能,则不会改变任何内容。

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

对于GET请求,可以成功地管理的url的长度也因容器而异。

正如The所告诉的,幂等性意味着一次又一次地执行相同的操作,而不会造成任何副作用

方法GET是幂等的,因为它只是请求资源,一次又一次地请求资源不会导致任何问题,但是POST由表单提交组成,并且多次输入表单数据可能会导致严重的问题。当您的货币交易发生超过一次的单一留置权购买时,请尝试考虑该示例。

资源的简单链接是GET请求,您可以对它们进行书签并一次又一次地请求。

GET请求不太安全,因为所有参数都在url中可见,而POST请求更安全,因为它们没有显示在url中的任何地方。

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-20 16:22:51

POSTGET方法没有基于重运算的分类,GET是幂等的,POST不是幂等的。GET是幂等的意思,因此,相同的操作多次使用应该产生相同的结果,当它与POST一样有副作用。

顾名思义,GET用于从服务器获取一些信息,而POST则用于将数据发送到服务器以供进一步处理。但是,没有人能阻止你实现一个非幂等的GET方法。

根据维基百科的说法:

GET请求指定资源的表示形式。注意,GET不应该用于引起副作用的操作,例如在web应用程序中使用它来执行操作。其中一个原因是GET可能被机器人或爬行器任意使用,它们不需要考虑请求应该造成的副作用。 POST将要处理的数据(例如,从HTML )提交给标识的资源。数据包括在请求正文中。这可能导致创建新资源或更新现有资源,或两者兼而有之。

使用GET,您可以使用查询字符串将有限的数据发布到服务器,而且由于URL不能具有无限长,因此这些数据也是有限的。数据也显示在浏览器窗口中。

我已经看到,尝试从性能上同步doGet()方法是一件坏事。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17218699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档