[appengine-java] Re: HttpSession handling question

2009-09-04 Thread Jason (Google)
Hi Marton. Yes, you need to explicitly call setAttribute() when you modify
any object in the session. Otherwise, the object won't be updated in App
Engine's cache/datastore, which are the mechanisms it uses to back sessions
- Jason

On Thu, Sep 3, 2009 at 2:11 AM, Marton Papp mapr...@gmail.com wrote:


 Hi!

 I am using HttpSession to store some information as session
 attributes. When I am testing the application locally, it works fine.
 But when I upload it to production, it seems that any session
 attributes that I retrieve from the session and modify it are not
 persisted back to the session again, unless I specifically call
 HttpSession.setAttribute() in each request. I am not sure whether it
 is the expected behavior or it is bug. Here are the two test cases:

 Test1:

 public class Test_gae_sessionServlet extends HttpServlet {
private static final String SESSION_ATTRIBUTE_NAME =
 test_session_attribute;

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
HttpSession session = req.getSession();
resp.setContentType(text/plain);

SessionContext sessionContext = (SessionContext)
 session.getAttribute
 (SESSION_ATTRIBUTE_NAME);

resp.getWriter().println(session retreived:  +
 sessionContext);

if (sessionContext==null) {
sessionContext = new SessionContext();
resp.getWriter().println(session created:  +
 sessionContext);

// calling setAttribute only when the object is
 first created
resp.getWriter().println(putting context into
 session:  +
 sessionContext);
session.setAttribute(SESSION_ATTRIBUTE_NAME,
 sessionContext);
}

sessionContext.value++;

resp.getWriter().println(context at end of retquest:  +
 sessionContext);
}
 }


 Test2:

 public class Test_gae_sessionServlet extends HttpServlet {
private static final String SESSION_ATTRIBUTE_NAME =
 test_session_attribute;

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
HttpSession session = req.getSession();
resp.setContentType(text/plain);

SessionContext sessionContext = (SessionContext)
 session.getAttribute
 (SESSION_ATTRIBUTE_NAME);

resp.getWriter().println(session retreived:  +
 sessionContext);

if (sessionContext==null) {
sessionContext = new SessionContext();
resp.getWriter().println(session created:  +
 sessionContext);
}

// calling setAttribute in every request
resp.getWriter().println(putting context into session:  +
 sessionContext);
session.setAttribute(SESSION_ATTRIBUTE_NAME,
 sessionContext);

sessionContext.value++;

resp.getWriter().println(context at end of retquest:  +
 sessionContext);
}
 }


 The object stored in the session:

 public class SessionContext implements Serializable {

private static final long serialVersionUID = -5151175222401820614L;

public int value = 0;

@Override
public String toString() {
return SessionContext [value= + value + ];
}

 }


 In Test1 it is always the first version of the SessionContext that is
 retreived in each request, no matter that I try to change its contents
 during each request. Test2 works as expected. Is it so that I need to
 call HttpSession.setAttribute() for any object that is expected to
 change during the request? Is it according to the servlet
 specification?


 Marton

 


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-java@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~--~~~~--~~--~--~---



[appengine-java] Re: HttpSession handling question

2009-09-03 Thread leszek

Have you enabled session ? By default it is read-only.

WEB-INF/appengine-web.xml.

sessions-enabledtrue/sessions-enabled

http://code.google.com/appengine/docs/java/config/appconfig.html

---
Enabling Sessions

App Engine includes an implementation of sessions, using the servlet
session interface. The implementation uses the App Engine datastore
and memcache to store session data.

This feature is off by default. To turn it on, add the following to
appengine-web.xml:

sessions-enabledtrue/sessions-enabled

-
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine for Java group.
To post to this group, send email to google-appengine-java@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~--~~~~--~~--~--~---