I've got the following (shortened) struts2 action:
public class MyAction extends BaseAction implements CookiesAware {
public String execute() {
if (cookiesMap.containsKey("BLAH"))
blah=Integer.parseInt(cookiesMap.get("BLAH"));
return "success";
}
// For handling cookies
Map<String, String> cookiesMap;
@Override
public void setCookiesMap(Map<String, String> cookiesMap) {
this.cookiesMap = cookiesMap;
}
}
I get a null pointer exception when i do 'cookiesMap.containsKey' - it seems to me that setCookiesMap isn't being called. I've implemented the CookiesAware interface so i would have thought that it should be getting called - have i missed something here?
Thanks
Struts is a quite old web framework, and it's quite clumsy to write modern AJAX GUIs with it, so there were created better frameworks.
Struts 1 supports separate Request Processors (lifecycles) for each module, but all the Actions in the module must share the same lifecycle. Struts 2 supports creating different lifecycles on a per Action basis via Interceptor Stacks. Custom stacks can be created and used with different Actions, as needed.
Struts and spring both are used to develop Java web applications. Struts were developed earlier than Spring but with enhancements in the Struts framework, both are used nowadays to develop web applications using Java.
It appears that struts only supports reading cookies, you have to go to the servlet response to actually set a cookie.
In the end, i've opted to bypass the struts2 cookie support entirely and go directly to the servlet request/response objects for both reading and writing:
public class MyAction extends ActionSupport implements ServletResponseAware, ServletRequestAware {
public int division;
public String execute() {
// Load from cookie
for(Cookie c : servletRequest.getCookies()) {
if (c.getName().equals("cookieDivision"))
division=Integer.parseInt(c.getValue());
}
// Save to cookie
Cookie div = new Cookie("cookieDivision", String.format("%d",division));
div.setMaxAge(60*60*24*365); // Make the cookie last a year
servletResponse.addCookie(div);
return "success";
}
// For access to the raw servlet request / response, eg for cookies
protected HttpServletResponse servletResponse;
@Override
public void setServletResponse(HttpServletResponse servletResponse) {
this.servletResponse = servletResponse;
}
protected HttpServletRequest servletRequest;
@Override
public void setServletRequest(HttpServletRequest servletRequest) {
this.servletRequest = servletRequest;
}
}
And there's no configuration required for this method in either struts.xml or web.xml, which is a bonus. So i'm happy with this solution, even if it does paint struts2 in a poor light.
You need to also implement the Cookie Interceptor for the action definition in your struts.xml:
<action name="MyAction" class="your.fancy.app.MyAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="cookie">
<param name="cookiesName">BLAH</param>
</interceptor-ref>
<result>/index.jsp</result>
</action>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With