04_android入门_采用HttpURLConnection的GET方式实现登陆案例
来源:互联网 发布:ubuntu如何设置源 编辑:程序博客网 时间:2024/06/05 16:23
1.概述
每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。
2.在03_android入门_采用RelativeLayout实现登陆界面效果的案例继续完善 效果如下:
点击登陆按钮 在服务器的控制台看到的结果
在点击登陆按钮之前,先通过eclipse中所带的LogCat的工具,点击
+号 弹出对话框
添加过滤的名称和过滤的标识 点击ok完成。
当点击登陆按钮之后即可在LogCat中看到执行的结果
当你输入错误的用户名和密码的时候你可以看到如下效果
3.具体LoginActivity代码的实现如下:(备注:在代码中我添加了详细的注释请仔细阅读)
package www.csdn.net.lesson03;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.widget.EditText;import android.widget.Toast;public class LoginActivity extends Activity {// 声明控件对象private EditText et_name, et_pass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置显示的视图setContentView(R.layout.activity_login);// 通过 findViewById(id)方法获取用户名的控件对象et_name = (EditText) findViewById(R.id.et_name);// 通过 findViewById(id)方法获取用户密码的控件对象et_pass = (EditText) findViewById(R.id.et_pass);}/** * 通过android:onClick="login"指定的方法 , 要求这个方法中接受你点击控件对象的参数v * * @param v */public void login(View v) {// 获取点击控件的idint id = v.getId();// 根据id进行判断进行怎么样的处理switch (id) {// 登陆事件的处理case R.id.btn_login:// 获取用户名final String userName = et_name.getText().toString();// 获取用户密码final String userPass = et_pass.getText().toString();if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {Toast.makeText(this, "用户名或者密码不能为空", Toast.LENGTH_LONG).show();} else {System.out.println("----------------------发送请求到服务器----------------------");// <span style="color:#ff6666;">访问网络 (需要一个网络的权限) <uses-permission// android:name="android.permission.INTERNET"/></span>// <span style="color:#ff6666;">访问网络(耗时的操作) 避免阻塞主线程(UI) 需要开启新的子线程来处理</span>new Thread() {public void run() {// 调用loginByGet方法loginByGet(userName, userPass);};}.start();}break;default:break;}}/** * 通过GET方式发送的请求 * * @param userName * @param userPass */public void loginByGet(String userName, String userPass) {try {// 设置请求的地址 通过URLEncoder.encode(String s, String enc)// 使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式String spec = "<span style="color:#ff6666;">http://172.16.237.200:8080/video/login.do</span>?username="+ URLEncoder.encode(userName, "UTF-8") + "&userpass="+ URLEncoder.encode(userPass, "UTF-8");// 根据地址创建URL对象(网络访问的url)URL url = new URL(spec);// url.openConnection()打开网络链接HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setRequestMethod("GET");// 设置请求的方式urlConnection.setReadTimeout(5000);// 设置超时的时间urlConnection.setConnectTimeout(5000);// 设置链接超时的时间// 设置请求的头urlConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");// 获取响应的状态码 404 200 505 302if (urlConnection.getResponseCode() == 200) {// 获取响应的输入流对象InputStream is = urlConnection.getInputStream();// 创建字节输出流对象ByteArrayOutputStream os = new ByteArrayOutputStream();// 定义读取的长度int len = 0;// 定义缓冲区byte buffer[] = new byte[1024];// 按照缓冲区的大小,循环读取while ((len = is.read(buffer)) != -1) {// 根据读取的长度写入到os对象中os.write(buffer, 0, len);}// 释放资源is.close();os.close();// 返回字符串String result = new String(os.toByteArray());System.out.println("***************" + result+ "******************");} else {System.out.println("------------------链接失败-----------------");}} catch (Exception e) {e.printStackTrace();}}}
4.项目清单文件(AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="www.csdn.net.lesson03" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <!-- 添加访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="www.csdn.net.lesson03.LoginActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
5.关于服务器中我仅写一个Servlet进行处理相应的请求处理
package www.csdn.net.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {/** * */private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求的参数值String userName = request.getParameter("username");String userPass = request.getParameter("userpass");System.out.println("在没有转码之前的"+userName+"---"+userPass);//GET方式的请求乱码处理userName = new String(userName.getBytes("ISO8859-1"),"UTF-8");userPass = new String(userPass.getBytes("ISO8859-1"),"UTF-8");System.out.println("在转码之后---"+userName+"---"+userPass);if("陈红军".equals(userName)&&"123".equals(userPass)){//响应登陆成功的信息response.getOutputStream().write("登陆成功".getBytes()); }else{//相应登陆失败的信息response.getOutputStream().write("登陆失败".getBytes());}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}对应的web.xml文件的配置是:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>video</display-name> <servlet> <description></description> <display-name>LoginServlet</display-name> <servlet-name>LoginServlet</servlet-name> <servlet-class>www.csdn.net.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> </web-app>
6.关于程序中学生经常出现的bug分析
6.1.忘记在项目清单文件中添加访问网络的权限.
<!-- 添加访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET"/>那么程序运行的时候会出现如下bug
6.2.在按钮点击的事件处理中直接调用
loginByGet(userName, userPass);方法没有在子线程中调用
loginByGet(userName, userPass);方法 就会出现如下bug
bug说明:在android4.0以后的版本中要想发送一个网络的请求,就必须把这个请求写在子线程中,否则就会出现如上的bug
6.3.在发送网路的请求的时候把请求的地址:
http://172.16.237.200:8080/video/login.do写成了
http://localhost:8080/video/login.do或者http://127.0.0.1:8080/video/login.do
就会出现如下bug:
以上理解之后请同学们思考怎么把返回的数据写在下图的位置尼
- 04_android入门_采用HttpURLConnection的GET方式实现登陆案例
- 06_android入门_采用HttpURLConnection的POST方式实现登陆案例
- 06_android入门_采用HttpURLConnection的POST方式实现登陆案例
- 07_android入门_采用HttpClient的POST方式、GET方式分别实现登陆案例
- android入门_采用HttpURLConnection的GET方式实现登陆案例
- 09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例
- 09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例
- 采用HttpURLConnection的GET方式实现登陆案例
- android入门_采用HttpClient的POST方式、GET方式分别实现登陆案例
- android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例
- 采用HttpURLConnection的POST方式实现登陆案例
- android入门之采用HttpClient的POST方式、GET方式分别实现登陆案例
- 03_android入门_采用RelativeLayout实现登陆界面效果
- Android 采用HttpClient的POST方式、GET方式分别实现登陆案例
- 采用HttpClient的POST方式、GET方式分别实现登陆案例
- 05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)
- HttpURLConnection HttpClient AsyncHttpClient 实现Post或者Get方式登陆
- 02_android入门_实现短信/彩信发送的功能
- ios crash log获取和符号化
- jquery 获取 设置光标插件(转载)
- Ubuntu下查看CHM文档
- ios7中引入的新类:nsprogress介绍
- 菜鸟也能学cocos2dx3.0 物理的世界Physics-浅析篇(四)
- 04_android入门_采用HttpURLConnection的GET方式实现登陆案例
- disruptor简单示例
- Spring MVC 页面传单个字符串后台接收不到
- 底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
- android系统中使用TelephonyManager类来获取imei号和其他手机信息
- Java并发教程(Oracle官方资料)
- colordialog对象在delphi中哪里加入
- eclipse修改字体大小
- qt GUI程序 改为控制台程序