MIDP的子系统Record Management System提供了MIDlet的持久性存储,精通MIDP子系统RMS系列文章对其使用进行了详细介绍。本文讲述如何使用RMS提供的功能实现应用程序的定制功能——自动登陆。
我们的设计思路非常简单,在RecordStore中存储用户的设置和用户的信息(用户名和密码),如果用户选择自动登陆的话,那么下次当用户想联网的时候将跳过登陆界面,系统会从RecordStore中读取用户和密码,经过服务器的验证后转入到适当的界面。我对整个程序进行了简化,我们不进行联网,对信息的存储也都从简,只是为了说明RMS实现应用程序定制的思路,因此给出的代码并没有全面测试和优化。下面是程序的截图
我们用Account和Preference分别存储用户信息和用户的个性化设置,同样在这两个类中提供序列化的方法,这样方便我们从RecordStore中读取和写入。这里只给出Preference类的代码,Account类似。
package com.j2medev.autologin;
import java.io.*;
public class Preference
{
private boolean autoLogin;
public Preference(boolean _autoLogin)
{
this.autoLogin = _autoLogin;
}
public Preference()
{
}
public void serialize(DataOutputStream dos) throws IOException
{
dos.writeBoolean(autoLogin);
}
public static Preference deserialize(DataInputStream dis)
throws IOException
{
Preference preference = new Preference();
preference.setAutoLogin(dis.readBoolean());
return preference;
}
public boolean isAutoLogin()
{
return autoLogin;
}
public void setAutoLogin(boolean autoLogin)
{
this.autoLogin = autoLogin;
}
}
我们需要一个Model类来处理读取和写入RecordStore数据的逻辑,它也非常简单。为了简化程序我们规定首先写入Account然后写入Preference,这样我们读取的时候只要通过recordID分别为1和2来读取了,在实际使用的时候通常会比较复杂,我们要借助过滤器等查找,可以参考我的基于MIDP1.0实现个人通讯录。
package com.j2medev.autologin;
import javax.microedition.rms.*;
import java.io.*;
public class Model
{
private RecordStore accountStore;
public static final String RNAME = "accountstore";
public Model()
{
try
{
accountStore = RecordStore.openRecordStore(RNAME, true);
} catch (RecordStoreException e)
{
e.printStackTrace();
}
}
public void closeRecordStore()
{
try
{
accountStore.closeRecordStore();
} catch (RecordStoreException e)
{
e.printStackTrace();
}
}
public void saveAccount(Account account)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try
{
account.serialize(dos);
byte[] data = baos.toByteArray();
accountStore.addRecord(data, 0, data.length);
baos.close();
} catch (IOException e)
{
e.printStackTrace();
} catch (RecordStoreException e)
{
e.printStackTrace();
}
}
public Account getAccount(int recordID)
{
try
{
if (accountStore.getNumRecords() > 0)
{
byte[] data = accountStore.getRecord(recordID);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
Account account = Account.deserialize(dis);
bais.close();
return account;
}
return null;
} catch (IOException e)
{
return null;
} catch (RecordStoreException e)
{
return null;
}
}
public void savePreference(Preference preference)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try
{
preference.serialize(dos);
byte[] data = baos.toByteArray();
accountStore.addRecord(data, 0, data.length);
baos.close();
} catch (IOException e)
{
e.printStackTrace();
} catch (RecordStoreException e)
{
e.printStackTrace();
}
}
public Preference getPreference(int recordID)
{
try
{
if (accountStore.getNumRecords() > 0)
{
byte[] data = accountStore.getRecord(recordID);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
Preference preference = Preference.deserialize(dis);
bais.close();
return preference;
}
return null;
} catch (IOException e)
{
return null;
} catch (RecordStoreException e)
{
return null;
}
}
}
MIDlet的设计同样很简单,直接给出代码。整个程序的代码可以从这里下载
package com.j2medev.autologin;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class LoginMIDlet extends MIDlet implements CommandListener
{
private Display display;
private Form loginForm;
private Form successForm;
private TextField userName;
private TextField password;
private ChoiceGroup autoLogin;
private Model model;
public static final Command ConnCMD = new Command("Connect", Command.OK, 1);
protected void startApp() throws MIDletStateChangeException
{
initMIDlet();
Preference p = model.getPreference(2);
if (p == null || !p.isAutoLogin())
{
display.setCurrent(loginForm);
} else if (p.isAutoLogin())
{
Account account = model.getAccount(1);
System.out.println("username:" + account.getUsrName() + "password:"
+ account.getPassword());
display.setCurrent(successForm);
}
}
public void initMIDlet()
{
model = new Model();
display = Display.getDisplay(this);
loginForm = new Form("LoginForm");
userName = new TextField("username", null, 20, TextField.ANY);
password = new TextField("password", null, 20, TextField.PASSWORD);
autoLogin = new ChoiceGroup("AutoLogin", Choice.MULTIPLE,
new String[] { "remember me" }, null);
loginForm.append(userName);
loginForm.append(password);
loginForm.append(autoLogin);
loginForm.addCommand(ConnCMD);
loginForm.setCommandListener(this);
successForm = new Form("OK");
successForm.append("Ok you have connected to server");
}
protected void pauseApp()
{
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
}
public void commandAction(Command arg0, Displayable arg1)
{
String _userName;
String _password;
boolean auto = false;
if (arg0 == ConnCMD)
{
_userName = userName.getString();
_password = password.getString();
auto = autoLogin.isSelected(0);
System.out.println(_userName + _password + auto);
if (auto)
{
Account account = new Account(_userName, _password);
model.saveAccount(account);
Preference preference = new Preference(auto);
model.savePreference(preference);
}
display.setCurrent(successForm);
}
}
}
分享到:
相关推荐
标题中的“应用RMS实现用户自动登陆功能”指的是在移动设备上,如Java ME平台,使用Record Management System (RMS)来实现用户登录状态的自动保存和恢复,从而达到自动登录的效果。RMS是Java ME中用于数据存储的一个...
5. **权限管理**: RMS允许开发者设置RecordStore的访问权限,控制不同应用或用户对数据的访问。 6. **空间管理**: 由于移动设备的内存限制,开发者需要谨慎管理RecordStore的空间。RMS会自动管理空间,但当空间不足...
在J2ME中实现自动登录功能,可以帮助用户快速进入应用,提高用户体验。这个例子将探讨如何在J2ME环境中创建一个自动登录系统。 1. **数据存储**: - 在J2ME中,我们通常使用Record Management System (RMS) 来持久...
在信号处理领域,自适应滤波器是一种能够根据输入信号自动调整其参数的滤波器。MatLab是一个强大的数学计算和编程环境,非常适合用于实现这样的算法。本项目提供了RMS(均方根)和RLS(最小均方误差)两种自适应...
在RMS2000的源代码中,开发者很可能使用了MFC来构建用户界面和实现系统功能。 源代码是程序的原始形式,包含所有编程细节,如变量定义、函数实现、逻辑判断等。拥有RMS2000的源代码意味着可以深入理解其内部工作...
为了简化用户在登录SharePoint和RMS时的认证流程,可以设置自动登录。具体步骤如下: - 登录到域控制器服务器。 - 打开组策略管理控制台,新建自动登录WEB组策略。 - 在“用户配置”下找到IE登录选项进行设置。 - ...
RMS2000全称为“Real-time Monitoring and Supervisory System 2000”,是一款实时监控与管理系统,主要应用于制造业、能源、化工等行业的自动化过程控制。其核心特点包括: 1. **实时性**:RMS2000具备强大的实时...
5. **应用需求匹配**:在具体应用中,如自动驾驶、无人机导航、应急救援等,不同的精度要求会对应不同的RMS阈值。 压缩文件中的"RMS.C"可能是一个C语言编写的源代码文件,包含了实现这些功能的算法和逻辑。开发人员...
总之,这个J2ME自动登录源代码实例展示了如何在移动设备上利用Java ME实现用户登录功能,涉及到了数据存储、网络通信、解析响应和错误处理等多个方面的知识点。对于深入学习Java ME和移动开发的人员来说,这是一个很...
在这个“J2me自动登录的源代码”实例中,我们将探讨如何在J2ME环境中实现一个自动登录功能,从而提升用户使用应用程序的便利性。 自动登录功能通常是基于存储的用户凭证,例如用户名和密码,来快速建立用户的会话,...
RMS的灵活性使得开发者能够根据应用程序的需求存储不同类型的数据,从简单的用户偏好到复杂的联系人信息或供应链数据。通过熟练掌握RMS的使用,开发者可以创建高效且功能丰富的MIDlet,实现数据的可靠管理和访问。...
6. **测试与调整**:部署完成后,进行一系列测试以确保RMS功能正常。这包括创建和应用权限策略,以及验证不同用户组对受保护内容的访问权限。 **RMS配置注意事项** - 在Windows 2008中,RMS支持更高级的安全特性,...
6. **集成应用**:RMS可与多种企业应用集成,如Microsoft Office套件,使得在日常工作中轻松实现信息保护。 7. **审计与报告**:RMS提供详尽的审计日志,记录所有尝试访问受保护内容的尝试,帮助企业监控数据的使用...
泰山RMS利用Java的强大功能,实现了服务器端的业务逻辑处理,数据访问以及与其他系统的交互。 2. **Web技术**:本系统采用了Java Web技术栈,包括Servlet、JSP(JavaServer Pages)和JSTL(JavaServer Pages ...
RMS(Revenue Management System,收益管理系统)便是这样的一个核心工具,它集成了预订、入住、退房、账单管理等多种功能,实现了酒店业务的自动化处理。本篇将详细介绍一个基于C++6.0编程语言和SQL Server数据库的...
通过深入理解和应用这些测试资源,开发团队可以确保RMS系统的稳定性和可靠性,从而为用户提供高效且无故障的资源管理服务。同时,持续的测试和优化也是提升用户体验和系统性能的关键。在实际项目中,结合手动测试和...
2. 自动启用服务器授权凭证:在 AD RMS 中,根群集的服务器授权凭证(Server Licensor Certificate,SLC)可以自动启用,无须手动操作。 3. 与 Active Directory 联合身份验证服务(AD FS)配合使用:AD FS 是 ...
例如,一个音乐播放器应用可以使用RMS来保存用户的播放历史,一个简单的待办事项应用可以利用RMS保存任务列表。 **总结** J2ME RMS为移动设备提供了一种轻量级的数据存储解决方案,虽然功能相对有限,但对于许多...
2. **AD RMS客户端**:安装在用户设备上,与支持AD RMS的应用程序交互,处理文档的加密和解密。 3. **AD RMS服务器**:负责证书颁发、授权服务以及受保护文档的访问控制。 【权限账户证书】 权限账户证书是AD RMS...
总的来说,RMS2000_C是一个全面的组态软件解决方案,通过深入研究其源代码,可以学习到C语言在工业自动化领域的应用,以及图形用户界面设计、数据处理、通信协议、事件驱动编程等多个方面的知识。这不仅能够提高...