Final polish of Ajax support.

This commit is contained in:
Jeremy Grelle
2008-04-25 16:06:14 +00:00
parent b8151d133f
commit ff33b67afc
22 changed files with 579 additions and 360 deletions

View File

@@ -0,0 +1,31 @@
package org.springframework.js.ajax;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.RedirectView;
public class AjaxRedirectView extends RedirectView implements View {
private AjaxHandler ajaxHandler = new SpringJavascriptAjaxHandler();
public AjaxRedirectView(String redirectUrl, boolean redirectContextRelative, boolean redirectHttp10Compatible) {
super(redirectUrl, redirectContextRelative, redirectHttp10Compatible);
}
protected void sendRedirect(HttpServletRequest request, HttpServletResponse response, String targetUrl,
boolean http10Compatible) throws IOException {
ServletContext context = RequestContextUtils.getWebApplicationContext(request).getServletContext();
if (ajaxHandler.isAjaxRequest(context, request, response)) {
ajaxHandler.sendAjaxRedirect(context, request, response, targetUrl, false);
} else {
super.sendRedirect(request, response, targetUrl, http10Compatible);
}
}
}

View File

@@ -0,0 +1,28 @@
package org.springframework.js.ajax;
import java.util.Locale;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
public class AjaxUrlBasedViewResolver extends UrlBasedViewResolver {
/**
* Overridden to implement check for "redirect:" prefix.
* <p>
* Redirect requires special behavior on an Ajax request.
*/
protected View createView(String viewName, Locale locale) throws Exception {
// If this resolver is not supposed to handle the given view,
// return null to pass on to the next resolver in the chain.
if (!canHandle(viewName, locale)) {
return null;
}
// Check for special "redirect:" prefix.
if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
return new AjaxRedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());
}
return super.createView(viewName, locale);
}
}

View File

@@ -17,13 +17,14 @@ import org.apache.tiles.context.TilesRequestContext;
import org.apache.tiles.impl.BasicTilesContainer;
import org.springframework.js.ajax.AjaxHandler;
import org.springframework.js.ajax.SpringJavascriptAjaxHandler;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.support.JstlUtils;
import org.springframework.web.servlet.support.RequestContext;
import org.springframework.web.servlet.view.tiles2.TilesView;
public class AjaxTilesView extends TilesView {
public static final String FRAGMENTS_PARAM = "fragments";
private static final String FRAGMENTS_PARAM = "fragments";
private AjaxHandler ajaxHandler = new SpringJavascriptAjaxHandler();
@@ -48,16 +49,22 @@ public class AjaxTilesView extends TilesView {
Map flattenedAttributeMap = new HashMap();
flattenAttributeMap(container, tilesRequestContext, flattenedAttributeMap, compositeDefinition);
String attrName = request.getParameter(FRAGMENTS_PARAM);
Attribute attributeToRender = (Attribute) flattenedAttributeMap.get(attrName);
container.render(attributeToRender, response.getWriter(), new Object[] { request, response });
String[] attrNames = getRenderFragments(model, request, response);
response.flushBuffer();
for (int i = 0; i < attrNames.length; i++) {
Attribute attributeToRender = (Attribute) flattenedAttributeMap.get(attrNames[i]);
container.render(attributeToRender, response.getWriter(), new Object[] { request, response });
}
} else {
super.renderMergedOutputModel(model, request, response);
}
}
protected String[] getRenderFragments(Map model, HttpServletRequest request, HttpServletResponse response) {
String attrName = request.getParameter(FRAGMENTS_PARAM);
return StringUtils.commaDelimitedListToStringArray(attrName);
}
private void flattenAttributeMap(BasicTilesContainer container, TilesRequestContext requestContext, Map resultMap,
Definition compositeDefinition) throws Exception {
Iterator i = compositeDefinition.getAttributes().keySet().iterator();