1

I am prototyping a database manager web-app. After successful login, the app needs to navigate to database manager view (dbmanager.html). However, the requested page does not show in the browser.

Environment is Windows 10, Apache-Tomcat-7.0.94, Glassfish 4, MySql 5.7.24.

login.html

    <form id="login_form" name="login_form" action="LogIn"
      method="post" onsubmit="formPost(this);return false;">
        <fieldset>
            <!-- more fields here -->
            <input id="input_login" value="Login" type="submit" >
        </fieldset>
        <p id="mesg" style="color: red;"></p>
    </form>

LogIn.java

    @WebServlet(name = "LogIn", urlPatterns = { "/LogIn" })
    @MultipartConfig
    public class LogIn extends HttpServlet {
        protected void doPost(
            HttpServletRequest request,
            HttpServletResponse response
        ) throws ServletException, IOException {

        //get the inputs, customized method getParameter
        String user = getParameter("user");
        String password = getParameter("password");

        //validate inputs
        String errorMsg = null;
        if(user == null || user.equals("")){
            errorMsg ="User can't be null or empty";
        }
        if(password == null || password.equals("")){
            errorMsg = "Password can't be null or empty";
        }

        //show error, if so
        if(errorMsg != null){
            response.setContentLength("#mesg=".length() + errorMsg.length());
            PrintWriter out= response.getWriter();
            out.println("#mesg=" + errorMsg);
            return;
        }


        //no errors, forward / redirect to next page
        request.getRequestDispatcher("/contents/dbmanager.html")
         .forward(request, response);

    }

    protected void doGet(
        HttpServletRequest request,
        HttpServletResponse response
    ) throws ServletException, IOException {
        request.getRequestDispatcher("/contents/dbmanager.html")
            .forward(request, response);
    }

}

JavaScript (No jQuery)

    function formPost(_form){
        var xhr = new XMLHttpRequest();
        xhr.open(_form.method, _form.action);
        xhr.onload = function(event){
            event.preventDefault(); // Important! Prevents submitting the form.
            var response = event.target.response;
            //process response...
            console.log(response);
            //response is a array of string of structure {id=value}
            var idMark = response.indexOf("#");
            if( isNaN(idMark) ){
              return;
            }
            if(idMark !== 0){
              return;
            }
            //other validations here...
        };
        // or onerror, onabort
        var formData = new FormData(_form);
        xhr.send(formData);
    }
Rahul Kadukar
  • 858
  • 3
  • 15
  • 35
b_rc93
  • 11
  • 3
  • @Rahul Kadukar, Thanks for the edits. the
    – b_rc93 Jun 29 '19 at 02:45
  • You can `redirect` to some page in your ajax after you get `successful` response from servlet. – Swati Jun 29 '19 at 03:44
  • @Swati, thanks for the suggestion. I tried that, code sample below... `if(response === "#redirect"){ var value = getValue(response); if( value !== null ) { window.location.replace(value); } }`. It works, but need to know why would `response.getRequestDispatcher().forward()` not navigate to requested html. – b_rc93 Jun 29 '19 at 14:44
  • Because you are using `ajax` and it need some response back , that’s why you need to return back to page where you have ajax call after doing some operation in your `requested page` . You can redirect directly to requested page at server-side but in that case you cannot use ajax – Swati Jun 29 '19 at 14:58
  • @Swati quite true, the `var xhr = new XMLHttpRequest();` starts a new thread and response comes back in that thread. So reading a pre-formatted (formatted in servlet) response and using it for replacing current url - is an alternative. But i need HTTPSession to carry on to next html page. My HTTPSession object has the successful user Connection object that I need shared for all pages and servlets. No cookies pls! Thats why I need response.getRequestDispatcher().forward(). – b_rc93 Jun 30 '19 at 03:14
  • `Httpsession` will remain set even you go to that `html page` from your ajax. – Swati Jun 30 '19 at 13:24
  • @Swati, thanks for the info. Did some changes in the code and tested. Seems like it now works for me. – b_rc93 Jul 03 '19 at 04:21

1 Answers1

0

I set up following code in DBManager servlet and updated the JS.

The Servlet

@WebServlet(name = "DBManager", urlPatterns = { "/DBManager" })
@MultipartConfig
public class DBManager extends HttpServlet {

   private static final long serialVersionUID = 1L;

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      System.out.print("DBManager dG conx:");
      Connection conx =
         (Connection) ((HttpSession)LogIn.getHTTPSession()).getAttribute("Connection");
      System.out.println(conx.toString());
   }
}

I am pulling the Connection object from LogIn servlet where it was created.

The edited JS

function onload(){
    //alert("win.loc:"+window.location);
    var url = window.location;
    var pageName = url;
    if(url===null || pageName===null) {return;}

    url = url.toString();

    //other logic go here

    if(pageName === "dbmanager"){
        processGet(url);
    }

}
function processGet(url){
    alert("processGet url="+url);
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            var data = xhr.responseText;
            alert("DBManager xhr.responseText:"+data);
        }
    }
    xhr.open('GET', 'DBManager', true);
    xhr.send(null);
}

Result in System.out prints like...

LogIn dP con=com.mysql.cj.jdbc.ConnectionImpl@1df9967
DBManager dG conx:com.mysql.cj.jdbc.ConnectionImpl@1df9967

Works for me.

b_rc93
  • 11
  • 3