服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

应用rms实现用户自动登陆功能

 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);
        }
    }

}

扫描关注微信公众号