我有一个Portal,它将Spring控制器与几个常规servlet结合在一起。
在屏幕中,用户有一个列表,他/她从中选择信用卡以查看该卡的交易报告。作为一项额外的安全措施,我避免在任何请求中向客户发送信用卡,因此我有一个屏蔽的信用卡号码列表,我发送给用户,在用户发送的请求中,我收到了我使用的记录ID确定查询哪张信用卡。
在控制器( ReportController )中,我有一个方法来处理此输入并调用(本地)负责处理报告的servlet( ReportServlet )。如果处理中有任何错误,则应使用模型参数“错误”将其返回到屏幕。最后一部分不起作用。
如果 ReportServlet 中出现错误,则不会返回到屏幕。如果我评论前线(并强制一个错误)它可以工作,但在转发后它没有。我做错了什么?
以下是代码:
ReportController
try {
...
if (cardholders == null || cardholders.size() < 2 || id <= 0) {
model.put("error","there's an error");
return CARDTRANSACTIONS_PATH;
} else {
...
HttpUpdatetableRequestWrapper customRequest = new HttpUpdatetableRequestWrapper(request);
customRequest.setParameter("cardnumber", cardholder.getCardnumber());
request.getRequestDispatcher(config.getProperty("reportservlet")).forward((HttpServletRequest) customRequest, response);
String error = (String) session.getAttribute("error");
if(!(error == null || "".equals(error))){
throw new RuntimeException(error);
}
}
} catch (Exception ex) {
model.put("error", "there's an error");
} finally{ return CARDTRANSACTIONS_PATH;}
答案 0 :(得分:1)
当你的控制器返回时,Spring会将模型提供给AbstractView
,它将分解它并将属性传递给请求。因此,当您向控制器中的模型对象添加属性时,您只需将它们添加到与请求无关的地图中。如果您希望这些属性可用于您转发的资源,则应将它们直接添加到请求中。
当你转发时,你期望你转发的资源来处理响应,因此你应该让你的控制器在那种情况下返回null
,这样它就不会做任何进一步的处理。