本篇示範註冊頁面整合 jQuery:使用者輸入帳號時即時發送 AJAX 請求驗證長度與唯一性,後端回傳純文字提示,前端動態顯示並控制提交按鈕狀態。
CREATE TABLE user (
ID INT AUTO_INCREMENT PRIMARY KEY,
LOGIN_NAME VARCHAR(25),
PASSWORD VARCHAR(25)
);
public class User {
private int id;
private String loginName, password;
// getter/setter 省略
}
<sqlMap namespace="User">
<typeAlias alias="User" type="cn.simple.pojo.User"/>
<resultMap id="UserResult" class="User">
<result property="id" column="ID"/>
<result property="loginName" column="LOGIN_NAME"/>
<result property="password" column="PASSWORD"/>
</resultMap>
<select id="selectUserByLoginName" parameterClass="String" resultClass="User">
SELECT ID as id, LOGIN_NAME as loginName, PASSWORD as password FROM user WHERE LOGIN_NAME=#loginName#
</select>
<insert id="insertUser" parameterClass="User">
INSERT INTO user (LOGIN_NAME, PASSWORD) VALUES (#loginName#, #password#)
</insert>
</sqlMap>
記得在 SqlMapConfig.xml 加入 <sqlMap resource="cn/simple/pojo/User.xml"/>。
public class UserManager {
private static SqlMapClient sqlMapper;
static { /* 初始化 sqlMapper */ }
public static User selectUserByLoginName(String loginName) throws SQLException {
return (User) sqlMapper.queryForObject("selectUserByLoginName", loginName);
}
public static void insertUser(User user) throws SQLException {
sqlMapper.insert("insertUser", user);
}
}
@Results({
@Result(name="success", location="register-success.jsp"),
@Result(name="input", location="registerform.jsp")
})
public class RegisterAction extends ActionSupport {
private User user;
private String loginName1; // AJAX 驗證用參數
public String execute() throws Exception {
UserManager.insertUser(user);
return SUCCESS;
}
// AJAX 即時驗證帳號
public void isExistLoginName() throws Exception {
if (loginName1.length() < 4 || loginName1.length() > 8) {
sendMsg("用戶名長度應在4-8之間!");
} else if (UserManager.selectUserByLoginName(loginName1) != null) {
sendMsg("用戶名" + loginName1 + "已存在!");
} else {
sendMsg("success");
}
}
public void sendMsg(String content) throws IOException {
ServletActionContext.getResponse().setCharacterEncoding("UTF-8");
ServletActionContext.getResponse().getWriter().write(content);
}
// getter/setter 省略
}
<script src="js/jquery-1.3.2.min.js"></script>
<script>
$(function(){
var state = false; // 全域提交狀態
$("#loginName").keyup(function(){
var loginName = $(this).val();
$.get("register!isExistLoginName.action", {loginName1: loginName}, callback);
});
function callback(msg){
if ("success" == msg) {
$("#result").html(""); state = true;
} else {
$("#result").html(msg); state = false;
}
}
$("form").submit(function(){ return state; });
});
</script>
<form action="register.action" method="post">
帳號<input type="text" id="loginName" name="user.loginName"/>
<span id="result" style="color:red;"></span><br/>
密碼<input type="password" id="password" name="user.password"><br/>
<input type="submit" value="註冊"/>
</form>
keyup 事件觸發$.get() 送至 register!isExistLoginName.action?loginName1=xxxsuccess 或錯誤訊息)callback 更新 #result 顯示區、設定 statereturn state 決定是否送出