一个简单的登陆列子 输入 ID 密码 登陆
如果输入错误 返回登陆界面 并提示错误
如果登陆成功 跳到成功界面其实这个东西 拿Struts来做很简单 
但是这里我想改进一下
1. 如果登陆成功的话那么跳到成功页面 (这里没有什么异议)
2. 如果登陆不成功的话 那么会回到登陆页面 这里就有个问题
   如果 使用Struts的话 那么就会有个刷新的效果 所以我想在这个步骤这里用Ajax的无刷新效果代替也就是说 这个例子我想使用Struts+ajax来完成一次登陆操作
想达到的效果是 
1 成功登陆 ----> 跳转到成功页面
2 登陆失败 ----> 利用Ajax的无刷新效果提示错误部分代码如下先声明 代码都为正确 自己也近过调试
index.jsp
<tr>
          <td align=center>
            <table border=0 cellpadding=0 cellspacing=0 bgcolor="#ffffff">
              <tr>
                <td align=right><bean:message key="login.uname" /></td>
                <td>
                <html:text property="uname" size="20" maxlength="20" value="" styleClass="login_input"></html:text>
                </td>
              </tr>
              <tr>
                <td align=right><bean:message key="login.upass" /></td>
                <td>
                 <html:text property="upass" size="20" maxlength="20" value="" styleClass="login_input"></html:text>
                </td>
              </tr>
            </table>
          </td>
        </tr>
        <tr>
          <td height=10></td>
        </tr>
        <tr>
          <td align=center>
                                     <!-- 这个按钮调用了JS的方法 利用Ajax进行数据传送 -->
           <html:button property="submit" onclick="userCheck()">
           <bean:message key="login.submit"/>
           </html:button>
            
           </td>
        <tr>
下面的是Ajax相关的部分代码function userCheck() 
{
        name = document.loginForm.uname.value;
pass = document.loginForm.upass.value;
sendRequest("login.do?name="+name+"&pass="+pass);
}
//其他XMLHttpReq声明函数 以及 发送请求函数 省去 以下是 处理返回信息函数    function processResponse() {
     if (XMLHttpReq.readyState == 4) { // 判断对象状态  
         if (XMLHttpReq.status == 200) { // 信息已经成功返回,开始处理信息
            if(XMLHttpReq.responseXML.getElementsByTagName("res")[0]!=null)
  {
                 var res=XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;
                    window.alert(res);
                  }
                } else { //页面不正常
                window.alert("页面不正常");
            }
        }
    }
下面是的我的Action 
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String uname = request.getParameter("name");
String upass = request.getParameter("pass");
System.out.println(uname+"***"+upass);
        
        PrintWriter out;
try {
out = response.getWriter(); if(uname.equals("sa")&&upass.equals("sa"))
{
                              //如果登陆成功那么跳转到成功页面
return mapping.findForward("done");
}
else
{
                              //如果失败 那么返xml格式的信息
response.setContentType("text/xml; charset=UTF-8");
                response.setHeader("Cache-Control", "no-cache");
                out.print("<response>");
                out.println("<res>");
out.println("Error!!");
out.println("</res>");
out.print("</response>");

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

return null;

}运行以后 输入错误后登陆后
alert()显示"Error!"
但是我输入正确时 没有跳转反应我自我总结了一下
也许是Ajax的特性 
如果是通过Ajax传数据过去 那么一定要接收回来
无论Action里面的有无跳转
也许大家会说  这个可以直接使用 Struts来做 LZ你画蛇添足了
确实 这仅仅只是一个试验 而我想使用Struts+Ajax来实验一下
因为我感觉Ajax是一个类似组件的东西 所以应该可以随意安插在程序里面有人说 LZ那你可以使用Ajax 到Servlet来做啊 
这样可以 但是我觉得 如果一个程序使用了Struts 那么还有必要去使用Servlet吗?希望能够引起大家的相关讨论看能不能使用Struts+Ajax来实现我想要的功能 

解决方案 »

  1.   

    你成功之后的跳转代码在哪里?我怎么没看到在Ajax里面有啊??
      

  2.   

    没看见你成功了后done到哪里了....
      

  3.   

    既然这样 那action都返回null 
    判断成功以后out.println(mapping.findForward("done").getPath()) 跳转就交给AJAX的JS代码咯
      

  4.   

    你成功之后的跳转代码在哪里?我怎么没看到在Ajax里面有啊??老紫竹 和 大家请看这   <action-mappings >
        <action
          attribute="loginForm"
          name="loginForm"
          path="/login"
          scope="request"
          type="cn.suiyang.struts.action.LoginAction" >
          <forward name="done" path="/2.jsp"></forward>
        </action>

    这是struts-config.xml
      

  5.   

    老紫竹 和 大家的意思是 
    让我在js里面用location.href进行跳转??
      

  6.   


    struts只用mapping.findForward("done").getPath()读配置中的"/2.jsp"
    ajax回调处理后交给location.href跳转
    既然错误是用的JS来处理的话,用来JS跳转也更符合程序的一致性了
    目前我只想到这种方法 期待其他高手提供更好的解决方案
      

  7.   

    8L的朋友 要是这样的话 那我大可不必mapping.findForward("done").getPath()传递回去了
    我直接传递一个字符串回去然后在Ajax的响应函数里面做字符串判断
    在用location.href进行跳转
      

  8.   

    希望有经验的达人们多多指点你们平时这样的问题是怎么处理的?在什么情况下使用ajax在什么情况下又使用struts+ajax呢?
      

  9.   

    你这个明显有问题,你的登陆判断是用ajax去get请求调用login.do,当登陆成功时login.do向XMLHttpReq这个对象返回了2.jsp这个servlet执行的结果,也就是说成功时XMLHttpReq得到了一个网页,而不是XMLHttpReq期待的xml,这显然不是你的初衷。看来楼主对ajax理解有误。
      

  10.   

    那请问 我这个应该如何去修改呢? function processResponse() {
            if (XMLHttpReq.readyState == 4) { // 判断对象状态          
                if (XMLHttpReq.status == 200) { // 信息已经成功返回,开始处理信息
                   if(XMLHttpReq.responseXML.getElementsByTagName("res")[0]!=null)
              {
                        var res=XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;
                        window.alert(res);
                      }
                    } else { //页面不正常
                    window.alert("页面不正常");
                }
            }
        }
    这个不是回凋函数吗?
      

  11.   

    var res=XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data; 
    self.location=""; // 这样写难道不好吗?
    window.alert(res); 
      

  12.   

    你注意一下。 你的代码是Ajax调用,你的action就算转10000次,对结果都不会产生任何影响,因为Ajax只返回最后页面的结果文字。所以,跳转的事情,还是用js自己实现了!
      

  13.   

    Ajax只返回最后页面的结果文字。 
      

  14.   

    知道了 ajax传过去一定要接收回来 
      

  15.   

    Action最后又一个return null,我们读程序,可以想到,if()以后,还要接着执行代码,那么应该是调转以后又因为rerurn null出了问题,我也没有测试,仅仅是我个人的看法。
      

  16.   

    那这我样用js跳我的request里面的用户名和密码的信息是不是就没有了?