smartgwt (B)
? 代碼實現:
將smartgwt的源代碼
導入新建的項目中 ,smartgwt提供了豐富的例子。
你會發現,源代碼有個特殊的結構:
com.smartgwt.sample.showcase.client...(用于生成客戶端的代碼)
com.smartgwt.sample.showcase.public...(編譯時,該目錄下的文件(js,圖片,css...)會被復制到生成客戶端代碼的特定位置,)
com.smartgwt.sample.showcase.server...(服務端的代碼)
盡量不要改變內容,除非你了解。
改寫 ,里面保存的是左導航的目錄結構,
data = new ExplorerTreeNode[]{new ExplorerTreeNode("系統管理", "xtgl", "root", "pieces/16/cubes_blue.png", null, true, idSuffix),new ExplorerTreeNode("用戶管理", "yhgl", "xtgl", "pieces/16/cube_blue.png", new XTYHGridTabForm.Factory(), true, idSuffix) }; 可以先注釋掉其它的目錄結構的代碼
下來分別講一下client中和server中的代碼,為了簡略,沒有細分包名,而是放在兩個包中。
client:
BaseGridForm.java(模板,方便界面通用方法的繼承)
package com.smartgwt.sample.showcase.client.mygrid; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.events.CloseClickHandler; import com.smartgwt.client.widgets.events.CloseClientEvent; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.sample.showcase.client.ShowcasePanel; public class BaseGridForm extends ShowcasePanel {protected Integer winWidth = 560;protected Integer winHeight = 190;protected IButton _saveNewBtn;protected boolean isCheck=false;public IButton addSaveBtn() {_saveNewBtn = new IButton("保存");_saveNewBtn.setIcon("icons/16/disk_blue.png");_saveNewBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) { isCheck=_addNewForm.validate();if (isCheck) {_addNewForm.saveData();_addNewForm.editNewRecord();}}});return _saveNewBtn;}protected IButton _updateBtn;public IButton addUpdateBtn() {_updateBtn = new IButton("保存");_updateBtn.setIcon("icons/16/disk_blue.png");_updateBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {if (_updateForm.validate()) {_updateForm.saveData();winUpdate.destroy();}}});return _updateBtn;}public String getDeleteMess(){return "deleteMess";}protected IButton _deleteBtn;public IButton addDeleteBtn() {_deleteBtn = new IButton("刪除");_deleteBtn.setIcon("actions/icon_delete.png");_deleteBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {if (_listGrid.getSelection().length > 0) {SC.confirm("提示", "您確定要刪除選中的 <b>"+getDeleteMess()+"</b> 嗎?", new BooleanCallback() {public void execute(Boolean value) {if (value != null && value) {_listGrid.removeSelectedData();}}});} else {SC.say("請單擊選擇要刪除的 <b>"+getDeleteMess()+"</b> !");}}});return _deleteBtn;}public String getWinUpdateTitle() {return "修改";}public String getUpdateMess(){return "updateMess";}protected IButton _updatetestBtn;protected Window winUpdate;public IButton updateTestBtn(){_updatetestBtn = new IButton("修改");_updatetestBtn.setIcon("actions/icon_edit.png");_updatetestBtn.setShowRollOver(true);_updatetestBtn.setShowDown(true);final HLayout hlayout=new HLayout();hlayout.setWidth("95%");hlayout.setAlign(Alignment.RIGHT);_updatetestBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {optionType=OptionType.Update.getOptionType();if (_listGrid.getSelection().length > 0) {getUpdateWin(hlayout);} else {SC.say("請單擊選擇要編輯的 <b>"+getUpdateMess()+"</b> !");}}});return _updatetestBtn;}public Window getUpdateWin(HLayout hlayout){winUpdate = new Window();winUpdate.setWidth(winWidth);winUpdate.setHeight(winHeight);winUpdate.setTitle(getWinUpdateTitle());winUpdate.setShowMinimizeButton(false);winUpdate.setIsModal(true);winUpdate.setShowModalMask(true);winUpdate.centerInPage();winUpdate.addCloseClickHandler(new CloseClickHandler() {public void onCloseClick(CloseClientEvent event) {winUpdate.destroy();}});winUpdate.addItem(addUpdateForm());_updateForm.editSelectedData(_listGrid);hlayout.addMember(addUpdateBtn());winUpdate.addItem(hlayout);winUpdate.show();return winUpdate;}public String getWinAddTitle() {return "新增";}public enum OptionType{/*** 0:add(新增狀態)*/Add(0),/*** 1:update(更新狀態)*/Update(1),/*** 2:delete(刪除狀態)*/Delete(2),/*** 3:search(搜索狀態)*/Search(3);private int type;public int getOptionType(){return type;}OptionType(int type){this.type = type;}}protected int optionType;protected IButton _addtestBtn;protected Window winAdd;public IButton addTestBtn(){_addtestBtn = new IButton("新增");_addtestBtn.setIcon("actions/icon_add.png");_addtestBtn.setShowRollOver(true);_addtestBtn.setShowDown(true);final HLayout hlayout=new HLayout();hlayout.setWidth("95%");hlayout.setAlign(Alignment.RIGHT);_addtestBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {optionType=OptionType.Add.getOptionType();getAddWin(hlayout);}});return _addtestBtn;}public Window getAddWin(HLayout hlayout){winAdd = new Window();winAdd.setWidth(winWidth);winAdd.setHeight(winHeight);winAdd.setTitle(getWinAddTitle());winAdd.setShowMinimizeButton(false);winAdd.setIsModal(true);winAdd.setShowModalMask(true);winAdd.centerInPage();winAdd.addCloseClickHandler(new CloseClickHandler() {public void onCloseClick(CloseClientEvent event) {winAdd.destroy();}});winAdd.addItem(addNewForm());hlayout.addMember(addSaveBtn());winAdd.addItem(hlayout);winAdd.show();return winAdd;}protected DynamicForm _addNewForm;public DynamicForm addNewForm() {_addNewForm = new DynamicForm();_addNewForm.setNumCols(4);_addNewForm.setPadding(10);_addNewForm.setDataSource(getMyDataSource());_addNewForm.setAutoFetchData(false);return _addNewForm;}protected DynamicForm _updateForm;public DynamicForm addUpdateForm() {_updateForm = new DynamicForm();_updateForm.setNumCols(4);_updateForm.setPadding(10);_updateForm.setDataSource(getMyDataSource());_addNewForm.setAutoFetchData(true);return _updateForm;}public DataSource getMyDataSource() {return XTYHDataSource.getInstance();}protected ListGrid _listGrid;public ListGrid addListGrid() {_listGrid = new ListGrid();_listGrid.setWidth(760);_listGrid.setHeight("80%");_listGrid.setDataSource(getMyDataSource());_listGrid.setAutoFetchData(true);_listGrid.setShowAllRecords(false);_listGrid.setDataPageSize(50);return _listGrid;}public void setFields(ListGridField... fields) {for (ListGridField field: fields) {field.setAlign(Alignment.CENTER);}}protected HLayout hLayoutB;protected VLayout layout;public Canvas getViewPanel() {addNewForm();addUpdateForm();layout = new VLayout(15);layout.addMember(addListGrid());hLayoutB = new HLayout();hLayoutB.addMember(addTestBtn());hLayoutB.addMember(updateTestBtn());hLayoutB.addMember(addDeleteBtn());layout.addMember(hLayoutB);layout.setWidth100();return layout;} }
GwtRpcDataSource.java(模板,方便遠程通用方法的繼承)
package com.smartgwt.sample.showcase.client.mygrid; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.types.DSDataFormat; import com.smartgwt.client.types.DSProtocol; /*** Data source with ability to communicate with server by GWT RPC.<p/>* SmartClient natively supports data protocol "clientCustom". This protocol* means that communication with server should be implemented in* <code>transformRequest (DSRequest request)</code> method. Here is a few* things to note on <code>transformRequest</code> implementation:* <ul>* <li><code>DSResponse</code> object has to be created and* <code>processResponse (requestId, response)</code> must be called to finish* data request. <code>requestId</code> should be taken from original* <code>DSRequest.getRequestId ()</code>.</li>* <li>"clientContext" attribute from <code>DSRequest</code> should be copied to* <code>DSResponse</code>.</li>* <li>In case of failure <code>DSResponse</code> should contain at least "status"* attribute with error code (<0).</li>* <li>In case of success <code>DSResponse</code> should contain at least "data"* attribute with operation type specific data:* <ul>* <li>FETCH - <code>ListGridRecord[]</code> retrieved records.</li>* <li>ADD - <code>ListGridRecord[]</code> with single added record.* Operation is called on every newly added record.</li>* <li>UPDATE - <code>ListGridRecord[]</code> with single updated record.* Operation is called on every updated record.</li>* <li>REMOVE - <code>ListGridRecord[]</code> with single removed record.* Operation is called on every removed record.</li>* </ul>* </li>* </ul>** @author Aleksandras Novikovas* @author System Tier* @version 1.0*/ public abstract class GwtRpcDataSourceextends DataSource {/*** Creates new data source which communicates with server by GWT RPC.* It is normal server side SmartClient data source with data protocol* set to <code>DSProtocol.CLIENTCUSTOM</code> ("clientCustom" - natively* supported by SmartClient but should be added to smartGWT) and with data* format <code>DSDataFormat.CUSTOM</code>.*/public GwtRpcDataSource () {setDataProtocol (DSProtocol.CLIENTCUSTOM);setDataFormat (DSDataFormat.CUSTOM);setClientOnly (false);}/*** Executes request to server.** @param request <code>DSRequest</code> being processed.* @return <code>Object</code> data from original request.*/@Overrideprotected Object transformRequest (DSRequest request) {String requestId = request.getRequestId ();DSResponse response = new DSResponse ();response.setAttribute ("clientContext", request.getAttributeAsObject ("clientContext"));// Asume successresponse.setStatus (0);switch (request.getOperationType ()) {case FETCH:executeFetch (requestId, request, response);break;case ADD:executeAdd (requestId, request, response);break;case UPDATE:executeUpdate (requestId, request, response);break;case REMOVE:executeRemove (requestId, request, response);break;default:// Operation not implemented.break;}return request.getData ();}/*** Executed on <code>FETCH</code> operation. <code>processResponse (requestId, response)</code>* should be called when operation completes (either successful or failure).** @param requestId <code>String</code> extracted from <code>DSRequest.getRequestId ()</code>.* @param request <code>DSRequest</code> being processed.* @param response <code>DSResponse</code>. <code>setData (list)</code> should be called on* successful execution of this method. <code>setStatus (<0)</code> should be called* on failure.*/protected abstract void executeFetch (String requestId, DSRequest request, DSResponse response);/*** Executed on <code>ADD</code> operation. <code>processResponse (requestId, response)</code>* should be called when operation completes (either successful or failure).** @param requestId <code>String</code> extracted from <code>DSRequest.getRequestId ()</code>.* @param request <code>DSRequest</code> being processed. <code>request.getData ()</code>* contains record should be added.* @param response <code>DSResponse</code>. <code>setData (list)</code> should be called on* successful execution of this method. Array should contain single element representing* added row. <code>setStatus (<0)</code> should be called on failure.*/protected abstract void executeAdd (String requestId, DSRequest request, DSResponse response);/*** Executed on <code>UPDATE</code> operation. <code>processResponse (requestId, response)</code>* should be called when operation completes (either successful or failure).** @param requestId <code>String</code> extracted from <code>DSRequest.getRequestId ()</code>.* @param request <code>DSRequest</code> being processed. <code>request.getData ()</code>* contains record should be updated.* @param response <code>DSResponse</code>. <code>setData (list)</code> should be called on* successful execution of this method. Array should contain single element representing* updated row. <code>setStatus (<0)</code> should be called on failure.*/protected abstract void executeUpdate (String requestId, DSRequest request, DSResponse response);/*** Executed on <code>REMOVE</code> operation. <code>processResponse (requestId, response)</code>* should be called when operation completes (either successful or failure).** @param requestId <code>String</code> extracted from <code>DSRequest.getRequestId ()</code>.* @param request <code>DSRequest</code> being processed. <code>request.getData ()</code>* contains record should be removed.* @param response <code>DSResponse</code>. <code>setData (list)</code> should be called on* successful execution of this method. Array should contain single element representing* removed row. <code>setStatus (<0)</code> should be called on failure.*/protected abstract void executeRemove (String requestId, DSRequest request, DSResponse response); }
MyGrid.java(UI)
/** To change this template, choose Tools | Templates* and open the template in the editor.*/ package com.smartgwt.sample.showcase.client.mygrid; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.events.BlurEvent; import com.smartgwt.client.widgets.form.fields.events.BlurHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.sample.showcase.client.PanelFactory; /**** @author Administrator*/ public class MyGrid extends BaseGridForm {private static final String DESCRIPTION = "<p>對用戶進行CRUD.</p>";@Overridepublic String getDeleteMess() {return "用戶數據";}@Overridepublic String getUpdateMess() {return "用戶";}public static class Factory implements PanelFactory {private String id;public Canvas create() {MyGrid panel = new MyGrid();id = panel.getID();return panel;}public String getID() {return id;}public String getDescription() {return DESCRIPTION;}}@Overridepublic String getWinAddTitle() {return "用戶新增";}@Overridepublic String getWinUpdateTitle() {return "用戶修改";}@Overridepublic Window getAddWin(HLayout hlayout) {super.getAddWin(hlayout);winAdd.setWidth(560);winAdd.setHeight(210);return winAdd;}@Overridepublic Window getUpdateWin(HLayout hlayout) {super.getUpdateWin(hlayout);winUpdate.setWidth(560);winUpdate.setHeight(210);return winUpdate;}@Overridepublic ListGrid addListGrid() {super.addListGrid();_listGrid.setShowAllRecords(true);ListGridField YHZH = new ListGridField("YHZH", "帳號", 80);ListGridField ZHLX = new ListGridField("ZHLX", "帳號類型", 70);ListGridField XM = new ListGridField("XM", "姓名");XM.setWidth("100%");ListGridField JH = new ListGridField("JH", "警號", 90);ListGridField YHZT = new ListGridField("YHZT", "狀態", 40);ListGridField QSIP = new ListGridField("QSIP", "IP起始地址", 110);ListGridField JSIP = new ListGridField("JSIP", "IP結束地址", 110);ListGridField KLJZRQ = new ListGridField("KLJZRQ", "賬號期限", 80);_listGrid.setFields(YHZH, ZHLX, XM, JH, YHZT, QSIP, JSIP, KLJZRQ);setFields(_listGrid.getFields());return _listGrid;}@Overridepublic IButton addSaveBtn() {if(!accountIsHad){super.addSaveBtn();_saveNewBtn.addClickHandler(new ClickHandler() {public void onClick(ClickEvent event) {if (isCheck) {initText();}}});}return _saveNewBtn;}public void initText() {_addNewForm.setValue("ZHLX", "警員");_addNewForm.setValue("YHZT", "啟用");_addNewForm.setValue("QSIP", "0.0.0.0");_addNewForm.setValue("JSIP", "0.0.0.0");}boolean accountIsHad=false;@Overridepublic DynamicForm addNewForm() {super.addNewForm();_addNewForm.getItem("YHZH").addBlurHandler(new BlurHandler() {public void onBlur(BlurEvent event) {final String yhzhStr = _addNewForm.getItem("YHZH").getValue().toString().trim();if (yhzhStr.length() != 0) {XTYHRemote.Util.getInstance().checkAccount(yhzhStr, new AsyncCallback() {public void onFailure(Throwable caught) {SC.say("賬號驗證失敗!");}public void onSuccess(Object result) {if ((Integer) result > 0) {SC.say("賬號 " + yhzhStr + " 已經存在!");_addNewForm.getItem("YHZH").setValue("");_addNewForm.getItem("YHZH").focusInItem();accountIsHad = true;} else {accountIsHad = false;}}});}}});initText();return _addNewForm;}@Overridepublic DynamicForm addUpdateForm() {super.addUpdateForm();_updateForm.getItem("YHZH").disable();return _updateForm;}@Overridepublic DataSource getMyDataSource() {return XTYHDataSource.getInstance();}@Overridepublic String getIntro() {return DESCRIPTION;} }
XTYHDataSource.java(數據源)
package com.smartgwt.sample.showcase.client.mygrid; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSourceField; import com.smartgwt.client.data.fields.DataSourceDateField; import com.smartgwt.client.data.fields.DataSourceEnumField; import com.smartgwt.client.data.fields.DataSourceIntegerField; import com.smartgwt.client.data.fields.DataSourcePasswordField; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.util.JSOHelper; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.form.validator.RegExpValidator; import com.smartgwt.client.widgets.grid.ListGridRecord; import java.util.List; public class XTYHDataSource extends GwtRpcDataSource {private static XTYHDataSource instance = null;public static XTYHDataSource getInstance() {if (instance == null) {instance = new XTYHDataSource("xtyhDataSource");}return instance;}public XTYHDataSource(String id) {setID(id);DataSourceField fieldID = new DataSourceIntegerField("YHBH", "ID");fieldID.setPrimaryKey(true);fieldID.setHidden(true);addField(fieldID);DataSourceField fieldAccount = new DataSourceTextField("YHZH", "帳號類型",32,true);addField(fieldAccount);DataSourcePasswordField fieldPassword = new DataSourcePasswordField("ZHKL", "帳號口令",128,true);addField(fieldPassword);DataSourceEnumField fieldZHLX = new DataSourceEnumField("ZHLX", "帳號類型");fieldZHLX.setValueMap("警員", "非警員");fieldZHLX.setRequired(true);addField(fieldZHLX);DataSourceField fieldXM = new DataSourceTextField("XM", "姓名",20,true);addField(fieldXM);DataSourceField fieldJH = new DataSourceTextField("JH", "警號",10);addField(fieldJH);DataSourceEnumField fieldYHZT = new DataSourceEnumField("YHZT", "狀態");fieldYHZT.setValueMap("啟用", "停用");fieldYHZT.setRequired(true);addField(fieldYHZT);RegExpValidator regExpValidator = new RegExpValidator();regExpValidator.setExpression("^((1?//d?//d|(2([0-4]//d|5[0-5])))//.){3}(1?//d?//d|(2([0-4]//d|5[0-5])))$");DataSourceField fieldQSIP = new DataSourceTextField("QSIP", "IP起始地址",15);fieldQSIP.setValidators(regExpValidator);addField(fieldQSIP);DataSourceField fieldJSIP = new DataSourceTextField("JSIP", "IP結束地址",15);fieldJSIP.setValidators(regExpValidator);addField(fieldJSIP);DataSourceDateField fieldKLJZRQ = new DataSourceDateField ("KLJZRQ", "賬號期限");fieldKLJZRQ.setRequired(true);addField(fieldKLJZRQ);}@Overrideprotected void executeFetch(final String requestId, final DSRequest request, final DSResponse response) {final int startIndex = (request.getStartRow() < 0) ? 0 : request.getStartRow();final int endIndex = (request.getEndRow() == null) ? -1 : request.getEndRow();XTYHRemote.Util.getInstance().getUserList(startIndex,new AsyncCallback() {public void onFailure(Throwable caught) {SC.say(caught.getMessage());}public void onSuccess(Object result) {List userList = (List) result;int size = userList.size();if (endIndex >= 0) {if (endIndex < startIndex) {size = 0;} else {size = endIndex - startIndex + 1;}}ListGridRecord[] list = new ListGridRecord[size];if (size > 0) {for (int i = 0; i < userList.size(); i++) {if (i >= startIndex && i <= endIndex) {ListGridRecord record = new ListGridRecord();copyValues((XT_YH) userList.get(i), record);list[i - startIndex] = record;}}}response.setData(list);response.setTotalRows(userList.size());processResponse(requestId, response);}});}@Overrideprotected void executeAdd(final String requestId, final DSRequest request, final DSResponse response) {JavaScriptObject data = request.getData();ListGridRecord rec = new ListGridRecord(data);XT_YH userRec = new XT_YH();copyValues(rec, userRec);XTYHRemote.Util.getInstance().saveUser(userRec, new AsyncCallback() {public void onSuccess(Object result) {ListGridRecord[] list = new ListGridRecord[1];ListGridRecord newRec = new ListGridRecord();copyValues((XT_YH) result, newRec);list[0] = newRec;response.setData(list);processResponse(requestId, response);}public void onFailure(Throwable caught) {SC.say(caught.getMessage());}});}@Overrideprotected void executeUpdate(final String requestId, final DSRequest request, final DSResponse response) {ListGridRecord rec = getEditedRecord(request);XT_YH userRec = new XT_YH();updateCopyValues(rec, userRec);XTYHRemote.Util.getInstance().saveUser(userRec, new AsyncCallback() {public void onSuccess(Object result) {ListGridRecord[] list = new ListGridRecord[1];ListGridRecord updRec = new ListGridRecord();copyValues((XT_YH)result, updRec);list[0] = updRec;response.setData(list);processResponse(requestId, response);}public void onFailure(Throwable caught) {SC.say(caught.getMessage());}});}@Overrideprotected void executeRemove(final String requestId, final DSRequest request, final DSResponse response) {JavaScriptObject data = request.getData ();final ListGridRecord rec = new ListGridRecord (data);XT_YH userRec = new XT_YH();updateCopyValues (rec, userRec);XTYHRemote.Util.getInstance().deleteUser(userRec, new AsyncCallback() {public void onSuccess(Object result) {ListGridRecord[] list = new ListGridRecord[1];list[0] = rec;response.setData(list);processResponse(requestId, response);}public void onFailure(Throwable caught) {SC.say(caught.getMessage());}});}private static void copyValues(ListGridRecord from, XT_YH to) {to.setYHZH(from.getAttributeAsString("YHZH"));to.setZHKL(from.getAttributeAsString("ZHKL"));to.setZHLX(from.getAttributeAsString("ZHLX")=="警員"?"1":"2");to.setXM(from.getAttributeAsString("XM"));to.setJH(from.getAttributeAsString("JH"));to.setYHZT(from.getAttributeAsString("YHZT")=="啟用"?"1":"2");to.setQSIP(from.getAttributeAsString("QSIP"));to.setJSIP(from.getAttributeAsString("JSIP"));to.setKLJZRQ(from.getAttributeAsDate("KLJZRQ"));}private static void updateCopyValues(ListGridRecord from, XT_YH to) {to.setYHBH(from.getAttributeAsInt("YHBH"));to.setYHZH(from.getAttributeAsString("YHZH"));to.setZHKL(from.getAttributeAsString("ZHKL"));to.setZHLX(from.getAttributeAsString("ZHLX")=="警員"?"1":"2");to.setXM(from.getAttributeAsString("XM"));to.setJH(from.getAttributeAsString("JH"));to.setYHZT(from.getAttributeAsString("YHZT")=="啟用"?"1":"2");to.setQSIP(from.getAttributeAsString("QSIP"));to.setJSIP(from.getAttributeAsString("JSIP"));to.setKLJZRQ(from.getAttributeAsDate("KLJZRQ"));}private static void copyValues(XT_YH from, ListGridRecord to) {to.setAttribute("YHBH", from.getYHBH());to.setAttribute("YHZH", from.getYHZH());to.setAttribute("ZHKL", from.getZHKL());to.setAttribute("ZHLX", from.getZHLX()=="1"?"警員":"非警員");to.setAttribute("XM", from.getXM());to.setAttribute("JH", from.getJH());to.setAttribute("YHZT", from.getYHZT()=="1"?"啟用":"停用");to.setAttribute("QSIP", from.getQSIP());to.setAttribute("JSIP", from.getJSIP());to.setAttribute("KLJZRQ", from.getKLJZRQ());}private ListGridRecord getEditedRecord(DSRequest request) {// Retrieving values before editJavaScriptObject oldValues = request.getAttributeAsJavaScriptObject("oldValues");// Creating new record for combining old values with changesListGridRecord newRecord = new ListGridRecord();// Copying properties from old recordJSOHelper.apply(oldValues, newRecord.getJsObj());// Retrieving changed valuesJavaScriptObject data = request.getData();// Apply changesJSOHelper.apply(data, newRecord.getJsObj());return newRecord;} }
XTYHRemote.java(遠程方法接口)
/*** */ package com.smartgwt.sample.showcase.client.mygrid; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.ServiceDefTarget; public interface XTYHRemote extends RemoteService {/*** Utility class for simplifing access to the instance of async service.*/public static class Util {private static XTYHRemoteAsync instance;public static XTYHRemoteAsync getInstance(){if (instance == null) {instance = (XTYHRemoteAsync) GWT.create(XTYHRemote.class);ServiceDefTarget target = (ServiceDefTarget) instance;target.setServiceEntryPoint(GWT.getModuleBaseURL() + "XTYHRemote");}return instance;}}public int checkAccount(String account);public List<XT_YH> getUserList();public XT_YH saveUser(XT_YH user);public void deleteUser(XT_YH user); }
XTYHRemoteAsync.java(遠程方法異步接口)
package com.smartgwt.sample.showcase.client.mygrid; import com.google.gwt.user.client.rpc.AsyncCallback; public interface XTYHRemoteAsync {public void checkAccount(String account, AsyncCallback callback);public void getUserList( AsyncCallback callback);public void saveUser(XT_YH user, AsyncCallback callback);public void deleteUser(XT_YH user, AsyncCallback callback); }
XT_YH.java(實體類)
/** To change this template, choose Tools | Templates* and open the template in the editor.*/ package com.smartgwt.sample.showcase.client.mygrid; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import net.sf.hibernate4gwt.pojo.java5.LazyPojo; /**** @author Administrator*/ @Entity @Table(name="XT_YH") public class XT_YH extends LazyPojo implements Serializable{private static final long serialVersionUID = 58354709157710767L;private static Integer xtyhId = 0;private Integer YHBH;private String YHZH;private String ZHKL;private String ZHLX;private String XM;private String JH;private String YHZT;private String QSIP;private String JSIP;private Date KLJZRQ;private String BY1;/*** @return 臨時ID*/public static Integer getXtyhId() {return xtyhId;}public static void setXtyhId(Integer xtyhId) {XT_YH.xtyhId = xtyhId;}/*** @return 用戶編號*/@Id@GeneratedValue@Column(name="YHBH")public Integer getYHBH() {return YHBH;}public void setYHBH(Integer YHBH) {this.YHBH = YHBH;}/*** @return 備用字段*/@Column(name="BY1", nullable=true, length=256)public String getBY1() {return BY1;}public void setBY1(String BY1) {this.BY1 = BY1;}/*** @return 警號*/@Column(name="JH", nullable=true, length=10)public String getJH() {return JH;}public void setJH(String JH) {this.JH = JH;}/*** @return IP結束地址*/@Column(name="JSIP", nullable=true, length=15)public String getJSIP() {return JSIP;}public void setJSIP(String JSIP) {this.JSIP = JSIP;}/*** @return 口令截止日期*/@Column(name="KLJZRQ", nullable=false)@Temporal(javax.persistence.TemporalType.DATE)public Date getKLJZRQ() {return KLJZRQ;}public void setKLJZRQ(Date KLJZRQ) {this.KLJZRQ = KLJZRQ;}/*** @return IP起始地址*/@Column(name="QSIP", nullable=true, length=15)public String getQSIP() {return QSIP;}public void setQSIP(String QSIP) {this.QSIP = QSIP;}/*** @return 姓名*/@Column(name="XM", nullable=false, length=20)public String getXM() {return XM;}public void setXM(String XM) {this.XM = XM;}/*** @return 用戶帳號*/@Column(name="YHZH", nullable=false, length=32)public String getYHZH() {return YHZH;}public void setYHZH(String YHZH) {this.YHZH = YHZH;}/*** @return 用戶狀態*/@Column(name="YHZT", nullable=false, length=2)public String getYHZT() {return YHZT;}public void setYHZT(String YHZT) {this.YHZT = YHZT;}/*** @return 帳號口令*/@Column(name="ZHKL", nullable=false, length=256)public String getZHKL() {return ZHKL;}public void setZHKL(String ZHKL) {this.ZHKL = ZHKL;}/*** @return 帳號類型*/@Column(name="ZHLX", nullable=false, length=1)public String getZHLX() {return ZHLX;}public void setZHLX(String ZHLX) {this.ZHLX = ZHLX;} }
?
server:
ApplicationContext.java(gwt獲取spring上下文)
/*** */ package com.smartgwt.sample.showcase.server; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.ClassPathResource; /*** Global application context* @author bruno.marchesson**/ public class ApplicationContext {//----// Constants//----/*** The stateless configuration file*/private static final String STATELESS_CONTEXT_FILE = "com/smartgwt/sample/showcase/server/resources/applicationContext.xml";//----// Attributes//----/*** Unique instance of the singleton*/private static ApplicationContext _instance;/*** Spring context*/protected GenericApplicationContext _springContext;//----// Properties//----/*** @return the unique of the instance*/public static synchronized final ApplicationContext getInstance(){if (_instance == null){_instance = new ApplicationContext();}return _instance;}//-------------------------------------------------------------------------//// Constructor////-------------------------------------------------------------------------/*** Constructor*/protected ApplicationContext(){initContextFile();}//-------------------------------------------------------------------------//// Public interface////-------------------------------------------------------------------------/*** Get a bean from its name*/public Object getBean(String beanName){return _springContext.getBean(beanName);}//-------------------------------------------------------------------------//// Internal method////-------------------------------------------------------------------------/*** Init Spring context*/private void initContextFile(){_springContext = new GenericApplicationContext();XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(_springContext);xmlReader.loadBeanDefinitions(new ClassPathResource(STATELESS_CONTEXT_FILE));_springContext.refresh();} }
IXTYHDAO.java
package com.smartgwt.sample.showcase.server; import com.smartgwt.sample.showcase.client.mygrid.XT_YH; import java.util.List; public interface IXTYHDAO {public static final String NAME = "xtyhDAO";public int countIsHad(String login);public List<XT_YH> loadAll();public XT_YH saveUser(XT_YH user);public void deleteUser(XT_YH user); }
IXTYHService.java
package com.smartgwt.sample.showcase.server; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.smartgwt.sample.showcase.client.mygrid.XT_YH; import java.util.List; @RemoteServiceRelativePath("XTYHRemote") public interface IXTYHService extends RemoteService {public static final String NAME = "ixtyhService";public int checkAccount(String login);public List<XT_YH> loadUserList();public XT_YH saveUser(XT_YH user);public void deleteUser(XT_YH user); }
XTYHDAO.java
package com.smartgwt.sample.showcase.server; import com.smartgwt.sample.showcase.client.mygrid.XT_YH; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import java.util.List; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; public class XTYHDAO implements IXTYHDAO {private EntityManager _entityManager;@PersistenceContextpublic void setEntityManager(EntityManager entityManager) {_entityManager = entityManager;}@Transactional(propagation = Propagation.SUPPORTS)public int countIsHad(String account) {StringBuffer hqlQuery = new StringBuffer();hqlQuery.append("select count(*) from XT_YH xtyh");hqlQuery.append(" where xtyh.YHZH=:YHZH");Query query = _entityManager.createQuery(hqlQuery.toString());query.setParameter("YHZH", account);return ((Long) query.getSingleResult()).intValue();}@SuppressWarnings("unchecked")@Transactional(propagation = Propagation.SUPPORTS)public List<XT_YH> loadAll() {Query query = _entityManager.createQuery("from XT_YH xtyh order by xtyh.YHBH desc");return (List<XT_YH>) query.getResultList();}@Transactional(propagation = Propagation.REQUIRED)public XT_YH saveUser(XT_YH user) {return _entityManager.merge(user);}@Transactional(propagation = Propagation.REQUIRED)public void deleteUser(XT_YH user) {_entityManager.remove(_entityManager.merge(user));} }
XTYHRemoteImpl.java(遠程方法實現)
package com.smartgwt.sample.showcase.server; import com.smartgwt.sample.showcase.client.mygrid.XTYHRemote; import com.smartgwt.sample.showcase.client.mygrid.XT_YH; import net.sf.hibernate4gwt.core.HibernateBeanManager; import net.sf.hibernate4gwt.gwt.HibernateRemoteService; import java.util.List; public class XTYHRemoteImpl extends HibernateRemoteServiceimplements XTYHRemote {private static final long serialVersionUID = 592119990410234359L;private IXTYHService ixtyhService;public IXTYHService getIxtyhService() {return ixtyhService;}public void setIxtyhService(IXTYHService ixtyhService) {this.ixtyhService = ixtyhService;}public XTYHRemoteImpl() {setBeanManager((HibernateBeanManager) ApplicationContext.getInstance().getBean("hibernateBeanManager"));ixtyhService = (IXTYHService) ApplicationContext.getInstance().getBean(IXTYHService.NAME);}public int checkAccount(String account) {return ixtyhService.checkAccount(account);}public List<XT_YH> getUserList() {return ixtyhService.loadUserList();}public XT_YH saveUser(XT_YH user) {return ixtyhService.saveUser(user);}public void deleteUser(XT_YH user) {ixtyhService.deleteUser(user);} }
XTYHService.java
package com.smartgwt.sample.showcase.server; import com.smartgwt.sample.showcase.client.mygrid.XT_YH; import java.util.List; public class XTYHService implements IXTYHService {private IXTYHDAO xtyhDAO;public IXTYHDAO getXtyhDAO() {return xtyhDAO;}public void setXtyhDAO(IXTYHDAO xtyhDAO) {this.xtyhDAO = xtyhDAO;}public int checkAccount(String login) {return xtyhDAO.countIsHad(login);}public List<XT_YH> loadUserList() {return xtyhDAO.loadAll();}public XT_YH saveUser(XT_YH user) {return xtyhDAO.saveUser(user);}public void deleteUser(XT_YH user) {xtyhDAO.deleteUser(user);} }
?
以上就是所要添加的源代碼,然后編譯運行。gwt有個特性(宿主模式),能已調試java的方式調試客戶端代碼,當然NetBeans也能調試js,不過gwt生成的js是編碼過的,所以一般人就別指望看懂了。編譯運行smartgwt比較慢,可以說很慢,通常一個同等復雜的jsp應用,會比smartgwt快N倍,因為gwt和smartgwt首先要編譯java生成js到特定目錄,然后復制客戶端js特效庫的文件到特定目錄...所以編譯運行是種煎熬。當然和電腦配置有很大的關系,如果是今年的主流配置,我想在1分鐘內運行起來是沒有問題的,我2005年配置就加了根內存,3-4分鐘的編譯運行真可以吐血。
編譯的應該差不多了,IDE會啟動配置的瀏覽器。
web.xml中漏了個配置,注冊servlet,不然異步操作會404哦。
<servlet><servlet-name>XTYHRemote</servlet-name><servlet-class>com.smartgwt.sample.showcase.server.XTYHRemoteImpl</servlet-class></servlet><servlet-mapping><servlet-name>XTYHRemote</servlet-name><url-pattern>/showcase/XTYHRemote</url-pattern></servlet-mapping>
如果能看到以下頁面,說明絕大多數配置正確,數據需要自己添加,表是加載實體類時自動生成的。
所有的操作都是異步實現,下面是個簡單的更新頁面
?
到此,一個完整的CRUD應用結束(除了搜索)
?
謝謝...
?
總結
以上是生活随笔為你收集整理的smartgwt (B)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA 出现 Exception in
- 下一篇: 如何在Photoshop中合并图层