最近有一個項目要上,決定struts2+hibernate+spring開發,可現在AJAX如火如荼,而且功能上也大大方便了程序員開發和WEB頁面,如果不用,太對不起Jesse James Garrett(AJAX的創始人)。可我以前一直是做后臺的開發,對前臺的JS知識是鳳毛麟角,直接嘗試用AJAX,時間、精力浪費不起。后來,在與一同事聊天時,提到了prototype.js,說學會了這個,AJAX將成囊中之物,姑且對他的話持保留態度。但在看了這個JS的源碼后,真是的柳暗花明又一村。
prototype.js是什么?
讓我來告訴你,prototype.js是由Sam Stephenson寫的一個javascript類庫。這個構思奇妙,而且兼容標準的類庫,能幫助你輕松建立有高度互動的web2.0特性的富客戶端頁面。
如果你最近嘗試使用它,你大概了解到文檔并不是作者的一個強項。和在我以前使用這個類庫的不少開發者一樣,一開始,我不得不一頭扎進閱讀prototype.js的源代碼和實驗它的功能中。因此,如果你是偷懶者,可以在GOOGLE里搜索關于它的東西。
開始創建項目
項目介紹:項目中使用了struts2,spring IOC,主要完成了一個無刷新檢測用戶名是否已經在數據庫中注冊的簡單功能。
本文重點介紹prototype.js,因此關于struts2的東西,將不重點講解。
首先看一下,struts2的配置文件:
- <action name="register" method="register" class="userAction">
- <result>/register_success.jspresult>
- <result name="input">/register.jspresult>
- action>
- <action name="check" method="check" class="userAction">
- action>
可以看到這里有兩個Action,“register”是用戶提交注冊的,“check”是為用戶名檢測預留的。兩個Action的方法都是在userAction中,而這個類交給了spring來管理,看以下代碼:
- <bean id="userAction" class="com.caitong.pingou.action.UserAction"
- autowire="byName">
- bean>
然后,我們再看一下userAction的東西吧。
java 代碼
- public class UserAction extends ActionSupport {
-
- private User user;
- public User getUser() {
- return user;
- }
-
- public void setUser(User user) {
- this.user = user;
- }
-
- public String execute(){
- return null;
- }
-
-
-
-
-
- public void check(){
- HttpServletResponse response = ServletActionContext.getResponse();
- HttpServletRequest request = ServletActionContext.getRequest();
-
- response.setContentType("text/xml;charset=utf-8");
- response.setHeader("Cache-Control","no-cache");
-
- String name = request.getParameter("user.username");
-
- String msgStr="";
- boolean flag = name.equals("abc");
- if(flag){
- msgStr ="對不起,此用戶名已經存在,請更換用戶名";
- }
- else{
- msgStr ="用戶未被注冊,可以使用!";
- }
-
- try{
- response.getWriter().print(msgStr);
- response.getWriter().close();
- }catch(IOException e){
- e.printStackTrace();
- }
- }
-
-
-
-
-
- public String register(){
- if(!abc".equals(user.getUsername()){
- save(User);
- else
- return INPUT;
- reutrn SUCCESS;
- }
基本上在類里已經注釋過了,自己的工程是通過服務層來判斷用戶是否已經注冊過,其中服務層又是調用DAO層,所有的CLASS都交給SPRING來管理,其中標識偽代碼的部份,有興趣的人,可以自己試著寫一下,從數據庫取數據,然后判斷。
最后一起看一下WEB層的register.jsp,prototype將粉墨登場
js 代碼
- <%@ page contentType="text/html; charset=utf-8" %>
- <%@ taglib prefix="s" uri="/struts-tags"%>
-
- <html>
- <head>
- <title>注冊</title>
- <script language="JavaScript" type="text/javascript"
- src="js/prototype.js"></script>
- <script language="JavaScript">
- function showResponse(originalRequest){
- Element.hide($('load'));
- alert(originalRequest.responseText);
- Form.reset($('register'));
- Field.focus($('user.username'));
-
- }
- function showDiv(){
- Element.show($('load'));
- }
-
- function check(){
- var pars=Form.Element.serialize($('user.username'));
- var url='check.action';
-
- if($F('user.username')==""){
- alert("請輸入姓名!");
- return false;
- }
- else{
- var myAjax = new Ajax.Request(
- url,{method:'get',
- parameters:pars,
- onLoading:showDiv,
- onComplete:showResponse,
- onFailure:reportError});
- }
- }
- function reportError(){
- alert('嚴重故障,請重試!');
- }
-
-
- </script>
-
- <s:head/>
- </head>
-
- <body>
- <center>
- <br/><br/><br/><br/><br/><br/><br/><br/>
- <p><div id="load" style="display:none">正在驗證用戶名,請稍后……</div></p>
-
- <s:form action="regiseter" method="post">
- <s:textfield name="user.username" label="UserName"></s:textfield>
- <input type="button" value="檢測!" onClick="check()"/>
- <s:textfield name="user.password" label="PassWord"></s:textfield>
- <s:textfield name="user.age" label="Age"></s:textfield>
- <s:textfield name="user.sex" label="Sex"></s:textfield>
- <s:submit></s:submit>
- </s:form>
- </center>
-
- </body>
- </html>

]]>