Leif160519的blog Leif160519的blog

——————

目录
Struts2+Ajax实现检测用户名是否唯一
/      

Struts2+Ajax实现检测用户名是否唯一

转载自:http://www.cnblogs.com/xuehanlee/p/4541276.html

代码块

Action:

package com.bbs.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;

import com.bbs.model.*;
import com.opensymphony.xwork2.*;

@SuppressWarnings("serial")
public class CheckUser extends ActionSupport {
    //private String username;
    public String execute() throws Exception {
        HttpServletRequest req = ServletActionContext.getRequest();
        HttpServletResponse res = ServletActionContext.getResponse();
        String username = req.getParameter("username");
        res.setContentType("text/html;charset=UTF-8");
        String responseStr = "";
        UserDAO udao = new UserMySQLDAO();
        if (udao.ValiUserByName(username)) {
            res.getWriter().print("exists");
        } else {
            responseStr = "你可以使用该用户名";
            res.getWriter().print(responseStr);
        }
        return null;
    } 
   }

这里第一行的package是我自己定义的Action包。网上有好多例子是JavaScript与JSP通信或者Servlet通信,但是鲜有与Action传递参数的例子。但我就是想让JSP做纯粹是展现的东西,并且如果再加上Servlet话,会破坏原有的MVC清晰架构,所以在这一点上,我相信自己的坚持是对的。

至于怎么检测用户名是否在数据库中存在,这就是一个很easy的问题了,此处就不讲了,重点讲一下我是怎么架构的,其他无关紧要的细节,或者一搜就能搜到的解释,本着简明扼要的原则,一概忽略之。

JavaScript:

var req;
var span;
function Check(field) {
    span = document.getElementById("result");
    if(field.value == '') {
        span.style.color = "red";
        span.innerHTML="用户名不能为空";
        return false;
    }    
    if(window.XMLHttpRequest) {   //其他非IE浏览器支持
        req = new XMLHttpRequest();
    }else if(window.ActiveXObject) { //微软的IE支持
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    req.onreadystatechange = press;
    req.open("POST", "CheckUser?username="+field.value, true);
    req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    req.send("");
}

function press() {
    if(req.readyState < 4) {
        span.style.color = "blue";
        span.innerHTML="正在检测";
    }
    if(req.readyState == 4) {
        if(req.status == 200) {
            if(req.responseText == "exists") {
                span.style.color = "red";
                span.innerHTML="用户名已经存在";
            }else {
                span.style.color = "green";
                span.innerHTML="您可以使用该用户名";
            }            
        }
    }
}

这一段代码是用来实现Ajax用户名检测的部分。第5-9行是检测用户名为空的代码,很好理解。重点是后面的部分。首先,建立一个XMLHttpRequest对象,这是实现Ajax的核心部分,只有用它才能用来

向后台发送请求,发送请求分两步:打开连接,发送请求。

打开连接用open方法。

open方法的原型 open("method","URL",[,asyncFlag[,"userName"[,"password"]]]);

method:POST/GET。这两种方法的区别就不详细介绍了,到处都有介绍。需要注意一点是:必须要有双引号,我就因为没加引号,找了半天才找到原因,汗。

asyncFlag:true代表异步,一般情况下我们应该选择这个;false代表同步。

后面的username和password则专用于一些远程服务。

发送请求用send方法。

send(content);//content 是请求参数。一般情况下可以省略。

setRequestHeader():在发送之前要设置请求头。

onreadystatechange参数用来设置相应的回调函数。

后面的press就是那个回调函数。

关于status的各种解释此处从略。

这里的span就是用来在用户名输入框后面做语句展现的。

HTML&JSP:

<input  id="regusername" type="text" name="username" size="50" maxlength="12" value=""  autocomplete="off" onblur="Check(this)"/>    
<span id = "result"></span>  

struts.xml

<package name="server" namespace="/"  extends="struts-default">
         <action name="CheckUser" class="com.bbs.action.CheckUser">
             <result name="success">Welcome.jsp</result>
             <result name="input">Register.jsp</result>
          </action>
</package>

其实此处的result部分,无所谓了,因为注意一下前面的Action最后返回的是null,为什么是null呢?因为前面的JavaScript部分,有一句是利用responseText与字符串比较来产生不同的效果。

如果是success或者input的话,会直接将跳转后的页面(Welcome.jsp/Register.jsp)返回过来。此处又折腾了半天,汗。

另外虽然好多资料都讲到responseText是一个字符串,但是实际上,不能完全按照字符串的处理方法去处理他,刚开始我用equals函数,没有反应,后来改成==才能达到效果。


“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill

标  题Struts2+Ajax实现检测用户名是否唯一
作  者Leif160519
出  处https://github.icu/articles/2019/08/23/1566542567306.html
关于博主:坐标南京,运维工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!