post方法调用一个java类初始化每个请求

时间:2016-09-30 08:26:28

标签: java ajax jsp servlets

我使用jsp和servlet创建了一个小型Web应用程序。我的ajax post方法每三秒调用一次java类。我想知道每3秒,java类变量isBootRunning,istest1Running,istest1Running被初始化为" null"或不。 如果它将为每个请求初始化,如何防止这种初始化。

我的JSP:

setInterval(function(){
            TestReport(); 
        }, 3000); 
function TestReport(){
var tbname = $("#tbname").attr('class');
var userName = $("#userName").attr('class');
var name = tbname;
var url ="TestReport";
var params = {
        tbname: tbname,
        userName:userName
};
$.post('TestReport', {
    tbname: tbname,
    userName:userName,
}, function(responseText) {
    alert(responseText);
});
}

我的Servlet:

public class TestReport extends HttpServlet {
private static final long serialVersionUID = 1L;
String isBootRunning = null;
String istest1Running = null;
String istest2Running = null;
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        File f1 = new File("myfirstpath");//this directory is visible for 10 mins only 
        File f2 = new File("mythirdpath");//this directory is visible for 10 mins only
        File f3 = new File("mythirdpath");//this directory is visible for 10 mins only

        if (f1.exists() && f1.isDirectory()) {
            isBootRunning = "Running";
            istest1Running = "Scheduled";
            istest2Running = "Scheduled";
        } else if(f2.exists() && f2.isDirectory()){
            istest1Running = "Running";
            istest2Running = "Scheduled";
            if(isBootRunning=="Running"){
                //here my logic
            }
        } else if(f2.exists() && f2.isDirectory()){

            istest2Running = "Running";
            if(isBootRunning=="Running"){
                //here my logic
            }
            if(istest1Running=="Running"){
                //here my logic
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您遇到此问题,因为每次向servlet发出新的ajax请求时,都不会存储/保存先前请求的结果。
可以使用 HttpSession 解决此问题。您必须在会话对象中保存并获取字符串对象isBootRunning,istest1Running,istest2Running,如下所示:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try{
        HttpSession session =null;
        if(request.getSession().isNew()){
             session= request.getSession();//new session
        }else{
             session= request.getSession(false);//current session
        }
        if(null != session && null != session.getAttribute("isBootRunning") && null != session.getAttribute("istest1Running")  && null != session.getAttribute("istest2Running")){ 
            yourLogic(session);//compute your logic for not null values
        }
        else{
            session.setAttribute("isBootRunning", "");
            session.setAttribute("istest1Running", "");
            session.setAttribute("istest2Running", "");

            yourLogic(session);//compute your logic for null values
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

private void yourLogic(HttpSession session) {
    File f1 = new File("myfirstpath");//this directory is visible for 10 mins only 
    File f2 = new File("mythirdpath");//this directory is visible for 10 mins only
    File f3 = new File("mythirdpath");//this directory is visible for 10 mins only

    String isBootRunning = (String)session.getAttribute("isBootRunning");
    String istest1Running = (String)session.getAttribute("istest1Running");;
    String istest2Running = (String)session.getAttribute("istest2Running");;
    if (f1.exists() && f1.isDirectory()) {
        session.setAttribute("isBootRunning", "Running");
        session.setAttribute("istest1Running", "Scheduled");
        session.setAttribute("istest2Running", "Scheduled");
    } else if(f2.exists() && f2.isDirectory()){
        session.setAttribute("istest1Running", "Scheduled");
        session.setAttribute("istest2Running", "Scheduled");
        if(isBootRunning=="Running"){
            //here my logic
        }
    } else if(f2.exists() && f2.isDirectory()){
        session.setAttribute("istest2Running", "Scheduled");
        istest2Running = "Running";
        if(isBootRunning=="Running"){
            //here my logic
        }
        if(istest1Running=="Running"){
            //here my logic
        }
    }
}

这里,您的String对象存储在会话对象中。并且使用会话是非常安全的,因为会话管理是在您的Web容器中完成的,并且它永远不会破坏用户的完整性 这将阻止对象的初始化以供以后的请求使用。

答案 1 :(得分:0)

你必须写来获取变量:

    String isBootRunning = (String) getServletContext().getAttribute("isBootRunning");

您必须写入设置变量:

    getServletContext().setAttribute("isBootRunning", isBootRunning);

答案 2 :(得分:-1)

另一件事是当前的设计非常糟糕(可能的竞争条件)。应用程序/ Web容器是多线程的。由于您没有使用任何sychonronization,当另一个线程提供请求时,您可能看不到结果。

相关问题