精华内容
下载资源
问答
  • Android服务器端开发

    千次阅读 2016-09-16 16:00:14
    Android服务器端开发 html/css:制作静态页面 servlet:动态页面 看界面与服务器之间有没有数据的交互 Web开发里面的模式 C/S:客服端/服务器端 优点:安全性高,客户端是可以分担服务器端的一些功能模块 ...

    Android服务器端开发

    1. html/css:制作静态页面
    2. servlet:动态页面
      看界面与服务器之间有没有数据的交互
    Web开发里面的模式

    C/S:客服端/服务器端
    优点:安全性高,客户端是可以分担服务器端的一些功能模块
    缺点:必须安装客服端,开发成本大,维护比较困难,不能无缝升级
    B/S:浏览器/服务器端
    优点:只要开发服务器端就可以了,可以实现无缝升级
    缺点:安全性低,所有的功能都是由服务器端去完成的(高强度的负载);
    O2O 线上和线下(去除了中介)
    P2P (点到点)

    互联网:虚拟的网络环境,将世界上所有的能上网的东西放在一个网络环境中,互相发送邮件,资源的共享。

    万维网:一种网络协议 www.baidu.com World Wide Web
    应用层:http https
    传输层:TCP/IP

    J2SE(核心基础JAVA) J2EE(企业级开发)

    CGI:公共网关接口 CGI每次都会启动一个进程来处理客户端发来的请求,效率比较低。CGI遵循HTTP协议,多语言开发:C,JAVA
    Servlet:API在J2EE。由SUN公司运营管理 Servlet每次都会启动一个轻量级的线程来处理客户端发来的请求,效率比较高
    简单概念:Servlet就是运行在服务器端的JAVA代码。有自己的一套API
    专业概念:Servlet他是一个组件(用很少的代码去完成一个功能模块)(server applet)

    服务器:就是一台主机,安装一些软件
    Tomcat:服务器端的容器

    • bin:可执行的文件
    • webapps:所有部署到服务器上的代码全都在这个文件夹里面

    三种方式写服务器端文件。

    1.实现Servlet接口,从写里面的回调方法
    2.外部想要访问Servlet,Servlet就必须注册并且向外界提供访问路径(Tomcat7.0之前的必须在WebContent目录下web.xml文件中配置,之后的可以直接利用注解@WebServlet("/hello"))

    1. 实现implements Servlet这个接口。必须重写里面的方法

       // 收到请求的时候回调
       @Override
       public void service(ServletRequest arg0, ServletResponse response)
           throws ServletException, IOException {
       // TODO Auto-generated method stub
       // Servlet线程不安全,如果你要让N个线程同时去操控一个共有的属性
       // SerVlet里面就不去写成员变量,都携程局部变量(每个线程有自己的变量名)
       // int i
       // i++;
       // 设置编码
       response.setCharacterEncoding("GBK");
       PrintWriter writer = arg1.getWriter();
       writer.write("这是我的第一个Serlvet");
       writer.flush();
       writer.close();
       System.out.println("service")
       }
    2. 在JAVAResource下面新建一个类继承extends GenericServlet在重写Service方法

        // TODO Auto-generated method stub
        response.setContentType("text/xml");
        response.setCharacterEncoding("GBk");
        PrintWriter writer = arg1.getWriter();
        writer.write("<student><name>张三</name></student>");
        writer.flush();
        writer.close();
    1. 第三种是官方建议的直接新建Servlet类似于直接新建一个Activity一样。它是继承于HttpServlet,我们只需在doGet或是doPost()方法中有一个调用对方就可以了。

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // TODO Auto-generated method stub
       response.setCharacterEncoding("GBK");
       response.setContentType("text/html");
       PrintWriter writer = response.getWriter();
       writer.write("<html><img src='aa.png'></html>");
       writer.flush();
       writer.close();
        }

      这三种方式最基层就是实现Servlet接口,其次是继承GenericService。最后才是HttpServlet



    文/清枫_小天(简书作者)
    原文链接:http://www.jianshu.com/p/67ef863dc2af
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
    展开全文
  • Android开发学习——android服务器端数据交互 1.首先搭建服务器端。  使用MyEclipse开发工具 public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest ...

    Android开发学习——android与服务器端数据交互

    1.首先搭建服务器端。

     使用MyEclipse开发工具

    复制代码
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            
            ArrayList<Food> food = new ArrayList<Food>();
            Gson g = new Gson();
            
            
            Food f1 = new Food(1,"1111","1111","/cinema_1.jpg");
            Food f2 = new Food(2,"2222","22222","/cinema_2.jpg");
            Food f3 = new Food(3,"3333","33333","/food_1.jpg");
            Food f4 = new Food(4,"44444","4444","/food_2.jpg");
            Food f5 = new Food(5,"55555","5555","/hotel_1.jpg");
            
            food.add(f1);
            food.add(f2);
            food.add(f3);
            food.add(f4);
            food.add(f5);
            
            boolean  isNextPage = false;
            Map<String,Object> map = new HashMap<String,Object>();
            
            map.put("foodList", food);
            map.put("isNextPage", isNextPage);
            
            resp.setContentType("text/html;charset=utf-8");
            
            PrintWriter  out = resp.getWriter();
            out.print(g.toJson(map));
            out.close();
    }
    }
    复制代码

    上述代码所需的Food实体如下:

    复制代码
    public class Food implements Serializable{
        private int id;
        
        private String name;
    
        private String desc;
        
        private String imgPath;
        
        public Food(int id, String name, String desc, String imgPath) {
            super();
            this.id = id;
            this.name = name;
            this.desc = desc;
            this.imgPath = imgPath;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public String getImgPath() {
            return imgPath;
        }
    
        public void setImgPath(String imgPath) {
            this.imgPath = imgPath;
        }
    
    }
    复制代码

    我们在浏览器中访问

    可以获取到结果,说明服务器端是正常的。

    2.服务器端搭建好了之后,我们搭建android端

    复制代码
    public class MainActivity extends Activity {
    
        private ListView lv;
        
        private List<Food>  data = new ArrayList<Food>();
        
        private MyAdapter mAdapter;
        
        private ProgressDialog  pd;
        
        private boolean isNextPage;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            lv = (ListView) findViewById(R.id.lv);
        
            pd = new ProgressDialog(this);
            
            mAdapter = new MyAdapter(this, data);
            
            lv.setAdapter(mAdapter);
            
            new MyFoodTask().execute();
            
            
        }
    
        
        private class MyFoodTask extends AsyncTask<String, Void, Map<String,Object>>{
            @Override
            protected void onPreExecute() {
                
                pd.setMessage("Loading...");
                
            }
    
            
    
            @Override
            protected Map<String, Object> doInBackground(String... params) {
            
                String path  = "http://10.0.2.2:8080/TestWeb/bbb";
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(path);
                
                try {
                    HttpResponse resp = client.execute(get);
                    if(resp.getStatusLine().getStatusCode()==200){
                        
                        HttpEntity entity = resp.getEntity();
                        String result = EntityUtils.toString(entity);
                        Log.i("111", "result="+result);
                        Map<String,Object> map =  parseJson(result);
                        return map;
                        
                    }
                
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
                
                return null;
            }
            
            
            @Override
            protected void onPostExecute(Map<String, Object> result) {
                    
                pd.dismiss();
                isNextPage =  (Boolean) result.get("isNextPage");
                data.addAll(  (List<Food>) result.get("foodList")  );
                mAdapter.notifyDataSetChanged();
                
                for(int i = 0;i<data.size();i++){
                    
                    Food f = data.get(i);
                    
                    new MyImgTask().execute(f);
                
            }    
        }
        
        
        private Map<String,Object> parseJson(String json) throws Exception{
            
            Map<String ,Object> result = new HashMap<String,Object>();
            List<Food> lists = new ArrayList<Food>();
            JSONObject  bigObj = new JSONObject(json);
            result.put("isNextPage",  bigObj.getBoolean("isNextPage"));
            JSONArray array = bigObj.getJSONArray("foodList");
            Food  f = null;
            for(int i =0 ;i<array.length();i++){
                f = new Food();
                JSONObject smallObj = array.getJSONObject(i);
                
                f.setId( smallObj.getInt("id") );
                f.setName( smallObj.getString("name") );
                f.setDesc(smallObj.getString("desc"));
                f.setImgPath( smallObj.getString("imgPath") );
                lists.add(f);
            }
            result.put("foodList", lists);
            return result;
            
            
        }
        
        
        private class MyImgTask extends AsyncTask<Food, Void, Food>{
    
            @Override
            protected Food doInBackground(Food... params) {
            
                Food f =  params[0];
                String imgPath = "http://10.0.2.2:8080/TestWeb"+f.getImgPath();
                
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(imgPath);    
                try {
                    HttpResponse resp = client.execute(get);
                    if(resp.getStatusLine().getStatusCode()==200){
                        
                        HttpEntity entity = resp.getEntity();
                        byte img [] = EntityUtils.toByteArray(entity);                
                        f.setImgData(img);            
                    }
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return f;        
            }
    
            @Override
            protected void onPostExecute(Food result) {
                mAdapter.notifyDataSetChanged();
            }        
        }
        }
    }
    复制代码

    所需的Food实体:

    复制代码
    public class Food implements Serializable{
    
        private int id;
        
        private String name;
        
        private String desc;
        
        private String imgPath;
        
        private byte imgData [];
        
        
        
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public String getImgPath() {
            return imgPath;
        }
    
        public void setImgPath(String imgPath) {
            this.imgPath = imgPath;
        }
    
        public byte[] getImgData() {
            return imgData;
        }
    
        public void setImgData(byte[] imgData) {
            this.imgData = imgData;
        }
    }
    复制代码

    所需的适配器:

    复制代码
    public class MyAdapter  extends BaseAdapter{
    
        private Context context;
        
        private List<Food>  data ;
        
        
        public MyAdapter(Context context, List<Food> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return data.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return data.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){
                
                convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
                
            }
            ImageView iv_img = (ImageView) convertView.findViewById(R.id.iv_img);
            TextView tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            TextView tv_desc = (TextView) convertView.findViewById(R.id.tv_desc);
            
            Food food = data.get(position);
            
            if(food.getImgData()==null){
                iv_img.setImageResource(R.drawable.cinema_1);
            }else{
                byte [] imgData = food.getImgData();
                Bitmap bm  = BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
                iv_img.setImageBitmap(bm);
            }
            
            tv_name.setText( food.getName());
            tv_desc.setText( food.getDesc());
            
            return convertView;
        }
    
    }
    复制代码

    我们启动模拟器,得到运行结果:

    展开全文
  • 最近要搭建一个Android的APP服务器端,但是我会的语言就是JAVA和C++,所以想用JAVA搭建服务器端。请问各位前辈,用JAVA编移动应用的服务器端可以吗?有这方面的框架没有?我应该如何学习?请前辈指教,小弟在这里先...
  • Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34 454人阅读 评论(1) 收藏 举报  分类: Android(18) Java...
     

    Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)

    标签: 注册登录Android开发servlet
     454人阅读 评论(1) 收藏 举报
     分类:
      

    目录(?)[+]

    时隔半年再次敲动键盘,发现时间过得真心快。原本自己该干的事情被琐碎事情给耽搁了,现在想想该重新振奋起来好好努力。闲话到此,今天给大家带来的教程是常规化也是常见的登录注册上传头像等操作,本篇也是从项目中挑出部分,项目是真实测试的,完全能实现如上操作,所以各位不用担心,由于时间原因,就不连接服务器测试了,本篇文章也只是演示下过程。包括了客户端和服务器的部分程序,当然了该篇博客仅限学习,下面进入正文。下面是项目的注册登录部分在模拟器上的演示:


    在开始讲解咱们的项目之前咱们先整理下思路。在学习本篇文章前请了解并学习下列相关知识:

    • okhttp网络请求库最新版本的使用方法(建议去github下载相应的okhttp工具类)
    • Mysql数据库进行数据存储
    • servlet相关知识(请参考 超详细servlet+jdbc+html+css实现后台管理登陆)
    • Base64图片编码
    • Tomcat服务器实现虚拟映射路径设置(在本篇文章中将图片保存在服务器的虚拟映射路径中)

    注意:本篇文章可能不能完全把代码完全注释讲解,所以敬请大家有点耐心。

    客户端:

    1. 编写注册界面的xml布局文件
    2. 实现注册界面的逻辑实现
    3. 编写登录界面的XML布局文件
    4. 实现登录界面的逻辑实现  
    首先我们看到客户端的整体的结构图:


    注册界面布局:wyt_register.xml

    [html] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     xmlns:app="http://schemas.android.com/apk/res-auto"  
    4.     android:id="@+id/register"  
    5.     android:orientation="vertical"  
    6.     android:layout_width="match_parent"  
    7.     android:layout_height="match_parent"  
    8.     android:background="#f5f5f5"  
    9.     >  
    10.     <LinearLayout  
    11.         android:layout_width="match_parent"  
    12.         android:layout_height="wrap_content"  
    13.         android:orientation="vertical">  
    14.         <com.mero.wyt_register.widget.CustomTitleBar  
    15.             android:layout_width="match_parent"  
    16.             android:layout_height="80dp"  
    17.             app:text="用户注册"  
    18.             app:background_color="@color/mediumturquoise"  
    19.             />  
    20.         <LinearLayout  
    21.             android:layout_width="match_parent"  
    22.             android:layout_height="150dp"  
    23.             android:orientation="vertical"  
    24.             android:background="@color/mediumturquoise">  
    25.             <RelativeLayout  
    26.                 android:layout_width="match_parent"  
    27.                 android:layout_height="match_parent">  
    28.                 <ImageView  
    29.                     android:id="@+id/img_upload_img"  
    30.                     android:layout_width="100dp"  
    31.                     android:layout_height="100dp"  
    32.                     android:layout_centerHorizontal="true"  
    33.                     android:src="@drawable/menu_item_theme"/>  
    34.                 <TextView  
    35.                     android:id="@+id/tx_upload_img"  
    36.                     android:layout_below="@id/img_upload_img"  
    37.                     android:layout_width="wrap_content"  
    38.                     android:layout_height="wrap_content"  
    39.                     android:text="上传头像"  
    40.                     android:layout_centerHorizontal="true"  
    41.                     android:textSize="15sp"  
    42.                     android:gravity="fill_vertical"  
    43.                     android:textColor="#fff"/>  
    44.             </RelativeLayout>  
    45.         </LinearLayout>  
    46.   
    47.     </LinearLayout>  
    48.   
    49.     <LinearLayout  
    50.         android:layout_width="match_parent"  
    51.         android:layout_height="100dp"  
    52.         android:orientation="vertical"  
    53.         android:background="#FFF">  
    54.         <LinearLayout  
    55.             android:layout_width="match_parent"  
    56.             android:layout_height="50dp"  
    57.             android:orientation="horizontal">  
    58.             <ImageView  
    59.                 android:id="@+id/img_register_account"  
    60.                 android:layout_width="32dp"  
    61.                 android:layout_height="32dp"  
    62.                 android:src="@drawable/account"  
    63.                 android:layout_marginLeft="10dp"  
    64.                 android:layout_gravity="center_vertical"/>  
    65.             <EditText  
    66.                 android:id="@+id/edt_register_account"  
    67.                 android:layout_width="match_parent"  
    68.                 android:layout_height="50dp"  
    69.                 android:hint="账号"  
    70.                 android:textColorHighlight="#77000000"  
    71.                 android:textColor="#000000"  
    72.                 android:maxLines="1"  
    73.                 android:background="@null"  
    74.                 android:gravity="center_vertical"  
    75.                 android:paddingLeft="15dp"  
    76.                 android:textSize="15sp"  
    77.                 android:textColorHint="#77000000"  
    78.                 />  
    79.         </LinearLayout>  
    80.         <TextView  
    81.             android:layout_width="match_parent"  
    82.             android:layout_height="1dp"  
    83.             android:background="#f5f5f5"/>  
    84.         <LinearLayout  
    85.             android:layout_width="match_parent"  
    86.             android:layout_height="match_parent"  
    87.             android:orientation="horizontal"  
    88.             android:background="#FFF"  
    89.             android:baselineAligned="false">  
    90.             <ImageView  
    91.                 android:id="@+id/img_register_pwd"  
    92.                 android:layout_width="32dp"  
    93.                 android:layout_height="32dp"  
    94.                 android:layout_marginLeft="10dp"  
    95.                 android:src="@drawable/pwd"  
    96.                 android:layout_gravity="center_vertical"/>  
    97.             <EditText  
    98.                 android:id="@+id/edt_register_pwd"  
    99.                 android:layout_width="match_parent"  
    100.                 android:layout_height="match_parent"  
    101.                 android:hint="密码"  
    102.                 android:inputType="textPassword"  
    103.                 android:maxLines="1"  
    104.                 android:textSize="15sp"  
    105.                 android:textColorHighlight="#77000000"  
    106.                 android:textColor="#000000"  
    107.                 android:background="@null"  
    108.                 android:paddingLeft="15sp"  
    109.                 android:textColorHint="#77000000"  
    110.                 android:layout_weight="1" />  
    111.         </LinearLayout>  
    112.     </LinearLayout>  
    113.     <RelativeLayout  
    114.         android:layout_width="match_parent"  
    115.         android:layout_height="50dp"  
    116.         android:layout_marginTop="20dp">  
    117.         <com.mero.wyt_register.widget.RoundButton  
    118.             android:id="@+id/btn_to_register"  
    119.             android:layout_width="300dp"  
    120.             android:layout_height="50dp"  
    121.             android:text="注册"  
    122.             android:textColor="#FFF"  
    123.             android:textStyle="bold"  
    124.             android:textSize="15sp"  
    125.             android:gravity="center"  
    126.             android:layout_centerInParent="true"  
    127.             app:btnCornerRadius="10dp"  
    128.             app:btnSolidColor="@color/mediumturquoise"  
    129.             app:btnPressedRatio="1.5"  
    130.             />  
    131.     </RelativeLayout>  
    132. </LinearLayout>  

    效果如下:

    登录界面布局wyt_login.xml:

    [html] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     xmlns:app="http://schemas.android.com/apk/res-auto"  
    4.     android:orientation="vertical"  
    5.     android:layout_width="match_parent"  
    6.     android:layout_height="match_parent"  
    7.     android:background="#f5f5f5"  
    8.     >  
    9.     <com.mero.wyt_register.widget.CustomTitleBar  
    10.       android:layout_width="match_parent"  
    11.       android:layout_height="80dp"  
    12.       app:text="用户登录"  
    13.       app:background_color="@color/mediumturquoise"  
    14.         />  
    15.   
    16.     <LinearLayout  
    17.         android:layout_width="match_parent"  
    18.         android:layout_height="100dp"  
    19.         android:orientation="vertical"  
    20.         android:background="#FFF">  
    21.         <LinearLayout  
    22.             android:layout_width="match_parent"  
    23.             android:layout_height="50dp"  
    24.             android:orientation="horizontal">  
    25.             <ImageView  
    26.                 android:id="@+id/img_login_account"  
    27.                 android:layout_width="32dp"  
    28.                 android:layout_height="32dp"  
    29.                 android:src="@drawable/account"  
    30.                 android:layout_marginLeft="10dp"  
    31.                 android:layout_gravity="center_vertical"/>  
    32.             <EditText  
    33.                 android:id="@+id/edt_login_account"  
    34.                 android:layout_width="match_parent"  
    35.                 android:layout_height="50dp"  
    36.                 android:hint="账号"  
    37.                 android:textColorHighlight="#77000000"  
    38.                 android:textColor="#000000"  
    39.                 android:maxLines="1"  
    40.                 android:background="@null"  
    41.                 android:gravity="center_vertical"  
    42.                 android:paddingLeft="15dp"  
    43.                 android:textSize="15sp"  
    44.                 android:textColorHint="#77000000"  
    45.                 />  
    46.         </LinearLayout>  
    47.         <TextView  
    48.             android:layout_width="match_parent"  
    49.             android:layout_height="1dp"  
    50.             android:background="#f5f5f5"/>  
    51.         <LinearLayout  
    52.             android:layout_width="match_parent"  
    53.             android:layout_height="match_parent"  
    54.             android:orientation="horizontal"  
    55.             android:background="#FFF"  
    56.             android:baselineAligned="false">  
    57.             <ImageView  
    58.                 android:id="@+id/img_login_pwd"  
    59.                 android:layout_width="32dp"  
    60.                 android:layout_height="32dp"  
    61.                 android:layout_marginLeft="10dp"  
    62.                 android:src="@drawable/pwd"  
    63.                 android:layout_gravity="center_vertical"/>  
    64.             <EditText  
    65.                 android:id="@+id/edt_login_pwd"  
    66.                 android:layout_width="match_parent"  
    67.                 android:layout_height="match_parent"  
    68.                 android:inputType="textPassword"  
    69.                 android:hint="密码"  
    70.                 android:maxLines="1"  
    71.                 android:textSize="15sp"  
    72.                 android:textColorHighlight="#77000000"  
    73.                 android:textColor="#000000"  
    74.                 android:background="@null"  
    75.                 android:paddingLeft="15sp"  
    76.                 android:textColorHint="#77000000"  
    77.                 android:layout_weight="1" />  
    78.         </LinearLayout>  
    79.     </LinearLayout>  
    80.     <RelativeLayout  
    81.         android:layout_width="match_parent"  
    82.         android:layout_height="50dp"  
    83.         android:layout_marginTop="20dp">  
    84.         <com.mero.wyt_register.widget.RoundButton  
    85.             android:id="@+id/btn_login_click_to_login"  
    86.             android:layout_width="300dp"  
    87.             android:layout_height="50dp"  
    88.             android:text="立即登录"  
    89.             android:textColor="@color/white"  
    90.             android:textSize="15sp"  
    91.             android:gravity="center"  
    92.             android:layout_centerInParent="true"  
    93.             app:btnCornerRadius="10dp"  
    94.             app:btnSolidColor="@color/mediumturquoise"  
    95.             app:btnPressedRatio="1.5"  
    96.             />  
    97.     </RelativeLayout>  
    98.     <RelativeLayout  
    99.         android:layout_width="match_parent"  
    100.         android:layout_height="50dp">  
    101.         <TextView  
    102.             android:id="@+id/tx_login_click_to_register"  
    103.             android:layout_width="wrap_content"  
    104.             android:layout_height="match_parent"  
    105.             android:layout_alignParentRight="true"  
    106.             android:text="点击注册"  
    107.             android:textColor="#33aa44"  
    108.             android:textSize="15sp"  
    109.             android:textStyle="bold"  
    110.             android:paddingRight="25dp"  
    111.             android:paddingTop="25dp"  
    112.             />  
    113.     </RelativeLayout>  
    114. </LinearLayout>  

    登录界面效果如下:


    接下来是我们的注册界面的逻辑代码:

    RegisterAty.java

    [java] view plain copy
    1. package com.mero.wyt_register.activity;  
    2.   
    3. import android.app.ProgressDialog;  
    4. import android.content.Intent;  
    5. import android.database.Cursor;  
    6. import android.graphics.Bitmap;  
    7. import android.graphics.BitmapFactory;  
    8. import android.net.Uri;  
    9. import android.os.Handler;  
    10. import android.os.Message;  
    11. import android.provider.MediaStore;  
    12. import android.text.TextUtils;  
    13. import android.view.Gravity;  
    14. import android.view.View;  
    15. import android.view.animation.AnimationSet;  
    16. import android.view.animation.TranslateAnimation;  
    17. import android.widget.EditText;  
    18. import android.widget.ImageView;  
    19. import android.widget.Toast;  
    20.   
    21. import com.mero.wyt_register.Base.BaseSwipeBackLayout;  
    22. import com.mero.wyt_register.Config;  
    23. import com.mero.wyt_register.R;  
    24. import com.mero.wyt_register.net.RegisterAction;  
    25. import com.mero.wyt_register.utils.AppUtils;  
    26. import com.mero.wyt_register.utils.Base64Utils;  
    27. import com.mero.wyt_register.utils.SDCardUtils;  
    28. import com.mero.wyt_register.widget.RoundButton;  
    29. import com.mero.wyt_register.widget.SelectPicPopupWindow;  
    30.   
    31. /** 
    32.  * Created by chenlei on 2016/11/17. 
    33.  */  
    34.   
    35. public class RegisterAty extends BaseSwipeBackLayout implements View.OnClickListener {  
    36.     private ImageView img_upload;  
    37.     private EditText edt_account = null;  
    38.     private EditText edt_pwd = null;  
    39.     private RoundButton btn_register = null;  
    40.     private static final int RESULT_OPEN_IMAGE = 1;  
    41.     private Bitmap bitmap ;//存放裁剪后的头像  
    42.     private String fileName;//头像名称  
    43.     private String picturePath;//头像路径  
    44.     private ProgressDialog pd;//进度条  
    45.     private static final int DISMISS = 1000;//进度条消失  
    46.     private SelectPicPopupWindow selectPicPopupWindow;  
    47.     @Override  
    48.     public void initView() {  
    49.         img_upload = (ImageView) findViewById(R.id.img_upload_img);  
    50.         edt_account = (EditText) findViewById(R.id.edt_register_account);  
    51.         edt_pwd = (EditText) findViewById(R.id.edt_register_pwd);  
    52.         img_upload.setOnClickListener(this);  
    53.         btn_register = (RoundButton) findViewById(R.id.btn_to_register);  
    54.         btn_register.setOnClickListener(this);  
    55.     }  
    56.     @Override  
    57.     public void initData() {  
    58.   
    59.     }  
    60.     private final Handler handler = new Handler(){  
    61.         @Override  
    62.         public void handleMessage(Message msg) {  
    63.             if(msg.what == DISMISS){  
    64.                 pd.dismiss();  
    65.             }  
    66.         }  
    67.     };  
    68.     @Override  
    69.     public int getLayoutResourceId() {  
    70.         return R.layout.wyt_register;  
    71.     }  
    72.   
    73.     @Override  
    74.     public int getDialogIcon() {  
    75.         return 0;  
    76.     }  
    77.   
    78.     @Override  
    79.     public int setStatusBarColor() {  
    80.         return 0;  
    81.     }  
    82.   
    83.     private static final int CAMERA_REQUEST_CODE = 1;//拍照返回码  
    84.     private static final int GALLERY_REQUEST_CODE = 2;//相册返回码  
    85.     @Override  
    86.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    87.         super.onActivityResult(requestCode, resultCode, data);  
    88.         //如果是拍照返回  
    89.         if(requestCode==CAMERA_REQUEST_CODE&&resultCode==RESULT_OK&&data!=null) {  
    90.             Uri uri = data.getData();  
    91.             if (uri != null) {  
    92.                 Cursor cursor = this.getContentResolver().query(uri, nullnullnullnull);  
    93.                 if (cursor.moveToFirst()) {  
    94.                     picturePath = cursor.getString(cursor.getColumnIndex("_data"));  
    95.                     fileName = getBitmapName(picturePath);  
    96.                     bitmap = AppUtils.toRoundBitmap(BitmapFactory.decodeFile(picturePath));  
    97.                     //进行裁剪  
    98.                     img_upload.setImageBitmap(bitmap);  
    99.                 }  
    100.             } else {  
    101.                 Toast.makeText(this,"保存照片失败",Toast.LENGTH_SHORT).show();  
    102.                 return;  
    103.             }  
    104.         }  
    105.   
    106.   
    107.         //如果是相册返回  
    108.         if(requestCode==GALLERY_REQUEST_CODE&&resultCode==RESULT_OK&&null!=data){  
    109.             Uri selectedImage = data.getData();  
    110.             String[] filePathColumn = {MediaStore.Images.Media.DATA};  
    111.   
    112.             Cursor cursor = getContentResolver().query(selectedImage,  
    113.                     filePathColumn, nullnullnull);  
    114.             cursor.moveToFirst();  
    115.             int columnIndex = cursor.getColumnIndex(filePathColumn[0]);  
    116.             picturePath = cursor.getString(columnIndex);  
    117.             fileName = getBitmapName(picturePath);  
    118.             cursor.close();  
    119.             //裁剪为圆形头像  
    120.             if(SDCardUtils.isSDCardEnable()){  
    121.                 bitmap = AppUtils.toRoundBitmap(BitmapFactory.decodeFile(picturePath));  
    122.                 img_upload.setImageBitmap(bitmap);//设置到图片  
    123.             }else {  
    124.                 return;  
    125.             }  
    126.         }else {  
    127.             return;  
    128.         }  
    129.     }  
    130.     //获取图片的名称  
    131.     public String getBitmapName(String picPath){  
    132.         String bitmapName="";  
    133.         String[]  s = picPath.split("/");  
    134.         bitmapName = s[s.length-1];  
    135.         return bitmapName;  
    136.     }  
    137.     @Override  
    138.     public void onClick(View v) {  
    139.         switch (v.getId()) {  
    140.             case R.id.img_upload_img:  
    141.                 //判断是否从相册或者调用相机实现  
    142.                 selectPicPopupWindow = new SelectPicPopupWindow(RegisterAty.thisnew View.OnClickListener() {  
    143.                     @Override  
    144.                     public void onClick(View v) {  
    145.                         selectPicPopupWindow.dismiss();  
    146.                         switch (v.getId()){  
    147.                             case R.id.btn_select_camera:  
    148.                                 //从相机拍照  
    149.                                 Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
    150.                                 startActivityForResult(i,1);  
    151.                                 break;  
    152.                             case R.id.btn_select_pic_photo_lib:  
    153.                                 //从图库选择照片  
    154.                                 Intent ii = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
    155.                                 startActivityForResult(ii, RESULT_OPEN_IMAGE);  
    156.                                 break;  
    157.                         }  
    158.                     }  
    159.                 });  
    160.                 View view = RegisterAty.this.findViewById(R.id.register);  
    161.                 selectPicPopupWindow.showAtLocation(view, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL,0,0);  
    162.                 AnimationSet animationSet = new AnimationSet(true);  
    163.                 TranslateAnimation translateAnimation = new TranslateAnimation(1,0,1,0);  
    164.                 translateAnimation.setDuration(1000);  
    165.                 animationSet.addAnimation(translateAnimation);  
    166.                 view.startAnimation(translateAnimation);  
    167.                 break;  
    168.             case R.id.btn_to_register:  
    169.                 //点击的是注册按钮  
    170.                 final String wyt_account = edt_account.getText().toString();//获取账号  
    171.                 final String wyt_pwd = edt_pwd.getText().toString();//获取密码  
    172.                 if(TextUtils.isEmpty(wyt_account)){  
    173.                     Toast.makeText(RegisterAty.this,"账号不能为空",Toast.LENGTH_SHORT).show();  
    174.                     return;  
    175.                 }  
    176.                 if(TextUtils.isEmpty(wyt_pwd)){  
    177.                     Toast.makeText(RegisterAty.this,"密码不能为空",Toast.LENGTH_SHORT).show();  
    178.                     return;  
    179.                 }  
    180.                 if(wyt_account.length()>20){  
    181.                     Toast.makeText(RegisterAty.this,"您输入的账号过长",Toast.LENGTH_SHORT).show();  
    182.                     return;  
    183.                 }  
    184.                 if(wyt_pwd.length()>20){  
    185.                     Toast.makeText(RegisterAty.this,"您输入的密码过长",Toast.LENGTH_SHORT).show();  
    186.                     return;  
    187.                 }  
    188.                 pd = ProgressDialog.show(this,"温馨提示","正在注册...",false,true);  
    189.                 if(null!=bitmap){  
    190.                     //截取图片后缀  
    191.   
    192.                     String base64img = Base64Utils.bitmaptoString(bitmap);  
    193.                     //进行用户注册  
    194.                     new RegisterAction(Config.URL, Config.KEY_REGISTER, wyt_account, wyt_pwd, base64img, new RegisterAction.ISuccessCallback() {  
    195.                         @Override  
    196.                         public void onSuccess(String response, int id) {  
    197.                             pd.setMessage("注册成功");  
    198.                             handler.sendEmptyMessageDelayed(DISMISS,1000);  
    199.                             showActivity(RegisterAty.this,LoginAty.class);  
    200.                         }  
    201.                     }, new RegisterAction.IFailCallback() {  
    202.                         @Override  
    203.                         public void onFail(String failMsg) {  
    204.                             pd.setMessage("注册失败"+failMsg);  
    205.                             handler.sendEmptyMessageDelayed(DISMISS,1000);  
    206.                         }  
    207.                     });  
    208.                 }  
    209.   
    210.                 break;  
    211.             default:  
    212.                 break;  
    213.         }  
    214.     }  
    215.     private String getPicType(String picName){  
    216.         String[] s = picName.split(".");  
    217.         //数组长度  
    218.         return s[s.length-1];  
    219.     }  
    220.   
    221. }  


    然后对注册界面的网络请求进行封装:

    RegisterAction.java

    [java] view plain copy
    1. package com.mero.wyt_register.net;  
    2.   
    3. import android.util.Log;  
    4.   
    5. import com.mero.wyt_register.Config;  
    6. import com.zhy.http.okhttp.OkHttpUtils;  
    7. import com.zhy.http.okhttp.callback.StringCallback;  
    8.   
    9. import org.json.JSONException;  
    10. import org.json.JSONObject;  
    11.   
    12. import java.io.File;  
    13. import java.util.HashMap;  
    14. import java.util.Map;  
    15.   
    16. import okhttp3.Call;  
    17.   
    18. import static android.R.attr.action;  
    19. import static com.google.android.gms.internal.zzs.TAG;  
    20. import static com.mero.wyt_register.R.drawable.account;  
    21. import static com.zhy.http.okhttp.OkHttpUtils.post;  
    22.   
    23. /** 
    24.  * Created by chenlei on 2016/11/17. 
    25.  */  
    26.   
    27. public class RegisterAction {  
    28.     /* 
    29.     * 注册 
    30.     * */  
    31.     public RegisterAction(String url, String action, String account, String pwd, String picBase64, final ISuccessCallback successCallback, final IFailCallback failCallback){  
    32.         OkHttpUtils  
    33.                 .post()  
    34.                 .url(url)  
    35.                 .addParams(Config.KEY_ACTION,action)  
    36.                 .addParams(Config.KEY_ACCOUNT,account)  
    37.                 .addParams(Config.KEY_PWD,pwd)  
    38.                 .addParams(Config.KEY_USER_ICON,picBase64)  
    39.                 .build()  
    40.                 .execute(new StringCallback() {  
    41.                     @Override  
    42.                     public void onError(Call call, Exception e, int id) {  
    43.                             if(null!=failCallback){  
    44.                                 Log.e(TAG,"注册失败"+e.getMessage());  
    45.                                 failCallback.onFail(e.getMessage());  
    46.                             }  
    47.                     }  
    48.   
    49.                     @Override  
    50.                     public void onResponse(String response, int id) {  
    51.                         try {  
    52.                             JSONObject jsonObject = new JSONObject(response);  
    53.                             int status = jsonObject.getInt(Config.KEY_STATUS);  
    54.                             int errCode = jsonObject.getInt(Config.KEY_ERR_CODE);  
    55.                             if(status==1){  
    56.                                 successCallback.onSuccess(response,id);  
    57.                             }else if(status==0){  
    58.                                 failCallback.onFail(response);  
    59.                             }  
    60.                         } catch (JSONException e) {  
    61.                             e.printStackTrace();  
    62.                         }  
    63.   
    64.                     }  
    65.                 });  
    66.     }  
    67.     public interface ISuccessCallback{  
    68.         void onSuccess(String response,int id);  
    69.     };  
    70.     public interface IFailCallback{  
    71.         void onFail(String errCause);  
    72.     }  
    73. }  

    接下来上登录界面逻辑代码:

    LoginAty.java

    [java] view plain copy
    1. package com.mero.wyt_register.activity;  
    2.   
    3. import android.app.ProgressDialog;  
    4. import android.content.Context;  
    5. import android.content.SharedPreferences;  
    6. import android.graphics.Bitmap;  
    7. import android.os.Handler;  
    8. import android.os.Message;  
    9. import android.text.TextUtils;  
    10. import android.util.Log;  
    11. import android.view.View;  
    12. import android.widget.EditText;  
    13. import android.widget.TextView;  
    14. import android.widget.Toast;  
    15.   
    16. import com.mero.wyt_register.Base.BaseSwipeBackLayout;  
    17. import com.mero.wyt_register.Config;  
    18. import com.mero.wyt_register.MyApplication;  
    19. import com.mero.wyt_register.R;  
    20. import com.mero.wyt_register.bean.User;  
    21. import com.mero.wyt_register.db.DbHelper;  
    22. import com.mero.wyt_register.net.LoginAction;  
    23. import com.mero.wyt_register.utils.Base64Utils;  
    24. import com.mero.wyt_register.widget.RoundButton;  
    25.   
    26. /** 
    27.  * Created by chenlei on 2016/11/16. 
    28.  */  
    29.   
    30. public class LoginAty extends BaseSwipeBackLayout implements View.OnClickListener{  
    31.     private static final String TAG = "LoginAty";  
    32.     private EditText edt_account = null;  
    33.     private EditText edt_pwd = null;  
    34.     private RoundButton btn_login_click_to_login;  
    35.     private TextView tx_register;  
    36.     private ProgressDialog pd;//进度条  
    37.     private static  final int DISMISS = 0 ;  
    38.     private User user ;  
    39.   
    40.   
    41.   
    42.   
    43.     @Override  
    44.     public void initData() {  
    45.     }  
    46.   
    47.     @Override  
    48.     public void initView() {  
    49.         edt_account = (EditText) findViewById(R.id.edt_login_account);  
    50.         edt_pwd = (EditText) findViewById(R.id.edt_login_pwd);  
    51.         tx_register = (TextView) findViewById(R.id.tx_login_click_to_register);  
    52.         btn_login_click_to_login = (RoundButton) findViewById(R.id.btn_login_click_to_login);  
    53.         btn_login_click_to_login.setOnClickListener(this);  
    54.         tx_register.setOnClickListener(this);  
    55.     }  
    56.     private final Handler handler = new Handler(){  
    57.         @Override  
    58.         public void handleMessage(Message msg) {  
    59.             if(msg.what==DISMISS){  
    60.                 pd.dismiss();  
    61.             }  
    62.         }  
    63.     };  
    64.     @Override  
    65.     public int getLayoutResourceId() {  
    66.         return R.layout.wyt_login;  
    67.     }  
    68.   
    69.     @Override  
    70.     public int getDialogIcon() {  
    71.         return 0;  
    72.     }  
    73.   
    74.     @Override  
    75.     public int setStatusBarColor() {  
    76.         return 0;  
    77.     }  
    78.   
    79.     @Override  
    80.     public void onClick(View v) {  
    81.         switch (v.getId()){  
    82.             case R.id.btn_login_click_to_login:  
    83.                 //点击的是登录按钮  
    84.                 final String wyt_account = edt_account.getText().toString();//获取账号  
    85.                 final String wyt_pwd = edt_pwd.getText().toString();//获取密码  
    86.                 if(TextUtils.isEmpty(wyt_account)){  
    87.                     Toast.makeText(LoginAty.this,"账号不能为空",Toast.LENGTH_SHORT).show();  
    88.                     return;  
    89.                 }  
    90.                 if(TextUtils.isEmpty(wyt_pwd)){  
    91.                     Toast.makeText(LoginAty.this,"密码不能为空",Toast.LENGTH_SHORT).show();  
    92.                     return;  
    93.                 }  
    94.                 if(wyt_account.length()>20){  
    95.                     Toast.makeText(LoginAty.this,"您输入的账号过长",Toast.LENGTH_SHORT).show();  
    96.                     return;  
    97.                 }  
    98.                 if(wyt_pwd.length()>20){  
    99.                     Toast.makeText(LoginAty.this,"您输入的密码过长",Toast.LENGTH_SHORT).show();  
    100.                     return;  
    101.                 }  
    102.   
    103.                 String token =  Config.getTokenFromPreferences(this);  
    104.                 Log.e(TAG,"token的值"+token);  
    105.                 //显示进度对话框  
    106.                 pd = ProgressDialog.show(this,"温馨提示","正在登录",false,true);  
    107.                 new LoginAction(Config.URL, Config.KEY_LOGIN, wyt_account, wyt_pwd, ""new LoginAction.ISuccessCallback() {  
    108.                     @Override  
    109.                     public void onSuccess(String s, String token) {  
    110.                         pd.setMessage("登录成功");  
    111.                         //把token保存起来  
    112.                         SharedPreferences sharedPreferences = MyApplication.getMyApplication().getSharedPreferences(Config.ID, Context.MODE_PRIVATE);  
    113.                         SharedPreferences.Editor editor = sharedPreferences.edit();  
    114.                         editor.putString(Config.KEY_TOKEN,token);  
    115.                         editor.commit();  
    116.                         //获取头像  
    117.                         Bitmap bitmap = Base64Utils.stringtoBitmap(s);  
    118.                         user = new User();  
    119.                         user.setWyt_account(wyt_account);  
    120.                         user.setWyt_pwd(wyt_pwd);  
    121.                         user.setUser_icon(bitmap);  
    122.                         //保存该用户到数据库中  
    123.                         new DbHelper(LoginAty.this).insert(user,"user_wyt","person");  
    124.                         pd.dismiss();  
    125.                         showActivity(LoginAty.this,MainActivity.class);  
    126.                     }  
    127.                 }, new LoginAction.IFailCallback() {  
    128.                     @Override  
    129.                     public void onFail(String s) {  
    130.                         pd.setMessage("登录失败");  
    131.                         handler.sendEmptyMessageDelayed(DISMISS,1000);  
    132.                     }  
    133.                 });  
    134.   
    135. //                }  
    136.   
    137.                 break;  
    138.             case R.id.tx_login_click_to_register:  
    139.                 showActivity(LoginAty.this,RegisterAty.class);  
    140.                 break;  
    141.         }  
    142.   
    143.     }  
    144.   
    145.     @Override  
    146.     protected void onDestroy() {  
    147.         super.onDestroy();  
    148.     }  
    149. }  

    下面是登录网络逻辑的封装代码:

    LoginAction.java

    [java] view plain copy
    1. package com.mero.wyt_register.net;  
    2.   
    3. import android.graphics.Bitmap;  
    4. import android.text.TextUtils;  
    5. import android.util.Log;  
    6.   
    7. import com.mero.wyt_register.Config;  
    8. import com.mero.wyt_register.utils.Base64Utils;  
    9. import com.zhy.http.okhttp.OkHttpUtils;  
    10. import com.zhy.http.okhttp.callback.StringCallback;  
    11.   
    12. import org.json.JSONException;  
    13. import org.json.JSONObject;  
    14.   
    15. import okhttp3.Call;  
    16.   
    17. /** 
    18.  * Creaed by chenlei on 2016/11/15. 
    19.  */  
    20.   
    21. public class LoginAction {  
    22.     private static  final  String TAG = "loginService";  
    23.     //登录账号密码  
    24.     public LoginAction(String url, String action, String account, String pwd, String token, final ISuccessCallback successCallback, final IFailCallback failCallback){  
    25.         OkHttpUtils.post()  
    26.                 .url(url)  
    27.                 .addParams(Config.KEY_ACTION,action)  
    28.                 .addParams(Config.KEY_ACCOUNT,account)  
    29.                 .addParams(Config.KEY_PWD,pwd)  
    30.                 .addParams(Config.KEY_TOKEN,token)  
    31.                 .build().execute(new StringCallback() {  
    32.             @Override  
    33.             public void onError(Call call, Exception e, int id) {  
    34.                 if(failCallback!=null){  
    35.                     failCallback.onFail(e.getMessage());  
    36.                 }  
    37.             }  
    38.   
    39.             @Override  
    40.             public void onResponse(String response, int id) {  
    41.                 try {  
    42.                     JSONObject jsonObject =new JSONObject(response);  
    43.                     int status = jsonObject.getInt("status");  
    44.                     String iconStrBase64 = jsonObject.getString("user_icon");  
    45.                     String token = jsonObject.getString("token");  
    46.                     if(status==1){  
    47.                         if(null!=successCallback){  
    48.                             successCallback.onSuccess(iconStrBase64,token);  
    49.                         }  
    50.                     }else if(status==0){  
    51.                         if(null!=failCallback){  
    52.                             failCallback.onFail(response);  
    53.                         }  
    54.                     }  
    55.                 } catch (JSONException e) {  
    56.                     e.printStackTrace();  
    57.                 }  
    58.             }  
    59.         });  
    60.   
    61.     }  
    62.     public interface ISuccessCallback{  
    63.         void onSuccess(String s,String token);  
    64.     }  
    65.     public interface IFailCallback{  
    66.         void onFail(String s);  
    67.     }  
    68. }  


    服务器端:

    通过servlet实现对Action的处理,本实例仅采用了唯一的一个OnlyServlet。如果对servlet的使用不太会的话建议看下我的这篇关于servlet处理网页客户端的请求。本篇文章中不再累赘。首先我们来看看服务器的简单结构。服务器端仅仅对注册和登录,头像保存部分。

                                                                          
    先上最关键的核心处理部分,本文中的登录注册等Action都在该servlet中处理。

    OnlyServlet.java

    [java] view plain copy
    1. package com.wyt_register;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5. import java.sql.ResultSet;  
    6. import java.sql.SQLException;  
    7.   
    8. import javax.servlet.ServletException;  
    9. import javax.servlet.annotation.WebServlet;  
    10. import javax.servlet.http.HttpServlet;  
    11. import javax.servlet.http.HttpServletRequest;  
    12. import javax.servlet.http.HttpServletResponse;  
    13.   
    14. import org.json.JSONException;  
    15. import org.json.JSONStringer;  
    16.   
    17. import com.wyt_register.db.UserDao;  
    18. import com.wyt_register.md5Tool.Base64Utils;  
    19. import com.wyt_register.md5Tool.Md5Utils;  
    20.   
    21. /** 
    22.  * Servlet implementation class OnlyServlet 
    23.  */  
    24. @WebServlet("/OnlyServlet")  
    25. public class OnlyServlet extends HttpServlet {  
    26.     private static final long serialVersionUID = 1L;  
    27.          
    28.     /** 
    29.      * @see HttpServlet#HttpServlet() 
    30.      */  
    31.     public OnlyServlet() {  
    32.         super();  
    33.         // TODO Auto-generated constructor stub  
    34.     }  
    35.   
    36.     /** 
    37.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    38.      */  
    39.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    40.         // TODO Auto-generated method stub  
    41.         String action = null;//根据请求的行为进行相应的操作  
    42.         if((action=request.getParameter(Config.KEY_ACTION))!=null){  
    43.             switch(action){  
    44. //          如果是注册  
    45.             case Config.KEY_REGISTER:  
    46.                 System.out.println("正在请求注册");  
    47. //              用户注册的账号  
    48.                 String account_register = request.getParameter(Config.KEY_USER_ACCOUNT);  
    49.                 System.out.println(account_register);  
    50. //              用户注册的密码  
    51.                 String pwd_register = request.getParameter(Config.KEY_USER_PWD);  
    52.                 System.out.println(pwd_register);  
    53. //              用户上传的头像  
    54.                 String icon = request.getParameter(Config.KEY_USER_ICON);  
    55.                 if((null!=account_register)&&(null!=pwd_register)&&(null!=icon)){  
    56.                     //开启注册事务  
    57.                     //把唯一的账号名的md5值作为图片的名字  
    58.                     StringBuilder sb0 = new StringBuilder("");  
    59.                     //保存到数据库中的头像图片路径  
    60.                     sb0.append("/image/").append(Md5Utils.encode(account_register)).append(".png");  
    61.                     String icon_addr = sb0.toString();  
    62.                     System.out.println("头像图片地址:"+icon_addr);  
    63.                     StringBuilder sb1 = new StringBuilder("");  
    64.                     //写入到本地的头像图片路径  
    65.                     sb1.append(Config.ADDR_ICON).append(Md5Utils.encode(account_register)).append(".png");  
    66.                     String local_icon_addr = sb1.toString();  
    67.                     System.out.println("保存到本地的地址"+local_icon_addr);  
    68.                     PrintWriter writer =response.getWriter();  
    69.                     //查询用户是否已经注册过  
    70.                     try {  
    71.                         ResultSet set = UserDao.query(account_register);  
    72.                         //没注册过,需要注册  
    73.                         if(!set.next()){  
    74.                             //保存上传的头像至本地  
    75.                             boolean isSuccessToSaveImageToLocal = Base64Utils.getPicFormatBASE64(icon,local_icon_addr );  
    76.                             if(isSuccessToSaveImageToLocal){  
    77.                                 //头像上传成功后然后再插入账号密码到数据库  
    78.                                 boolean isSuccessToRegister = UserDao.insert(new Object[]{Config.KEY_ID,Config.KEY_USER_ACCOUNT,Config.KEY_USER_PWD,Config.KEY_USER_ICON_ADDR},new Object[]{null,account_register,pwd_register,icon_addr});  
    79.                                 if(isSuccessToRegister){  
    80.                                     //注册成功  
    81.                                     writer.print("{\"status\":1,\"errCode\":0x00000000}");  
    82.                                 }else{  
    83.                                     //注册失败  
    84.                                     writer.print("{\"status\":0,\"errCode\":0x00000001}");  
    85.                                 }  
    86.                             }  
    87.                         }else{  
    88.                             //注册过了  
    89.                             writer.print("{\"status\":0,\"errCode\":0x00000010}");  
    90.                         }  
    91.                     } catch (SQLException e) {  
    92.                         // TODO Auto-generated catch block  
    93.                         e.printStackTrace();  
    94.                     }  
    95.                       
    96.                 }  
    97.                 break;  
    98. //          如果是登录  
    99.             case Config.KEY_LOGIN:  
    100.                 PrintWriter writer = response.getWriter();  
    101. //              用户登录的账号  
    102.                 String account_login = request.getParameter(Config.KEY_USER_ACCOUNT);  
    103.                 System.out.println("账号:"+account_login);  
    104. //              用户登录的密码  
    105.                 String pwd_login = request.getParameter(Config.KEY_USER_PWD);  
    106.                 System.out.println("密码"+pwd_login);  
    107. //              用户登录的token  
    108.                 String token = request.getParameter(Config.KEY_TOKEN);  
    109.                 System.out.println("token的值是"+token);  
    110.                 //如果用户采用账号密码登录  
    111.                 if((!account_login.equals(""))&&(!pwd_login.equals(""))&&token.equals("")){  
    112.                     //查询数据库,是否存在  
    113.                     try {  
    114.                         System.out.println("正在查询数据库");  
    115.                         ResultSet rs = UserDao.query(account_login);  
    116.                         //如果该账号存在于数据库  
    117.                         if(rs.next()){  
    118.                             //获取该用户的密码  
    119.                             String pwd = rs.getString(3);  
    120.                             System.out.println("pwd:"+pwd);  
    121.                             String icon_usr_addr = rs.getString(4);  
    122.                             System.out.println(icon_usr_addr);  
    123.                             if(pwd_login.equals(pwd)){  
    124.                                 //登录成功  
    125.                                 //获取头像地址  
    126.                                 String s[] = rs.getString(4).split("/");  
    127.                                 String usr_exact_addr ="F:/webapps/Images/"+s[s.length-1];  
    128.                                 System.out.println(usr_exact_addr);  
    129.                                 //得到base64字符串  
    130.                                 String base64img = Base64Utils.imageToBase64(usr_exact_addr);  
    131.                                 try {  
    132.                                     String s1 = new JSONStringer().object()  
    133.                                             .key("status")  
    134.                                             .value(1)  
    135.                                             .key("errCode")  
    136.                                             .value("0x0")  
    137.                                             .key("user_icon")  
    138.                                             .value(base64img)  
    139.                                             .endObject()  
    140.                                             .toString();  
    141.                                     writer.print(s1);  
    142.                                 } catch (JSONException e) {  
    143.                                     // TODO Auto-generated catch block  
    144.                                     e.printStackTrace();  
    145.                                 }  
    146.                                   
    147.                             }else{  
    148.                                 //登录失败  
    149.                                 try {  
    150.                                     String s2 = new JSONStringer().object()  
    151.                                             .key("status")  
    152.                                             .value(0)  
    153.                                             .key("errCode")  
    154.                                             .value("0x00000100")  
    155.                                             .endObject()  
    156.                                             .toString();  
    157.                                     writer.print(s2);  
    158.                                 } catch (JSONException e) {  
    159.                                     // TODO Auto-generated catch block  
    160.                                     e.printStackTrace();  
    161.                                 }  
    162.                             }  
    163.                         }else{  
    164.                             //该账户不存在  
    165.                             try {  
    166.                                 String s3 = new JSONStringer().object()  
    167.                                         .key("status")  
    168.                                         .value(0)  
    169.                                         .key("errCode")  
    170.                                         .value("0x00000011")  
    171.                                         .endObject()  
    172.                                         .toString();  
    173.                                         writer.println(s3);;  
    174.                             } catch (JSONException e) {  
    175.                                 // TODO Auto-generated catch block  
    176.                                 e.printStackTrace();  
    177.                             }  
    178.                         }  
    179.                     } catch (SQLException e) {  
    180.                         // TODO Auto-generated catch block  
    181.                         e.printStackTrace();  
    182.                     }  
    183.                 }  
    184.                 //如果用户采用token登录  
    185.                 if(token!=null){  
    186.                       
    187.                 }  
    188.                 break;  
    189.             }  
    190.         }  
    191.     }  
    192.   
    193.     /** 
    194.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    195.      */  
    196.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    197.         // TODO Auto-generated method stub  
    198.         doGet(request, response);  
    199.     }  
    200.   
    201. }  

    下面是在上面的servlet封装的关于数据库Dao的逻辑处理部分:

    BaseDao.java

    [java] view plain copy
    1. package com.wyt_register.db;  
    2.   
    3. import java.sql.ResultSet;  
    4. import java.sql.SQLException;  
    5. import java.sql.Statement;  
    6.   
    7. public abstract class BaseDao {  
    8.     public static java.sql.Connection conn;  
    9.     static java.sql.Statement statement;  
    10.     BaseDao(){  
    11.         conn = DbUtils.getConnection();//打开数据连接  
    12.         try {  
    13.             statement = conn.createStatement();  
    14.             initStatement(statement);  
    15.         } catch (SQLException e) {  
    16.             // TODO Auto-generated catch block  
    17.             e.printStackTrace();  
    18.         }  
    19.     }  
    20.     /** 
    21.      * 该方法用于得到实例化Statement接口对象 
    22.      * @param statement 
    23.      */  
    24.     public abstract void initStatement(Statement statement);  
    25.     /** 
    26.      * 用于插入数据 
    27.      * @param b1    键名 
    28.      * @param b2    键值 
    29.      * @throws SQLException  
    30.      */  
    31.     public  boolean insert(String tableName,Object[] b1,Object[] b2){  
    32.         StringBuilder sb = new StringBuilder();  
    33.         sb.append("INSERT INTO ").append("`").append(tableName).append("`").append("(");  
    34.         for(Object ob:b1){  
    35.             sb.append((String)ob).append(",");  
    36.         }  
    37.         sb.deleteCharAt(sb.length()-1);  
    38.         sb.append(")").append(" ").append("values").append("(");  
    39.         for(Object ob:b2){  
    40.             if(ob instanceof Integer){  
    41.                 sb.append((Integer)ob).append(",");  
    42.             }  
    43.             if(ob instanceof java.lang.String){  
    44.                 sb.append("'").append((String)ob).append("'").append(",");  
    45.             }  
    46.             if(ob instanceof java.lang.Float){  
    47.                 sb.append((Float)ob).append(",");  
    48.             }  
    49.             if(ob instanceof java.lang.Double){  
    50.                 sb.append((Double)ob).append(",");  
    51.             }  
    52.             if(ob==null){  
    53.                 sb.append("null").append(",");  
    54.             }  
    55.         }  
    56.         sb.deleteCharAt(sb.length()-1);  
    57.         sb.append(")");  
    58.         System.out.println(sb.toString());  
    59.         String sql = sb.toString();  
    60.         int row;  
    61.         try {  
    62.             row = statement.executeUpdate(sql);  
    63.             if(row>0){  
    64.                 //插入成功  
    65.                 return true;  
    66.             }  
    67.             DbUtils.closeConnection(conn);  
    68.             DbUtils.closeStatement(statement);  
    69.         } catch (SQLException e) {  
    70.             // TODO Auto-generated catch block  
    71.             e.printStackTrace();  
    72.         }  
    73.         return false;  
    74.     }  
    75.     /** 
    76.      * 该方法用来查询数据库某表中的某一字段值 
    77.      * @param tableName 表名 
    78.      * @param column    字段 
    79.      * @param stringToQuery 查询的参数 
    80.      */  
    81.     public  ResultSet queryExcute(String tableName,String column,String stringToQuery){  
    82.         String sql;  
    83.         ResultSet set = null;  
    84.         StringBuilder sb = new StringBuilder();  
    85.         sb.append("SELECT * FROM ").append("`").append(tableName).append("`").append(" ").append("where ").append(column).append("=")  
    86.         .append("'").append(stringToQuery).append("'");  
    87.         sql = sb.toString();  
    88.         try {  
    89.             set = statement.executeQuery(sql);  
    90.             if(null==set){  
    91.                 return null;  
    92.             }  
    93.         } catch (SQLException e) {  
    94.             // TODO Auto-generated catch block  
    95.             e.printStackTrace();  
    96.         }  
    97.         return set;  
    98.     }  
    99. }  


    UserDao.java

    [java] view plain copy
    1. package com.wyt_register.db;  
    2.   
    3. import java.sql.ResultSet;  
    4. import java.sql.SQLException;  
    5. import java.sql.Statement;  
    6.   
    7. import com.wyt_register.Config;  
    8.   
    9. public class UserDao extends BaseDao{  
    10.     public Statement statement;  
    11.     public UserDao() {  
    12.         // TODO Auto-generated constructor stub  
    13.         System.out.println("正在执行RegisterDao");  
    14.     }  
    15.     @Override  
    16.     public void initStatement(Statement statement) {  
    17.         // TODO Auto-generated method stub  
    18.         this.statement = statement;  
    19.     }  
    20.     public static boolean insert(Object[] b1,Object[] b2) throws SQLException{  
    21.         return new UserDao().insert( com.wyt_register.Config.USER_TABLE, b1, b2);  
    22.     }  
    23.     public static ResultSet query(String account) throws SQLException{  
    24.         ResultSet set=new UserDao().queryExcute(com.wyt_register.Config.USER_TABLE, Config.KEY_USER_ACCOUNT, account);  
    25.         return set;  
    26.     }  
    27.       
    28. }<span style="color:#ff0000;">  
    29. </span>  

    servlet配置文件:web.xml

    [html] view plain copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <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_3_0.xsd" id="WebApp_ID" version="3.0">  
    3.   <display-name>py02</display-name>  
    4.   <welcome-file-list>  
    5.     <welcome-file>index.html</welcome-file>  
    6.     <welcome-file>index.htm</welcome-file>  
    7.     <welcome-file>index.jsp</welcome-file>  
    8.     <welcome-file>default.html</welcome-file>  
    9.     <welcome-file>default.htm</welcome-file>  
    10.     <welcome-file>default.jsp</welcome-file>  
    11.   </welcome-file-list>  
    12.   <servlet>  
    13.     <servlet-name>OnlyServlet</servlet-name>  
    14.     <servlet-class>com.wyt_register.OnlyServlet</servlet-class>  
    15.   </servlet>  
    16.   <servlet-mapping>  
    17.     <servlet-name>OnlyServlet</servlet-name>  
    18.     <url-pattern>/</url-pattern>  
    19.   </servlet-mapping>  
    20. </web-app>  


    其他几个文件我就不一一放上来了,具体的我在这里打包服务器的代码。服务器端代码下载:有什么问题可以加我QQ790710371或者发送问题至邮箱790710371@qq.com。
    展开全文
  • 客户端是用的Android-async-http-1.4.5这个jar包、进行传输数据。 AsyncHttpClient client=new AsyncHttpClient(); ...这里的params参数对象,服务器如何得到。有知道的麻烦告知下。。。谢谢喽。
  • 正在做一个android应用的服务器端,涉及到客户端apk的用户帐号注册和登录功能,这个安全性怎么保障?由于服务器开发刚接触,用的sybase数据库,一般只定义服务器相应action供客户端发送过来进行交互,走的都是普通的...
  • 想问问服务器对于一个软件,比如人人网的android客户端吧,来说的角色是什么? 软件做到什么程度了开始搭建服务器? 还有就是例如我写的本地注册登录账号的功能,在搭建服务器的时候这些代码应该是经过少部分改动...
  • 1.回顾  上篇实现总结了App接口开发课程讲解的内容 2.此篇  这篇将总结app接口开发里的 用户登录的例子! 3.基本步骤 ... (4)实现 app端(安卓(android))开发 ...4. 服务器端开发

    1.回顾

           上篇实现总结了App接口开发课程讲解的内容


    2.此篇

         这篇将总结app接口开发里的 用户登录的例子!


    3.基本步骤

        (1)服务端实现 登陆接口 开发

        (2)实现 json 和xml数据封装类

        (3)编写 接口开发文档

        (4)实现 app端(安卓(android))开发


    4. 服务器端开发

          基本需求:用户使用用户名和密码登陆,登陆后,返回用户个人信息。


          这里,开发 数据库访问层和登陆业务我就不写了。这里的接口实现是在Servlet 里实现,通过调用登陆业务逻辑,返回用户个人信息,后生成json数据或者xml数据。

          再者,填写接口开发文档。

          最后,通过接口开发文档实现android(安卓)客户端登陆例子开发。


           提醒:这里下面将调用我自己封装好的生成json和xml的数据类,需要的可以看看我的另一篇文章:

     实现封装Json和xml数据生成类http://blog.csdn.net/lablenet/article/details/47618701


          下面实现安卓接口开发 servlet  : 

    package Interface.app.android;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import Interface.app.Util.AppInterface;
    
    import cn.edu.hpu.stumanager.model.Competitor;
    import cn.edu.hpu.stumanager.service.CompetitorManager;
    import cn.edu.hpu.stumanager.service.CompetitorManagerImpl;
    
    public class app_userlogin extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		//设置 编码格式
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		//获得 用户登录 姓名和密码  (app端需要 传参数 name和pasd)
    		String name=request.getParameter("name");
    		String pasd=request.getParameter("pasd");
    		
    		String str="";
    		
    		if(!(str.equals(name)&&str.equals(pasd))){
    			//这里实现你的 登陆业务调用
    		
    //			CompetitorManager manager=new CompetitorManagerImpl();
    //		    Object object = manager.userLogin("hpujava","111");
    //		    Competitor competitor=null;
    //			if(object instanceof Competitor){
    //				competitor=(Competitor) object;
    			    
    			    //这里传调用 生成json 和 xml的 数据生成类  
    			     
    				str=AppInterface.toJson(1,"success","用户对象");
    //			}else{
    //				
    //				str=object.toString();
    //			}
    			
    			
    		}else{
    			
    			str="参数为空了!";
    		}
    		
    
    		response.setContentType("text/json");
    		PrintWriter out = response.getWriter();
    		out.print(str);
    		out.flush();
    		out.close();
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
             doGet(request, response);
              
    	}
    
    }
    

    5.  浏览器 通过 get方式 测试

          首先,打开cmd,输入 ipconfig 命令 ,获得本地 ipv4 的地址!将 localhost 换成你的Ipv4地址;

          其次,在浏览器里数据刚才的地址,看可以返回你封装好的数据不能!


          我的测试地址:

    http://192.168.75.1:8080/TennisGameSys/app_userlogin?name=hpujava&pasd=111

          测试数据:

    {"data":{"address":"中国广州","borth":"1983.2.13","id":1,"matchage":3,"password":"111","realname":"李娜","sex":"女","username":"hpujava"},"code":1,"msg":"success"}

    6.  app客户端 本地开发测试

         (1)按 上述的方式 将 localhost 换成你的 ipv4地址 ;

         (2)建议在电脑上 安装 360wifi ,将你的手机 连接至 自己电脑开启的wifi ,以便测试;

         (3)如果两个同时在本地开发,一个人开发app端,一个开发服务器端,建议 开发app端的 电脑和手机连接置开     发服务器端开启的wifi 下,这样在局域网下进行测试开发;

         (4)如果有条件的话,可以在公网服务器上进行开发,需要域名;


    7. 编写接口开发文档


         接口开发文档是十分重要的,比方说,你开发了一款app的服务器端,并且写了 接口开发文档。过了很长一段时间,想起来了,直接去看接口文档,更直观,快捷。


        其中更重要的是,如果你开发的服务器端接口,转给别人了,别人看起来也是十分方便的。


        这里就不演示例子了,我在Execl 里演示写了刚才的登陆接口的 接口文档,截个图:


     


         需要哪些注意事项,可以看我的上篇博客!


    8. app端开发——安卓端 用户登录的例子

        基本步骤:

              (1)新建Android工程 

                     这里我就不多说了,如果不会的话,下面都不需要看了!

              (2)实现工具类 HttpPath 

                     封装接口地址,统一管理接口地址,当然这里没有考虑安全性,仅仅为了调试方便

                     示例:

    package com.example.http;
    
    public class HttpPath {
    
    	private static final String IP="http://192.168.75.1:8080/";
    	
    	public static String getUserLoginPath(){
    		
    		return IP+"TennisGameSys/app_userlogin";
    	}
    	
    }
    

              (3)实现 工具类 HttpReq 

                   封装 Http请求数据和提交数据类,可以看我的另一篇博客!

                   封装安卓端Get和Post请求方法类 :http://blog.csdn.net/lablenet/article/details/47663153


              (4)实现 页面 布局 需要 两个 EditText 和 一个登陆按钮( Button )

                    最基本的布局实现,不再示例了!


              (5)在 AndroidManifest.xml 文件里 添加 网络权限

       <uses-permission android:name="android.permission.INTERNET"/>

              (6)实现 MainActivity 业务调用,这里直接 上代码吧,里面我写了注释 很明白的!

    package com.example.demologin;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.message.BasicNameValuePair;
    
    import com.example.http.HttpReq;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	private EditText et_name,et_pasd;
    	private TextView tv;
    	private Button btn_login; 
    	private Thread thread;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initView();
    		
    		//点击事件
    		btn_login.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				//开启子线程,实现网络请求
    				thread=new Thread(new loginRunnable());
    				thread.start();
    			}
    		});
    		
    		
    		
    	}
    	
    	//初始化 控件
      private void initView() {
    		// TODO Auto-generated method stub
    	   et_name=(EditText)findViewById(R.id.et_name);
    	   et_pasd=(EditText)findViewById(R.id.et_pasd);
    	   tv=(TextView)findViewById(R.id.textView1);
    	   btn_login=(Button)findViewById(R.id.btn_login);
    	}
    
       
      //处理线程 UI ,防止堵塞 主线程
      Handler handler=new Handler(){
    	   
    	   public void handleMessage(android.os.Message msg) {
    		   
    		   Object object=msg.obj;
    		   //这里调用json解析  , 实现 activity 调转 数据传输到下一个页面
    		   tv.setText(object.toString());
    		   
    	   };
    	   
       };
       
       
       //子线程 实现 网络请求,安卓4.0 及其 之后版本,需要在 子线程里进行 数据访问
       class loginRunnable implements Runnable{
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		
    		String name=et_name.getText().toString();
    		String pasd=et_pasd.getText().toString();
    		
    		//get
    	  // Object object=	HttpReq.toGetData(name, pasd);
    	    
    		List<BasicNameValuePair> list=new ArrayList<BasicNameValuePair>();
    		list.add(new BasicNameValuePair("name",name));
    		list.add(new BasicNameValuePair("pasd",pasd));
    	    Object object=HttpReq.topostData(list);
    		
    	   //发送数据到 handler
    	   Message message=handler.obtainMessage();
    	   message.obj=object;
    	   handler.sendMessage(message);
    		
    		
    	}
       }
       
       
    	
    	
    }
    
    


     9.demo 下载

    http://download.csdn.net/detail/lablenet/9010281


    展开全文
  • android 开发服务器端经常得到乱码,我的项目最后发现问题是少了下面两句: response.setCharacterEncoding("GBK"); request.setCharacterEncoding("GBK"); 当然addroid端也要是GBK编码方式
  • Android Ble蓝牙开发服务器端

    千次阅读 2017-09-03 12:06:20
    文章部分内容摘至各大Blog,加上本dust的见解,写了一份Client和Service的小呆毛。这次的是Server的实现参考链接–Link:http://www.cnblogs.com/vir56k/p/6273241.html——————————————————...
  • 国外有不少开发者都用这个来做Android服务器端 http://codeigniter.org.cn/
  • android上传文件至服务器(android端+服务器端

    万次阅读 多人点赞 2017-06-12 16:58:45
    引言:本来android文件上传的博客在网上挺多的,不过好些都只是有前台android端的上传,并没有后台服务器端的接收。而且自己写的时候也确实遇见了一些之前没注意到的地方,写出来也算是给自己提个醒。 我这里就不把...
  • service(J2EE服务器端)+ ksoap(android客户端),原因是我们没有PHP方面的知识积累,选用Java至少我们还懂一些。可是在之后的实作里碰到很大的困难,一是网上没有找到详细的一步步从头开始资料;二是,网上提供...
  • Android C2DM学习——服务器端代码开发

    万次阅读 热门讨论 2011-07-26 20:59:40
    基础知识 在前一部分,我们使用curl命令来代替了服务器端的实现,虽然在测试时使用curl命令是一个很是简单方便的模拟方式,但实际使用中我们需要把C2DM相关的服务器部分功能结合到已有的框架中,因此需要使用具体的...
  • android开发 服务器端访问MySQL数据库,怎么把客户端发送过来的数据写入数据库? 客户端应该怎么写通过什么传递数据,服务端通过什么接收数据,新手一枚,请各位大神指点一下,或者推荐一些博客。谢谢!
  • 我现在要开发一个安卓应用,需要服务器端,可是我不清楚服务器用什么来做。我学过Socket,喜欢用C++,但是大家说太底层,开发时间周期长,我想打听一下现在比较流行的一种开发方法,用什么语言好,最好是接近大公司...
  • 所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手。...博客分一二两篇,第一篇是服务器端,第二篇是Android客户端 而服务器端分为User model、Use
  • Android服务器端发送json数据

    千次阅读 2015-05-04 17:46:41
    Android服务器端发送json数据   android服务器端发送json数据,本文讲解的知识点比较基础,如果你是大神,请直接关闭该网页,免得浪费你宝贵时间。 1.向服务器端发送json数据 ...
  • 这两天学了android 获取服务器端json数据,特地给大家分享一下: 我们的目标是------》获取到json数据,不管服务器端的是什么,只要能在servlet页面输出一个json。剩下的就看手机端如何获取的了。 目前我就学到了 ...
  • Linux基础知识: Android系统的基础是Linux操作系统。在开发过程中也需要使用到一些Linux命令 《菜鸟的私房菜》 数据库基础知识: ...服务器端开发知识: JavaEE:SSH-Structs+
  • andriod文件下载服务器端搭建
  • 由于当当Android客户端采用的是客户端请求,服务端response,返回页面的方式。 在调试中,发现当用户点击注册页面,提交后,通过 header( Location: . $to_url ); exit; 无法跳转到验证页面。 但是通过tail ...
  • Android服务器端数据交互(1)

    千次阅读 2012-03-19 09:49:35
    Android > Android服务器端数据交互(1) Android服务器端数据交互(1) 2011-06-07 16:01 佚名 互联网 我要评论(0) 字号:T | T 采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取...
  • APP开发人员经常会遇见一个bug...服务器端永远使用UTC时间,包括参数和返回值,不要使用Date格式,而是使用UTC时间1970年1月1日的差值,即long类型的长整数。 APP端将服务器返回的long型时间转换为GMT8时区的时间,额

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,472
精华内容 27,388
关键字:

android服务器端开发