Final polish of Ajax support.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user