J2ME框架的应用---登录页面
在软件开发中,登录页面是用的比较多的一种,如果我们要上BBS发帖子,那就要先通过登录页面,只有输入的名称和密码是正确的,才能发帖;另外一种,在j2me开发中,有些业务会要求用户输入正确的信息后,才能正常使用软件。这篇教程就是教你如何利用这个框架来开发这种类型的界面。
完成后的界面效果如下图:
|
输入信息后的效果:
|
登录成功后的提示页面:
|
如果这个登录模块只是实现最基本的验证功能,那么在这个框架体系下,我们只要写两个类就够了。
第一个类,从Application继承的子类
第二个类,登录按钮类,通过这个类提供的方法,来实现验证功能。
开发的步骤如下:
1 编写功能模块。如何编写功能模块,这里就不详说了,参考第一篇。
工程名为Login。
2 编写Login类。
package com.frame.login;
import javax.microedition.lcdui.Image;
import com.frame.application.Application; import com.frame.application.DisplayFactory; //import com.frame.util.RecordStoreUtil; import com.frame.util.ResUtil; import com.frame.util.XmlUtil; import com.frame.display.DisplayManager;
public class Login extends Application { public Login() { super(); } public String getName() { return "登陆页面演示程序"; } public Image getAppIcon() { ResUtil.baseDir = "/login/"; return ResUtil.getStaticImage("login.png"); } public void doApplication() { XmlUtil.initXmlFile("/login/Index.xml"); //"Access"是与Index.xml文件的Html节点的Name属性值相同 DisplayManager.getCurrent().setDisplay( DisplayFactory.getDisplayable("Access")); } public void register() { try { Class c = Class.forName("com.frame.login.xml.UserResultBodyItem"); addRegItem("UserResult", c); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public void initialize(boolean isFirst) { } public void finalizeApp() { } } |
这里要说明的就是register()这个方法,它的作用就是将这个功能模块中,用户自定义的TYPE类型加载到框架中,因为只有提前加载到框架里,那框架在分析你的XML文件的时候,才能够识别用户自定的TYPE。
3 编写XML文件。除了框架已经定义好的TYPE类型,用户还可以根据自己的业务需要,来设计自己的TYPE(如何设计自定义的TYPE,会在下篇详细介绍)。在这里,我自定义了一个类型Type="UserResult",在手机屏幕上显示为“登 录”,通过这个TYPE,来验证用户信息。
<?xml version="1.0" encoding="UTF-8"?> <XmlFile> <Html Name="Access" AutoSave="1" AutoCache="1"> <Body> <Item Type="Content">用户登录:</Item> <Item Type="Hr"/> <Item DisplayName="用户名:" Name="name" Default="" Length="20" Width="100" Height="20" Constraints="ANY" TopMargin="2" LeftMargin="2" Type="InputBox"/> <Item DisplayName="密 码:" Name="pwd" Default="" Length="20" Width="100" Height="20" Constraints="ANY" TopMargin="2" LeftMargin="2" Type="InputBox"/> <Item Type="Hr"/> <Item DisplayName="登 录" SaveName="UserInfo" TableName="BBS_MEMBER" AHref="Library2/WebInitPage.tkx?Source=ForumLoginPage" Host="ForumUrl" Success="你已经成功登录!" Failure="登录失败,请重试!" Type="UserResult"/> <Item DisplayName="返 回" Type="Back"/> </Body> </Html> </XmlFile> |
4 编写自定义TYPE的处理类(这个类有点长,以后会详细解释)。
package com.frame.login.xml; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import com.frame.application.MessageCanvas; import com.frame.ui.Control; import com.frame.ui.ControlCollection; import com.frame.ui.FixContainerControl; import com.frame.ui.ICommand; import com.frame.ui.control.ClickText; import com.frame.ui.control.InputBox; import com.frame.util.ColorUtil; import com.frame.util.StringUtil; import com.frame.xml.AbstractBodyItem; import com.frame.xml.XmlParseException;
public class UserResultBodyItem extends AbstractBodyItem implements ICommand{ private String saveName; private String displayName; // 要显示的名称 private String tableName; private String host; private String success; private String failure; private String href; private String userName; private String oldPwd; private boolean isValid;
public UserResultBodyItem() { super(); success = "成 功!"; failure = "失 败!"; saveName = ""; displayName = ""; tableName = ""; host = ""; href = ""; oldPwd = ""; }
public int doCommand() { ControlCollection controls = this.getCanvas().getControls(); for (int i = 0; i < controls.size(); i++) { Control control = controls.getControl(i); if (control instanceof FixContainerControl) { FixContainerControl fix = (FixContainerControl) control; InputBox inputBox = (InputBox) fix.getControls() .getClickControl(0); String name = inputBox.getName(); String value = inputBox.getInputValue(); if ("name".equals(name)) this.userName = value; else if ("pwd".equals(name)) this.oldPwd = value; } } if("login".equals(userName) && "123".equals(oldPwd)){ MessageCanvas.getCurrent().showMsg("提示信息", success, ""); }else MessageCanvas.getCurrent().showMsg(failure);
return ICommand.NONE; }
public Control getControl() { ClickText result = new ClickText(); result.setText(this.displayName); result .setSelectedFontColor(getSelectColor() == -1 ? ColorUtil.ITEM_SELECTED_FONTCOLOR : getSelectColor()); result .setUnselectedFontColor(getColor() == -1 ? ColorUtil.ITEM_UNSELECTED_FONTCOLOR : getColor()); result .setUnselectedBackColor(getUnSelectBgColor() == -1 ? ColorUtil.ITEM_UNSELECTED_BGCOLOR : getUnSelectBgColor()); result .setSelectedBackColor(getSelectBgColor() == -1 ? ColorUtil.ITEM_SELECTED_BGCOLOR : getSelectBgColor());
result.setTopMargin(getTopMargin()); result.setLeftMargin(getRightMargin()); result.setBottomMargin(getBottomMargin()); result.setRightMargin(getRightMargin());
result.setCommand(this); return result; }
public String getType() { return "UserResult"; }
protected void parseXmlData(XmlPullParser parser) throws XmlParseException { try { int eventType = parser.getEventType(); String tagName = parser.getName(); if (!(eventType == XmlPullParser.START_TAG && "Item" .equals(tagName))) return; setDisplayName(parser.getAttributeValue("", "DisplayName")); setHref(parser.getAttributeValue("", "AHref")); setHost(parser.getAttributeValue("", "Host")); setSaveName(parser.getAttributeValue("", "SaveName")); setTableName(parser.getAttributeValue("", "TableName")); setSuccess(parser.getAttributeValue("", "Success")); setFailure(parser.getAttributeValue("", "Failure")); eventType = parser.next(); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
protected void readData(DataInputStream dataStream) throws IOException { setDisplayName(dataStream.readUTF()); setHref(dataStream.readUTF()); setHost(dataStream.readUTF()); setSaveName(dataStream.readUTF()); setTableName(dataStream.readUTF()); setSuccess(dataStream.readUTF()); setFailure(dataStream.readUTF()); }
protected void saveData(DataOutputStream dataStream) throws IOException { dataStream.writeUTF(displayName); dataStream.writeUTF(href); dataStream.writeUTF(host); dataStream.writeUTF(saveName); dataStream.writeUTF(tableName); dataStream.writeUTF(success); dataStream.writeUTF(failure); }
private void setHost(String host) { if (host != null) this.host = host; }
private void setHref(String href) { if (href != null) this.href = href; }
public String getDisplayName() { return displayName; }
private void setDisplayName(String displayName) { if (!StringUtil.isEmpty(displayName)) this.displayName = displayName; }
private void setSaveName(String saveName) { if (!StringUtil.isEmpty(saveName)) this.saveName = saveName; }
private void setTableName(String tableName) { if (tableName != null) this.tableName = tableName; }
public void setValid(boolean isValid) { this.isValid = isValid; }
public void setUserName(String userName) { this.userName = userName; }
public boolean isValid() { return isValid; }
public String getSaveName() { return saveName; }
public String getTableName() { return tableName; }
public String getOldPwd() { return oldPwd; }
public String getUserName() { return userName; }
public String getFailure() { return failure; }
private void setFailure(String failure) { if (failure != null) this.failure = failure; }
public String getSuccess() { return success; }
private void setSuccess(String success) { if (success != null) this.success = success; } } |
当点击“登 录”按钮时,会执行doCommand()方法,如果用户名为“login”,密码“ 123 ” ,会根据xml的success属性的值,出现个提示页面。
5 将这个功能模块加入到主工程中。
1) 构建路径里添加这个模块。
2) 在MainMidlet类里,添加一段代码。
c = Class.forName("com.frame.login.Login");
addApplication(20, c);
6 调试
效果如下:
|