1

Java EE でシンプルな Web サイトを作成しています。シンプルに保ちたいので、Bean は使用していません。

Web サイトの構造は、さまざまな Jsp ページがあり、すべての jsp ページに対応するサーブレットがあり、jsp ページをデータベースに接続してデータを保存および取得するようなものです。

問題は、ドロップダウンからいくつかのオプションを選択するこの 1 ページの index1 があることです。次の jsp ページ (index2.jsp) は、index1.jsp から選択したオプションに従って、データベースからフィールドにデータをロードする必要があります。

index2 には、次と前のボタンがあります。今のところ、index1 から選択したオプションの値を保存して、すべての jsp ページに表示します。ただし、この index2.jsp を次にクリックすると、同じオプション値で index3 に移動しますが、index3 で前のボタンを押すと、この場合は Servlet2 である index2 のサーブレットに移動し、オプションの値は次のように表示されます。ヌル。「前へ」ボタンを押すと、セッションの値が破棄されます。その後、他のすべてのページでもオプションの値が null として表示されます。

別の質問は、サーブレットを使用してデータベースから indexa にデータをロードするときに、なぜ indexa ではなくサーブレットのアドレスなのかということです。

4

3 に答える 3

0

質問を見ると、index1ページの値の選択から発生したリクエスト全体でのデータ保存に関するものです。複数の方法があります。1 つは、この値をセッションで保持し、ページ間で使用することです。もう 1 つは、各画面に非表示のフィールドを持ち、それを渡すことです。これは大雑把な方法かもしれません。単一のサーブレットとページのさまざまなメソッド、またはサーブレットからページへのマッピングを使用できます。コード サンプルについては、 JSP の例を参照してください。

于 2013-07-12T12:25:29.200 に答える
0

わかりました、まず第一に、コードなしで、私はちょっと「暗闇で答えています」

[...]すべてのjspページには対応するサーブレットがあり、それがjspページをデータベースに接続してデータを保存および取得します[...]

JSP はサーブレットなので、すべてのサーブレット コードを JSP 内で実行できますが、MVC アーキテクチャを選択したと仮定しています。

あなたの主な問題は次のとおりだと思います。

index1.jsp から、 paramというパラメーターを使用して index2.jsp への要求を行います(単なる例)。次に、index2.jsp で、 paramと呼ばれる同じパラメーターを使用して index3.jsp に別の要求を行い ますが、前にヒットしたときに、param と呼ばれるパラメーターを index2.jsp に渡していませ

パラメーターを戻す (最も安全) か、ブラウザーの履歴をいじる (安全ではありませんが、index1.jsp から index2.jsp に対して行った同じ要求を実行します)。

残念ながら、コードがなければこれ以上あなたを助けることはできません

編集

request.setAttribute("corrtoepost", corrtoepost); これは、 「corrtoepost」をセッションではなくリクエストに保存しているあなたの間違いだと思います 。パラメータをセッションに保存するには、次の手順を実行する必要があります request.getSession().setAttribute("corrtoepost", corrtoepost);

新しい編集 OK、これが私の完全に機能する例です。私はそれをテストしましたが、動作します。

indexA.jsp

<html>
    <body>
        <form action="servletA" method="POST">
            <select name="corrtoe">
                <%if("1".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="1" selected>1</option>
                <%}else{ %>
                    <option value="1">1</option>
                <%} %>
                <%if("2".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="2" selected>2</option>
                <%}else{ %>
                    <option value="2">2</option>
                <%} %>
                <%if("3".equals(request.getSession().getAttribute("corrtoe"))){ %>
                    <option value="3" selected>3</option>
                <%}else{ %>
                    <option value="3">3</option>
                <%} %>
            </select>
            <input type="submit">
        </form>
    </body>
</html>

ServletA.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String corrtoepost = request.getParameter("corrtoe");
        //Search in DB or whatever
        request.getSession(true).setAttribute("corrtoe", corrtoepost);
        getServletContext().getRequestDispatcher("/jsp/indexB.jsp").forward(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

indexB.jsp

<html>
    <body>
        <h1><%=request.getSession().getAttribute("corrtoe")%></h1>
        <form action="jsp/indexC.jsp" method="GET">
            <input type="submit">
        </form>
    </body>
</html>

indexC.jsp

<html>
    <body>
        <h1><%=request.getSession().getAttribute("corrtoe")%></h1>
    </body>
</html>

これは私のweb.xmlにあります

<servlet>
   <display-name>servletA</display-name>
   <servlet-name>servletA</servlet-name>
   <servlet-class>org.test.servlets.ServletA</servlet-class>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>servletA</servlet-name>
   <url-pattern>/servletA</url-pattern>
 </servlet-mapping>

 <welcome-file-list>
   <welcome-file>jsp/indexA.jsp</welcome-file>
 </welcome-file-list>

役立つことを願っています

于 2012-08-07T02:33:59.097 に答える
0

さて、すべてのコードを説明とともにここに投稿します...

さて、ここに最初のインデックスのコードがあります.. indexnpro.jsp は、値を取得すると、このように値を Servletnpro に転送します.. <form class="form-class" name="myform" action="Servletnpro" method="POST">注: ここのアーキテクチャは MVC であるため、すべての jsp が独自のサーブレットを持ち、値が別の値に直接移動しないことを覚えておいてください。 jspが、それらを次のjspに渡すサーブレット.....今、Servletnproのdopostメソッドで...

String connectionURL = "jdbc:mysql://localhost/secnok?"+ "user=root&password=";
Connection connection=null;
response.setContentType("text/html");
PrintWriter out = response.getWriter();

HttpSession session = request.getSession(true);

//これらは、indexnpro.jsp から取得したさまざまな値です。それらのいくつかはドロップダウン ボックスですが、あまり重要ではありません..

String exproject=request.getParameter("country");
String corrcust=request.getParameter("state");
String excust=request.getParameter("country1" );
String corrproject=request.getParameter("state1");

String corrtoepost= request.getParameter("corrtoe");

<--------------- この値は、戻るボタンを押すと失われ続けます..このサーブレットに再び戻ると、null に変わります..

System.out.println(corrtoepost);

System.out.println("doPost is running");
System.out.println("Session id on dopost: " + session.getId() ); 

request.setAttribute("corrtoepost", corrtoepost);<--------------- セッションに値を保存していますが、それでも私はそれを失い続けています..

/////////// ここからは、データベースに接続して、ユーザーの選択、つまりセッションに保存した「corrtoepost」に基づいてデータをフェッチするデータベース接続の単純なコードです。その後、それを表示します。 indexa.jsp で ..

try{
int rs1;

// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
// Get a Connection to the database
connection = DriverManager.getConnection(connectionURL); 

//Add the data into the database

Statement stmt = connection.createStatement(); 
Statement stmt1 = connection.createStatement(); 
Statement stmt2 = connection.createStatement(); 
Statement stmt3 = connection.createStatement(); 
Statement stmt4 = connection.createStatement(); 
Statement stmt5 = connection.createStatement(); 
Statement stmt6 = connection.createStatement(); 





ResultSet rs = stmt.executeQuery( "Select * from toe_description where toe_id= '" + corrtoepost + "' " ) ;




ResultSet rs2 = stmt1.executeQuery( "Select * from toe_text where type_id=1 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs3 = stmt2.executeQuery( "Select * from toe_text where type_id=2 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs4 = stmt3.executeQuery( "Select * from toe_text where type_id=3 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs5 = stmt4.executeQuery( "Select * from toe_text where type_id=4 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs6 = stmt5.executeQuery( "Select * from toe_text where type_id=5 AND toe_id= '" + corrtoepost + "' " ) ;
ResultSet rs7 = stmt6.executeQuery( "Select * from toe_text where type_id=6 AND toe_id= '" + corrtoepost + "' " ) ;











while(rs.next()){
String toeid= rs.getString(1);
String toename= rs.getString(2);
String Intname= rs.getString(4);
String Assetname= rs.getString(5);
String Objname= rs.getString(6);
String ProjectID= rs.getString(7);



request.setAttribute("toeid", toeid);
request.setAttribute("toename", toename);
request.setAttribute("Intname", Intname);
request.setAttribute("Assetname", Assetname);
request.setAttribute("Objname", Objname);
request.setAttribute("ProjectID", ProjectID);





while(rs2.next()){
String purpose= rs2.getString(4);

request.setAttribute("purpose", purpose);








while(rs3.next()){
String scope= rs3.getString(4);

request.setAttribute("scope", scope);
System.out.println(scope);





while(rs4.next()){
String toe_desc= rs4.getString(4);

request.setAttribute("toe_desc", toe_desc);


System.out.println(toe_desc);




while(rs7.next()){
String toe_ass= rs7.getString(4);

request.setAttribute("toe_ass", toe_ass);








while(rs6.next()){
String enviroment= rs6.getString(4);

request.setAttribute("enviroment", enviroment);





while(rs5.next()){
String ass_env= rs5.getString(4);

request.setAttribute("ass_env", ass_env);



}


}



}



}



}



}

}


request.getRequestDispatcher("/WEB-INF/indexa.jsp").forward(request, response);

// ここでは、db から取得したすべてのデータを必要な jsp に送信しています。これにより、データが表示されます。つまり、「indexa.jsp」

System.out.println("Connected to the database"); 
connection.close();
System.out.println("Disconnected from database");

}

catch (Exception e) {
e.printStackTrace();
}



}



}

////////Indexa.jsp のコード

このページには、前述の Servletnpro からフェッチされたデータが表示されます。

ページの body タグの下で、以前にセッションで Servletnpro に保存した「corrtoepost」の値を取得します。現在、この値を確認できます。

String corrtoepost1=request.getParameter("corrtoepost"); 
String corrtoepost=(String) session.getAttribute("corrtoepost"); 
session.setAttribute("corrtoepost",corrtoepost);

そして、それをjspページに表示します..現在、正しい値を表示しています..

このページの次のボタンのコードです 次のボタンは、サーブレットから取得したのと同じ正しいtoepost値で次のページに移動することを想定しています。

次に、indexb.jsp である次のページに進みます。

ここで、このように indexa.jsp から「corrtoe」の値を再度取得します。

String corrtoe=(String) session.getAttribute("corrtoe"); 
session.setAttribute("corrtoe",corrtoe);

今までこのページでも正しい値を取得しています... このページで戻るボタンを押すと問題が発生します....

このページの戻るボタンのコードを作成します。

この前のボタンを押すと、indexa.jspページのtoe値が失われ、インターフェイスのcorrtoe値がnullとして表示されます.....この後、Servlets Getメソッドを使用して、一度だけ機能する値を取得しようとしましたが、 indexa.jsp で next を押すと、indexb.jsp と残りのページに null が表示されます...問題は、セッションにも保存しているときにこの値が失われるのはなぜですか.!!! よろしければお知恵をお貸しください……。

もう1つの質問は、indexnproページで送信を押すと、indexa.jspではなくアドレスバーにServletnproが表示されるのはなぜですか...しかし、indexa.jspの値が入力されたページindexa.jspが表示されます...これはJSPページ間で「corrtoe」値を失い続ける理由..

于 2012-08-07T18:11:20.930 に答える