零基础学Struts
上QQ阅读APP看书,第一时间看更新

10.2 传统Web应用与Ajax应用对比

基于Ajax的Web应用于传统Web应用的最大优势在于Ajax提供的强大的用户体验。下面使用传统Web应用实现用户登录案例,以及使用Ajax技术实现用户登录,并说明传统Web应用与Ajax应用对比。

10.2.1 传统Web应用实现用户登录

下面使用传统Web应用实现用户登录判断。其代码和以前写的登录代码没有很大的改动。首先新建登录页面,该登录页面同时包含登录表单以及登录结果判断。如果用户登录成功则弹出登录成功提示框,否则弹出登录失败提示框,代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
        <html>
        <head>
              <title>用户登录</title>
        </head>
        <body>
              <%
                    String result = (String)session.getAttribute("login");
                    //判断用户是否合法
                    if(result ! = null && result ! = ""){
                            if(result.equals("true")){
                                  out.println("<script>window.alert(’登录成功!' )</script>");
                            }else{
                                  out.println("<script>window.alert(’对不起,登录失败!' )</script>");
                                }
                                session.invalidate();
                          }
                  %>
                  <center>
                          <h2>简单同步登录</h2><hr>
                          <%--登录表单--%>
                          <form action="Login" method="post">
                                <table>
                                        <tr>
                                            <td>用户名:</td>
                                            <%--接收用户输入的用户名,其name属性为uname--%>
                                            <td><input type="text" name="uname"></td>
                                        </tr>
                                        <tr>
                                            <%--接收用户输入的密码,其name属性为upassword--%>
                                            <td>&nbsp; &nbsp;码:</td>
                                            <td><input type="password" name="upassword"></td>
                                        </tr>
                                        <tr>
                                            <td colspan="2">
                                            <%--登录按钮和重置按钮--%>
                                            <input type="submit" value="登录">
                                            <input type="reset" value="重置">
                                            </td>
                                        </tr>
                                </table>
                          </form>
                  </center>
            </body>
            </html>

新建登录判断Servlet,该Servlet通过调用业务逻辑类来判断用户的合法性。如果用户合法,则在session范围中添加属性login,其属性值为true,否则设置其属性值为false,代码如下所示。

        package net.hncu.servlet;
        import java.io.IOException;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import javax.servlet.http.HttpSession;
        import net.hncu.service.LoginCheck;
        public class LoginConf extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                          throws ServletException, IOException {
                    //接收用户参数
                    String name = request.getParameter("uname");
                    String password = request.getParameter("upassword");
                    //new一个LoginCheck对象
                    LoginCheck lc = new LoginCheck();
                    String target = "";
                    HttpSession session = request.getSession();
                    //调用业务逻辑组件的判断功能来判断
                    if(lc.isLogin(name, password)){
                          //如果为合法用户,在session范围中添加属性login,其属性值为true
                          session.setAttribute("login", "true");
                          target = "login.jsp";
                    }else{
                          //如果为非法法用户,在session范围中添加属性login,其属性值为false
                          session.setAttribute("login", "false");
                          target = "login.jsp";
                    }
                    //使用重定向跳转(客户端跳转)
                    response.sendRedirect(target);
              }
              public void doPost(HttpServletRequest request, HttpServletResponse response)
                          throws ServletException, IOException {
                    doGet(request, response);
              }
        }

新建业务逻辑组件,判断用户合法性,代码如下所示。

        package net.hncu.service;
        public class LoginCheck {
              //判断是否为合法用户
              public boolean isLogin(String name, String password){
                    if("xiaoqiang".equals(name)&&"xiaoqiang".equals(password)){
                            return true;
                    }else{
                            return false;
                    }
              }
        }

运行登录页面,输入合法的用户信息,单击“登录”按钮进行登录,如图10.5所示。

通过页面进度条可以看出,整个页面在执行刷新操作。同样,当输入非法的用户信息进行提交时,页面同样执行了刷新,如图10.6所示。

图10.5 登录成功

图10.6 登录失败

10.2.2 使用Ajax技术实现用户登录

下面来看如何使用Ajax技术实现用户登录。只需修改建登录判断Servlet,通过判断用户的合法性来输出不同的XML文件代码,代码如下所示。

        package net.hncu.servlet;
        import java.io.IOException;
        import java.io.PrintWriter;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import javax.servlet.http.HttpSession;
        import net.hncu.service.LoginCheck;
        public class LoginConf extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                          throws ServletException, IOException {
                    //设置接收信息的字符集
                  request.setCharacterEncoding("UTF-8");
                    //接受用户参数
                    String name = request.getParameter("uname");
                    String password = request.getParameter("upassword");
                    //new一个LoginCheck对象
                    LoginCheck lc = new LoginCheck();
                    response.setContentType("text/xml; charset=UTF-8");
                    response.setHeader("Cache-Control", "no-cache");
                    //创建输出流对象
                    PrintWriter out = response.getWriter();
                    //依据验证结果输出不同的数据信息
                    out.println("<response>");
                    //调用业务逻辑组件的判断功能来判断
                      if(lc.isLogin(name, password)){
                            //如果为合法用户
                            out.println("<date>" + "登录成功!" + "</date>");
                      }else{
                            //如果为非法法用户
                            out.println("<date>" + "对不起,登录失败!" + "</date>");
                      }
                      out.println("</response>");
                      out.close();
                }
                public void doPost(HttpServletRequest request, HttpServletResponse response)
                            throws ServletException, IOException {
                      doGet(request, response);
              }
          }

修改用户登录页,该页面通过XMLHttpRequest对象向服务器发送请求,并处理服务器返回的结果,代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
        <html>
        <head>
            <title>用户登录</title>
        </head>
        <script language="javascript">
            var XMLHttpReq = false;
            //创建XMLHttpRequest对象
            function createXMLHttpRequest() {
            //Mozilla 浏览器
                  if(window.XMLHttpRequest) {
                        XMLHttpReq = new XMLHttpRequest();
                  }
                  // IE浏览器
                  else if (window.ActiveXObject) {
                        try {
                              XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
                        } catch (e) {
                              try {
                                      XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
                              } catch (e) {}
                        }
                  }
            }
            //发送请求函数
            function sendRequest(url) {
          createXMLHttpRequest();
          XMLHttpReq.open("GET", url, true);
          //指定响应函数
          XMLHttpReq.onreadystatechange = processResponse;
          // 发送请求
          XMLHttpReq.send(null);
    }
    // 处理返回信息函数
    function processResponse() {
    if (XMLHttpReq.readyState == 4) { // 判断对象状态
          if (XMLHttpReq.status == 200) { // 信息已经成功返回,开始处理信息
                var res=XMLHttpReq.responseXML.getElementsByTagName("date")[0].firstChild.data;
                    window.alert(res);
              } else {
                  window.alert("您所请求的页面有异常。");
              }
        }
    }
    // 身份验证函数
    function userCheck() {
            var uname = document.myform.uname.value;
            var psw = document.myform.upassword.value;
            if(uname=="" —— upassword=="") {
                  window.alert("用户名或密码不能为空。");
                  document.myform.uname.focus();
                  return false;
            }
            else {
                  sendRequest(' Login? uname=' + uname + ' &upassword=' + psw);
            }
}
</script>
<body>
    <center>
          <h2>Ajax异步登陆</h2><hr>
          <%--登录表单--%>
          <form action="Login" method="post" name="myform">
                <table>
                  <tr>
                          <td>用户名:</td>
                          <%--接收用户输入的用户名,其name属性为uname--%>
                          <td><input type="text" name="uname"></td>
                  </tr>
                  <tr>
                          <%--接收用户输入的密码,其name属性为upassword--%>
                          <td>&nbsp; &nbsp;码:</td>
                          <td><input type="password" name="upassword"></td>
                  </tr>
                              <tr>
                                      <td colspan="2">
                                      <%--登录按钮和重置按钮--%>
                                      <input type="button" value="登录" onclick="userCheck()">
                                      <input type="reset" value="重置">
                                      </td>
                              </tr>
                            </table>
                      </form>
                </center>
          </body>
          </html>

运行登录页面,输入合法的用户信息,单击“登录”按钮进行登录,如图10.7所示。

通过页面进度条可以看出,整个页面并没有在执行刷新操作。页面并没有执行刷新操作,而只是在页面中输出了登录的结果。同样当输入非法的用户信息进行提交,页面同样没有执行刷新,如图10.8所示。

图10.7 登录成功