0

イントロ: 私はサーブレットでのdoGetとdoPostの関係に少し慣れていません。

範囲: 私はオンラインオークションサイトで私を助けるためのツールを構築しています:

  1. 私(ユーザー)はフォーム(htmlページ)に名前を入力します。この名前はURLになります(販売される可能性があります->ビジネスメソッドがAPIを介してこれを決定します)
  2. htmlフォームはフォーム名をdoPostに投稿し、doPostはフォーム名を引数として使用してビジネスメソッドを呼び出します
  3. ビジネスメソッドを呼び出した後、Ajaxを使用してdoGetメソッドを呼び出して関連する出力(ビジネスロジックメソッドに入力されたパブリッククラスの文字列)を取得する結果のhtml/jsページにリダイレクトします。

問題: AjaxページがdoGetからの出力を取得していないようです(実際には、doGetには提供する文字列がないようです。エラーはありません。String= ""のように空白です。これは、ビジネスロジックメソッドが追加するまでです)。

質問1: doPostを使用してフォームString'st'をリクエストすると、html / js結果ページにリダイレクトしながらビジネスメソッドを呼び出すことができ、AjaxからdoGetを呼び出すこともできます。

質問2: SOや他のサイトを読んで答えを解決しようとしていますが、代入するのではなく正式に質問したいと思います。サーブレットを使用すると、スコープ(上記)を達成するための最速の方法ですか?JSPや他のJavaサーバー側のライブラリ/フレームワークとは対照的に?

hw / sw:CentOS 6.3、16 GB 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

メソッドを作成する際の問題の 1 つは get であるため、フォームを送信すると、サーブレットで doget メソッドが実行されますが、この場合は何もしません。

メソッドをpostに変更してから実行してみて、ajaxコードを書いたhtmlページのコードもpostしてください。

ajaxメソッドから同じサーブレットを呼び出していると思いますが、その時点でstrの値は残っていないので、リダイレクト中に必要なデータをクエリ文字列として追加します

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

この値は、j​​avascript を使用して取得できます

 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

これを行うことで、アプリケーションをステートフルにしています。リクエスト全体でサーバーにデータを保存しています。

つまり、ロジックは、同じサーブレット オブジェクトが順番にトリガーされるという事実に依存します。

  1. ポスト リクエスト - ビジネス メソッドを呼び出し、文字列を入力します
  2. 要求を取得 - 最後の要求で入力された文字列を取得しようとします。

まず、これはまったく必要ありません。リダイレクト中に doPost 自体からパラメーターまたは Cookie 値として、入力された文字列をブラウザーに渡すことができます。

この文字列をセッションに保存したい場合でも request.getSession().setAttribute("str", populated string)

そしてdoGetメソッドでそれを使用して取得します

request.getSession().getAttribute("str"

これは、サーブレットにインスタンス変数を含めるよりもはるかに優れています。

于 2013-01-16T04:50:51.373 に答える
1

他のページにリダイレクトすると、サーブレットはリクエストおよびレスポンスオブジェクトと変数値を破棄します...古いものを取得できません...リダイレクトする前に取得するか、セッションオブジェクトに保存してください...

于 2013-01-16T04:51:28.900 に答える