我想问一下,在我的案例中是否有更好的解决方案来管理servlet中的操作:
我有很多操作(需要大约10秒)来解析数据并将它们呈现给用户。我想向用户展示一些界面和一些显示动画,当数据准备就绪时,在同一个jsp中向用户显示。我得到一个servlet,例如maped到/ new然后我想显示new.jsp
request.getRequestDispatcher("new.jsp").forward(request, response);
而不是做这个长时间的操作,但当我这样做时:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("new.jsp").forward(request, response);
/*
here are my operations
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
*/
我得到了
Cannot forward after response has been committed
它显示了new.jsp,我看到tomcat操作是成功的,但我的数据没有通过jsp传递
$.get("NewSearchController", function(responseJson) {
如果我在这个servlet中重新定向到new.jsp然后使用另一个servlet获取所有这些数据,它是否有用,但这是一个好习惯吗?我该怎么办?
答案 0 :(得分:0)
如果我在这个servlet中重新定向到new.jsp然后使用另一个servlet获取所有这些数据,它是否有用,但这是一个好习惯吗?我该怎么办?
大多数传统的Web应用程序在尝试显示某些消息以让用户等待时都会做同样的事情。我认为这已经足够了。
您还可以触发AJAX调用并阻止用户交互,您可以使用promise来实现此目的。
//before the ajax call
$.blockUI();//or a bootstrap modal will do
$.get("/NewSearchController").then(function(response){
//handle your response
$.unblockUI();
}).fail(function(err){
//handle error
$.unblockUI();
});
但是,如果您经常处理RESTful服务,我强烈建议您迁移到JAX-RS。
编辑: 好像你想要达到这样的目标: 1.在数据加载完成之前显示某种布局。 2.操作完成后更新页面。
为此,你可以让你的new.jsp做什么都不做布局。
new.jsp
<!--omit html layout-->
<script type="text/javascript">
$(document).ready(function(){
$.get("yourapi").then(function(data){
//handle your data, updating the #main div sound logical
}).fail(function(err){
//display an error message maybe?
});
});
</script>
<div id="data">
</div>
这样,您可以在用户等待并且知道应用程序不仅仅是冻结时至少显示页面布局。
请告诉我这是否是您想要实现的目标。