騎豬闖天下

          J2ME隨筆,記錄成長的腳步

          統計

          留言簿(3)

          閱讀排行榜

          評論排行榜

          [J2ME] J2ME客戶端用戶登錄驗證

          J2ME用戶登錄驗證


          [說明]
                  J2ME用戶登錄驗證,一直沒有搞定怎么回事,網上搜到 [J2ME/J2EE實現用戶登錄交互] ,還是不能運行,問題主要出在Servlet上,沒有看過,不會配置,很是郁悶,前天在同學SpringChen的指點下,學會了配置,今天終于搞懂了J2ME用戶登錄驗證機制,非常高興,隨把調試的程序貼出來,以備以后查閱。
                  代碼中,修改了原程序不合理及條例不清楚的部分,故升級為2.0版本,特此聲明。


          [代碼部分]
          實現功能:
          用手機客戶端進行登錄服務器,然后服務器返回消息進行交互。


          服務器代碼:
          需要配置Servlet,首先熟悉Servlet相關知識。
          LoginServlet:

          package packageOne;

          import
           java.io.ByteArrayOutputStream;
          import
           java.io.DataOutputStream;
          import
           java.io.IOException;
          import
           java.io.OutputStream;

          import
           javax.servlet.ServletException;
          import
           javax.servlet.http.HttpServlet;
          import
           javax.servlet.http.HttpServletRequest;
          import
           javax.servlet.http.HttpServletResponse;

          /**
           * 服務器端代碼, 需配置Servlet.
           * Time: 2008 09 03 .
           
          */

          public class LoginServlet extends HttpServlet 
          {
              
          private static final long serialVersionUID = 1L
          ;

              
          public void
           doGet(HttpServletRequest request, HttpServletResponse response)
                  
          throws
           ServletException, IOException
              
          {
                  
          this
          .doPost(request, response);
              }

              
              
          public void doPost(HttpServletRequest request, HttpServletResponse response)
                  
          throws
           ServletException, IOException
              
          {
                  
          // 得到客戶端傳入的數據(用戶名和密碼)

                  String username = request.getParameter("username");
                  String password 
          = request.getParameter("password"
          );
                  
                  
          // 構建輸出流

                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  DataOutputStream dos 
          = new
           DataOutputStream(baos);
                  
                  
          // 邏輯操作(這里寫你的邏輯判斷)

                  if (username.equals("dcf"&& password.equals("admin"))
                  
          {
                      
          // 響應數據

                      dos.writeUTF("true");
                  }
           else
                  
          {
                      
          // 響應數據

                      dos.writeUTF("false");
                  }

                  
                  
          //獲得寫入的字節數組流
                  byte[] data = baos.toByteArray();
                  
                  
          // 設置服務器響應參數

                  response.setStatus(HttpServletResponse.SC_OK);
                  response.setContentLength(data.length);
                  response.setContentType(
          "application/octet-stream"
          );
                  
                  
          // 構建輸出流, 寫入要返回給客戶端的數據

                  OutputStream os = response.getOutputStream();        
                  os.write(data);
                  
                  os.close();
              }


          }




          手機客戶端代碼:
          LoginForm:
          package com;

          import
           java.io.DataInputStream;
          import
           java.io.IOException;
          import
           java.io.OutputStream;

          import
           javax.microedition.io.Connector;
          import
           javax.microedition.io.HttpConnection;
          import
           javax.microedition.lcdui.Alert;
          import
           javax.microedition.lcdui.AlertType;
          import
           javax.microedition.lcdui.Command;
          import
           javax.microedition.lcdui.CommandListener;
          import
           javax.microedition.lcdui.Display;
          import
           javax.microedition.lcdui.Displayable;
          import
           javax.microedition.lcdui.Form;
          import
           javax.microedition.lcdui.TextField;
          import
           javax.microedition.midlet.MIDlet;
          import
           javax.microedition.midlet.MIDletStateChangeException;

          /**
           * 用Http  Post方式與服務器交互
           * 修改了轉貼源代碼中不合理的部分
           * 
          @author Du Changfeng 2008 09 03
           * @version
           2.0 
           */

          public class LoginForm extends MIDlet implements CommandListener
          {
              
          private Form form = null
          ;
              
          private Display display = Display.getDisplay(this
          );;
              
          private Command login = null
          ;
              
          private Command exit = null
          ;
              
          private TextField username = null
          ;
              
          private TextField password = null
          ;
              
          private Alert alert = null
          ;
              
          private Alert error = null
          ;

              
          public
           LoginForm()
              
          {
                  form 
          = new Form("用戶登錄"
          );
                  display.setCurrent(form);
                  login 
          = new Command("登錄", Command.SCREEN, 1
          );
                  exit 
          = new Command("退出", Command.EXIT, 1
          );
                  form.addCommand(login);
                  form.addCommand(exit);

                  username 
          = new TextField("用戶名"""20
          , TextField.ANY);
                  password 
          = new TextField("密  碼"""20
          , TextField.PASSWORD);

                  form.append(username);
                  form.append(password);
                  form.setCommandListener(
          this
          );
              }


              
          public void initAlertOK()
              
          {
                  alert 
          = new Alert("提示""登錄成功 !\r\n您的用戶名為:" +
           username.getString()
                          
          + "\r\n密碼為:" + password.getString(), null
          , AlertType.INFO);
                  alert.setTimeout(Alert.FOREVER);
                  display.setCurrent(alert);
              }


              
          public void initAlertError()
              
          {
                  error 
          = new Alert("提示""登錄失敗,用戶名或密碼錯誤"null
          , AlertType.ERROR);
                  display.setCurrent(error);
              }


              
          protected void startApp() throws MIDletStateChangeException
              
          {

              }


              
          /** 
               * 事件處理
               
          */

              
          public void commandAction(Command cmd, Displayable dis)
              
          {
                  
          // 點擊退出按鈕事件

                  if (cmd.getCommandType() == Command.EXIT)
                  
          {
                      System.out.println(
          "exit"
          );
                      
          this
          .notifyDestroyed();
                  }

                  
          if (cmd == login)
                  
          {
                      
          // 必須開啟獨立線程來處理Http請求,否則會造成死鎖

                      new Thread(new Runnable()
                      
          {
                          
          public void
           run()
                          
          {
                              
          try

                              
          {
                                  inTurnServer();
                              }
           catch
           (Exception e)
                              
          {
                                  e.printStackTrace();
                              }

                          }

                      }
          ).start();

                  }

              }


              
          /***********************************************
               * 用Post與服務器交互相關代碼
               
          */

              
          public void inTurnServer()
              
          {
                  
          // 服務器請求地址

                  String url = "http://localhost:80/testLogin/login";
                  
          // 用戶輸入的用戶名

                  String username = this.username.getString();
                  
          // 用戶輸入的密碼

                  String password = this.password.getString();
                  
          // 要發送的數據

                  String formData = "username=" + username + "&password=" + password;
                  
          // 轉換顯字節流

                  byte[] data = formData.getBytes();
                  
                  
          try 
          {            
                      
          // 用url建立一個Http連接(安全的)

                      HttpConnection conn = (HttpConnection) Connector.open(url);
                      
                      
          /****以下為 設置連接屬性****/

                      
          // 設置請求類型為POST
                      conn.setRequestMethod(HttpConnection.POST);            
                      
          // 設置一般的請求屬性

                      conn.setRequestProperty("Content-Type",
                              
          "application/x-www-form-urlencoded"
          );
                      conn.setRequestProperty(
          "User-Agent"
          ,
                              
          "Profile/MIDP-1.0 Configuration/CLDC-1.0"
          );
                      conn.setRequestProperty(
          "Content-Language""en-US"
          );
                      conn.setRequestProperty(
          "Accept""application/octet-stream"
          );
                      conn.setRequestProperty(
          "Connection""close"
          );
                      
          // 設置寫入流的長度

                      conn.setRequestProperty("Content-Length", Integer
                              .toString(data.length));

                      
          // 新建輸出流,對數據流進行操作

                      OutputStream os = conn.openOutputStream();
                      
          // 寫入要Post的數據

                      os.write(data);
                      os.close();
                      
                      
          // 得到Http響應代碼

                      int rc = conn.getResponseCode();
                      
          if (rc ==
           HttpConnection.HTTP_OK)
                      
          {
                          
          // 構建輸入流

                          DataInputStream dism = new DataInputStream(conn
                                  .openInputStream());
                          
                          
          // 讀取服務器返回的字節流

                          String result = dism.readUTF();
                          dism.close();
                          
                          
          // 判斷

                          if (result.equals("true"))
                          
          {
                              
          // 顯示登錄成功

                              this.initAlertOK();
                          }

                          
          if (result.equals("false"))
                          
          {
                              
          // 顯示登錄失敗

                              this.initAlertError();
                              
          // 將輸入框置空

                              this.username.delete(0this.username.getString().length());
                              
          this.password.delete(0this
          .password.getString().length());
                          }

                      }

                  }
           catch (IOException e)
                  
          {
                      e.printStackTrace();
                      System.out.println(
          "聯網出錯。"
          );
                      
          //如果請求路徑不正確,或屬性設置錯誤,或服務器端的問題導致無法正確聯網

                      error = new Alert("提示""聯網出錯"null, AlertType.ERROR);
                      display.setCurrent(error);
                  }

              }


              
          protected void destroyApp(boolean arg0) throws MIDletStateChangeException
              
          {

              }


              
          protected void pauseApp()
              
          {

              }


          }



          附一:服務器端Web.xml配置

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.4" 
              xmlns
          ="http://java.sun.com/xml/ns/j2ee"
           
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
           
              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee 
              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >

              
            
          <servlet>     
            
          <servlet-name>LoginServlet</servlet-name>

            
          <servlet-class>packageOne.LoginServlet</servlet-class>
            
          </servlet>  
            
            
          <servlet-mapping>
             
            
          <servlet-name>LoginServlet</servlet-name>
             
            
          <url-pattern>/login</url-pattern>
             
            
          </servlet-mapping>
                
              
          </web-app>



          附二:服務器端index.jsp配置(可選內容)

              <FORM  action="<%=request.getContextPath()%>/login" method="post" name="99">
              
          <input type="text" name="username" />
              
          <input type="text" name="password" />
              
          <INPUT type="submit" name="toLogin" value="登錄">
                
          </FORM>



          <End>

          posted on 2008-09-03 17:37 騎豬闖天下 閱讀(989) 評論(1)  編輯  收藏

          評論

          # re: [J2ME] J2ME客戶端用戶登錄驗證[未登錄] 2010-10-25 15:03 neil

          請問,可以把JSP端說得更詳細些嗎,最好有代碼,謝謝  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 蛟河市| 云林县| 太仓市| 仁怀市| 吴旗县| 临安市| 贵南县| 毕节市| 西畴县| 淮北市| 泾阳县| 台东市| 慈溪市| 孟村| 施秉县| 诏安县| 云林县| 鲁山县| 平度市| 拜城县| 泰和县| 师宗县| 铁力市| 巴中市| 兴隆县| 嵊泗县| 石棉县| 宜君县| 呼和浩特市| 永和县| 永年县| 呼玛县| 新巴尔虎左旗| 深泽县| 甘南县| 河北区| 宝坻区| 普定县| 韶山市| 盖州市| 江城|