对Servlet的AJAX调用无法在Session对象中存储值

时间:2018-03-11 18:28:44

标签: java ajax jsp servlets javamail

我有一个Java Web应用程序,页面ReceiveMail.jsp显示一个进度条,指示已收到多少封电子邮件。页面上的Refresh按钮对名为EmailRecServlet.java的servlet进行AJAX调用。

两个文件的代码如下

ReceiveMail.jsp JavaScript函数,它向servlet提供AJAX调用:

  <head>
    <script type="text/javascript">
        var requestObj = false;

        if (window.XMLHttpRequest) {
            requestObj = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            requestObj = new ActiveXObject("Microsoft.XMLHTTP");
        }

        function getUpdates()
        {
            if (requestObj) {
                requestObj.open("GET", "http://localhost:8084/AyreonDepartmentManager/EmailRecServlet/*");
                requestObj.onreadystatechange = function ()
                {
                    if (requestObj.readyState == 4 && requestObj.status == 200) {
                           document.getElementById("progressbar").value = requestObj.responseText;
                           if(document.getElementById("progressbar").value == 3) {
                               window.location.href = "abc.jsp";
                           }
                    }
                }
                requestObj.send(null);
            }
        }

    

EmailRecServlet.java是Servlet文件:

public class EmailRecServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        HttpSession session = request.getSession();
        ServletContext context = request.getServletContext();
        final String user = context.getInitParameter("user");
        final String password = context.getInitParameter("pass");
        int oldinboxsize = Integer.parseInt(context.getAttribute("Old Inbox Size").toString());

        //1) get the session object  
        Properties properties = new Properties();
        properties.put("mail.store.protocol", "imaps");  
        Session emailSession = Session.getDefaultInstance(properties,
                new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, password);
            }
        });

        //2) create the POP3 store object and connect with the pop server  
        Store emailStore = emailSession.getStore("imaps");
        emailStore.connect("imap.gmail.com", user, password);

        //3) create the folder object and open it  
        Folder emailFolder = emailStore.getFolder("INBOX");
        emailFolder.open(Folder.READ_ONLY);

        //4) retrieve the messages from the folder in an array and print it  
        Message[] messages = emailFolder.getMessages();
        int msgindex = 0;
        int newinboxsize = messages.length;
        if (newinboxsize > oldinboxsize) {
                for(int i = 1; i <= (newinboxsize-oldinboxsize); i++) {
                    msgindex = messages.length-i;
                    Message message = messages[msgindex];
                    BodyPart clearTextPart = null;
                    out.write("Forming Message");
                    if (message instanceof MimeMessage) {
                        MimeMessage m = (MimeMessage) message;
                        Object contentObject = m.getContent();
                        if (contentObject instanceof Multipart) {
                            clearTextPart = null;
                            Multipart content = (Multipart) contentObject;
                            int count = content.getCount();
                            for (int j = 0; j < count; j++) {
                                BodyPart part = content.getBodyPart(j);
                                if (part.isMimeType("text/plain")) {
                                    clearTextPart = part;
                                    out.println("clearText obtained");
                                    out.println("clearText is : ");
                                    out.println(clearTextPart.getContent().toString());
                                }
                            }
                            session.setAttribute((message.getFrom()[msgindex].toString()), (String) clearTextPart.getContent());
                            out.println("written into session");
                        }
                    }
                }
                String difference = Integer.toString(newinboxsize - oldinboxsize);
                out.write(difference);
            }
        //5) close the store and folder objects  
        emailFolder.close(false);
        emailStore.close();
        }
        catch(MessagingException e) { e.printStackTrace(); }
        catch(IOException e) { e.printStackTrace(); }
        catch(Exception e) { e.printStackTrace(); }
    }
}

我得到的错误是AJAX调用正常工作,但是当控件在servlet中时它只执行直到行:

out.println(clearTextPart.getContent().toString());

因此,我的进度条也保持为0并且没有进展以反映我收到的新电子邮件。

在IE调试器的“网络”选项卡中查看时,该特定请求的响应正文显示空字符串。 什么可能导致错误?我该如何删除此错误?如何将电子邮件内容放入我的Session对象,以便我可以在JSP页面上访问它?

请帮帮我。

1 个答案:

答案 0 :(得分:0)

错误已解决。对我有用的是:

session.setAttribute((message.getFrom()[0].toString()), (String) clearTextPart.getContent());