0

简介: 我对 servlet 中的 doGet 和 doPost 之间的关系有点陌生。

范围: 我正在构建一个工具来帮助我建立一个在线拍卖网站,其中:

  1. 我(用户)在表单(html 页面)中输入一个名称,这个名称将是一个 URL(可能出售 -> 业务方法通过 API 确定)
  2. html 表单在 doPost 中发布表单名称,然后 doPost 使用表单名称作为参数来调用业务方法
  3. 在调用业务方法后,我重定向到结果 html/js 页面,该页面使用 Ajax 调用 doGet 方法以获取关联的输出(业务逻辑方法中填充的公共类字符串)

问题: Ajax 页面似乎没有从 doGet 获得输出(实际上 doGet 似乎没有要给出的字符串,没有错误 - 只是像 String="" 这样的空白。直到业务逻辑方法添加到它为止)。

问题 1: 如何使用 doPost 请求表单 String 'st' 以便我可以调用业务方法,同时也可以重定向到 html/js 结果页面,并且还可以从 Ajax 调用 doGet

问题 2: 我一直在尝试通过阅读 SO 和其他网站来解决我的答案——但想正式提问而不是推测:使用 servlet 是实现 Scope(以上)的最快方法吗?与 JSP 或任何其他 Java 服务器端库/框架相反?

硬件/软件:CentOS 6.3,16gb ram,物理节点,corei7 @3.2,容器是 tomcat 7

HTML

<html>
<head>
<title>URL Search Page</title>
</head>
<body>
<CENTER>
 <FORM ACTION="/ResultServlet/Results" METHOD=GET>
   <INPUT TYPE=TEXT NAME="st">
   <INPUT TYPE=SUBMIT VALUE=Submit>
  </FORM>
</CENTER>
</body>
</html>

小服务程序

@WebServlet("/Results")
public class Results extends HttpServlet {
    private static final long serialVersionUID = 1L;
       public static String str="";

    public static void businessLogic(String q){
        try {
            str = new compute.URL.GetAvailURI( "https://www.registerdomains.com/auctionAPI/Key:a05u3***1F2r6Z&urlSearch="+q);
            /*more boring number crunching */
            }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter printWriter  = response.getWriter();
        printWriter.println(str);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String st = request.getParameter("st");
        businessLogic(st);
        response.sendRedirect("results/resultActionURL.html");

    }

}
4

3 回答 3

3

您形成方法的一个问题是,当您提交表单时,它将在 servlet 中运行 doget 方法,这对您的情况没有任何作用。

所以先把方法改成post然后试试运行,把你写过ajax代码的html页面的代码也贴一下。

我认为您正在从 ajax 方法调用相同的 servlet,但当时 str 中的值不会保留,因此在重定向到时附加所需的数据作为查询字符串

response.sendRedirect("results/resultActionURL.html?st="+ st);

您可以通过使用 javascript 获得此值

 function getParameterByName(name) {
                name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
                var regexS = "[\\?&]" + name + "=([^&#]*)";
                var regex = new RegExp(regexS);
                var results = regex.exec(window.location.search);
                if (results == null)
                    return "";
                else
                    return decodeURIComponent(results[1].replace(/\+/g, " "));
 }
 var st=getParameterByName(st);
 //add your ajax call code and pass st as data there.

希望这能回答你的问题。

于 2013-01-16T05:08:07.477 回答
1

您正在通过这样做使您的应用程序有状态。您正在跨请求将数据存储在服务器中。

这意味着您的逻辑取决于按顺序触发相同的 servlet 对象的事实

  1. 发布请求 - 调用业务方法并填充字符串
  2. 获取请求 - 尝试检索上次请求中填充的字符串。

首先,这根本不需要,您可以在从 doPost 本身重定向期间将填充的字符串作为参数或 cookie 值传递给浏览器。

即使你想在会话中存储这个字符串 request.getSession().setAttribute("str", populated string)

并在 doGet 方法中使用

request.getSession().getAttribute("str"

这比在你的 servlet 中有一个实例变量要好得多。

于 2013-01-16T04:50:51.373 回答
1

一旦你重定向到其他页面 servlet 将破坏请求和响应对象和变量值......所以你不能得到旧的......所以尝试在重定向之前获取或将其保存在会话对象上......

于 2013-01-16T04:51:28.900 回答