【发布时间】:2012-06-17 18:21:04
【问题描述】:
我有一个 Spring MVC 注释驱动的项目,它运行良好。在这一点上,我的许多表单都很小,我倾向于使用 Ajax 请求来处理它们。我一直在使用这个插件:http://jquery.malsup.com/form/ 来处理我的 Ajax 请求,它也一直运行良好。我遇到了一个问题。我正在使用 Jackson 将我的 @ResponseBody 项目序列化为 json。它工作得很好,但我遇到了需要上传文件的第一个表单。 AjaxForm 在较旧的浏览器上使用 iframe 提交技巧处理此问题,但警告您必须使用 <textarea></textarea> 包围您的响应,以确保所有信息都成功到达。我一直在疯狂地环顾四周,我发现我可以为我的对象制作一个自定义序列化器,但我想不出这将如何让我检查请求类型是否为XHR,然后才用<textarea></textarea> 标签。有什么想法吗?
这是我的一些代码:
public @ResponseBody
JsonResponse setReferenceNumber(@ModelAttribute("referenceNumber")
@Valid ReferenceNumberBean referenceNumber,
BindingResult result,
HttpServletResponse response)
{
//Do some stuff
//Theoretically here I would call upon some logic to surround the response?
return jsonResponse;
}
提前致谢!
更新 -- 我几乎认为我已经解决了这个问题,特别是在 Spring 中添加了一个新的拦截器:
<mvc:interceptors>
<bean class="edge.portal.vendor.web.interceptor.MultipartAjaxInterceptor"></bean>
</mvc:interceptors>
然后进行拦截器测试以查看 X-Requested-with,如果我的 javascript 已将调用标记为 Ajax 但标头未反映此更改,则添加标签,因此暗示 iframe ajax 发布:
@Component
public class MultipartAjaxInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("<textarea>");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("</textarea>");
}
}
现在很明显我遇到的问题是你不能多次调用响应的getWriter或OutputStream,我觉得我在解决这个问题的正确轨道上,但不知道从哪里开始。
【问题讨论】:
标签: json spring-mvc jackson ajaxform