我继承了使用Struts 1.2开发的网站,我需要对其进行一些更新。对于其中一个更新,我需要根据用户单击按钮时从动态创建的(使用struts)下拉框中选择的值设置会话变量。我试图完成此任务的方法是使用我的按钮的'onclick'属性来调用JavaScript函数,该函数利用AJAX对struts Action类进行异步调用。
我已成功实施此解决方案,但是,我遇到的问题只是偶尔发生。在大多数情况下,当我单击我的按钮时,会话变量似乎设置正确。但是,偶尔会话变量未被设置/重置。这个问题的零星性质是让我失望的原因。看起来AJAX代码块正在被调用和处理(返回readyState = 4和status = 200),但是,没有输入Java struts逻辑。代码如下。
JavaScript AJAX功能:
function createTaskOpp() {
var selectedOpp = document.getElementById("oppId");
var url="setTaskSessionOpportunity.do?opp=" + selectedOpp.value;
var ajaxRequest;
try
{
// Opera 8.0+, Firefox, Safari
ajaxRequest = new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer Browsers
try
{
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
// Something went wrong while trying to create our HTTP object. Resubmit the current page.
alert("Browser Error. Error creating Request Object: " + e);
window.location ="taskConfiguration.do";
}
}
}
ajaxRequest.open("GET", url, true);
ajaxRequest.onreadystatechange = function() {
if (ajaxRequest.readyState == 4)
{
if (ajaxRequest.status == 200)
{
window.location ="saveTask.do";
}
else {
window.location ="taskConfiguration.do";
}
}
};
ajaxRequest.send(null); }
Struts Action:
public class SetTaskSessionOpportunityAction extends Action {
public ActionForward execute( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
System.out.println("*****************");
System.out.println("In SetTaskOpp AJAX -Beginning");
HttpSession session = request.getSession();
String taskOpp = request.getParameter("opp");
session.setAttribute("task_opportunity", taskOpp);
ActionForward actionForward = new ActionForward("/viewTask.jsp");
return actionForward;
}
}
感谢您的帮助! -Josh
答案 0 :(得分:2)
问题解决了。事实证明这是一个AJAX请求的浏览器缓存问题。 IE(我的测试环境)自动缓存AJAX请求。我通过添加以下代码行来纠正了这个问题:
response.setHeader("Cache-Control", "no-cache");