2016-05-22 4 views
-1

Java(JSPおよびServlets)を使用していますが、スタックしています。私の研究から、私はセッションレベルのオブジェクトが必要かもしれないと信じています。オブジェクトにアクセスする際の単純なJSP /サーブレットの問題

ユーザーはJSPフォームを完成させ、submitを押して、NewServletクラスのPOSTです。

NewServletの内部に、この情報が格納されるNewFileThingオブジェクトが作成されます。

@WebServlet(urlPatterns = {"/NewServlet"}) 
    public class NewServlet extends HttpServlet { 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // Stuff happens here... 
String nameOfUser = request.getParameter("name"); 

    NewFileThing fi = NewFileThing(); 
    fi.addName(name); 

    response.sendRedirect("nextForm"); 
    } 
    } 

ユーザーは、nextForm.jspにリダイレクトされます。このフォームを完了すると、FinalServletに送信されます。

@WebServlet("/FinalServlet") 
@MultipartConfig 
public class FinalServlet extends HttpServlet { 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

// TODO how can I access object fi (NewFileThing) from here? 
fi.getName(); <--- Error, or if I make new object it's NULL... 
} 
} 

質問:FinalServlet以内、どのように私は、私が以前に作成した同じオブジェクトNewFileThing(同じインスタンス)を得ることができますか?私は新しいものを作りたくありません!

すてきなコミュニティありがとう!

答えて

0

はい、1つの方法は、そのオブジェクトをセッションに格納することです。 FinalServletで

NewServletで

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

// get the session 
HttpSession session = request.getSession(); 

// get object from session 
NewFileThing fi = (NewFileThing) session.getAttribute("NewFileThing"); 

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
+0

HttpSessionに入れることのできるサイズには限界がありますか? – user5623335

+0

これは実際にサーバーのメモリリソースに依存します。あなたは確かにそこに良い量を格納することができますが、私はあまりにも狂っていないでしょう。同時ユーザー数も考慮する必要があります。できるだけセッションを最小限に抑えてください。大きなオブジェクトを格納する必要がある場合は、他の形式の永続ストレージ(ファイル、データベーステーブルなど)を調べてください。 –

+0

java.lang.IllegalArgumentException:setAttribute:名前がfiの直列化不可能な属性。私は解決策を見つけましたが、わかりません:直列化可能なList実装を使用し、リスト内のオブジェクトもシリアライズ可能であることを確認して、オブジェクトをシリアライズ可能にすることができます。 – user5623335

0

これは単純なWebアプリケーションであれば、「はい」、オブジェクトをHttpSessionに保存します。

もっと複雑なWebアプリケーションの場合は、オブジェクトをHttpSessionに格納することができますが、どのように行うかについてはよりスマートにする必要があります。または、何らかの永続ストアを使用することを検討してください。

+0

データベースのような永続ストアのタイプは何ですか?私のケースでは、HttpSessionは名前、アドレスなどのようにうまくいくと思います。 – user5623335

+0

一般的な永続ストアはデータベースです。ショッピングカートのようなものを考えてみてください。 – hooknc

0

response.sendRedirect()あなたの要求のデータを保持しません。 RequestDispatcherクラスを使用する必要があります。 複数のクラスでデータを転送する方法は複数あります。 ページスコープ、リクエストスコープ、セッションスコープ、またはアプリケーションスコープを必要に応じて配置できます。 ページスコープでは、オブジェクトデータは同じページにのみ保持されます。 リクエストスコープでは、オブジェクトは次の即時ページまで保持されます。 セッションスコープでは、オブジェクトは同じセッション内で同じセッション時間内に複数のページに保持されます。 アプリケーションスコープでは、オブジェクトは複数のアプリケーションにもトラベルできます。

最も一般的に使用されるスコープは、要求とセッションです。

セッションは、細心の注意を払って使用する必要があります。セッションを正しく使用しないと他のセッションと混乱する可能性があります。

あなたのケースでは、オブジェクトが使用される前にトラベルする必要がある複数のJSPとサーブレットがあるようです。セッションに入れる方が良い。使用後はセッションから削除してください。だからうんざりのチャンスは少ないです。セッションの最初のサーブレット入れオブジェクトで

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

あなたは は//セッション HttpSessionのセッション=要求を取得したい場所にそれを使用してください。getSession(); //セッションからオブジェクトを取得する NewFileThing fi =(NewFileThing)session.getAttribute( "NewFileThing");

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
関連する問題