[2015/05/08] JSP服务器与安卓客户端通信 & 页面布局控件覆盖问题

页面布局控件覆盖 


报错信息:

java.lang.ClassCastException :android.widget.TextView cannot be cast to android.widget.Button


解决方案:

①检查布局文件,非必要不要让控件重叠;

②Project-clean


安卓客户端向服务器端传值/服务器向安卓客户端传值

转载地址(这个貌似也是转的):http://blog.csdn.net/cainiao123hack/article/details/8255836


(一)客户端向服务器端传值

根据实习科目需求,先完成Android客户端的登录功能。

要实现登录必然涉及到客户端与服务器端的交互,即客户端需要将用户输入的账号和密码传给服务器端,服务器端连接数据库对其进行验证。

细化问题,先研究一下客户端向服务器端传值的方法。

新建一个web工程,建一个Servlet如下:

<span style="font-family:Verdana;">    public class UserServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;     
        public UserServlet() {  
            super();  
        }  
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            String userName=request.getParameter("userName");  
            String passWord=request.getParameter("passWord");  
            //在服务器端解决中文乱码问题   
            userName=NewString.getNewString(userName);  
            passWord=NewString.getNewString(passWord);  
            System.out.println("账号:"+userName);  
            System.out.println("密码:"+passWord);   
        }     
        protected void doPost(HttpServletRequest request,  
                HttpServletResponse response) throws ServletException, IOException {  
            this.doGet(request, response);  
        }  
    }  </span>
<span style="font-family:Verdana;">    public class UserServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;     
        public UserServlet() {  
            super();  
        }  
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            String userName=request.getParameter("userName");  
            String passWord=request.getParameter("passWord");  
            //在服务器端解决中文乱码问题  
            userName=NewString.getNewString(userName);  
            passWord=NewString.getNewString(passWord);  
            System.out.println("账号:"+userName);  
            System.out.println("密码:"+passWord);   
        }     
        protected void doPost(HttpServletRequest request,  
                HttpServletResponse response) throws ServletException, IOException {  
            this.doGet(request, response);  
        }  
    }  </span>

客户端登录界面如下,布局比较简单。

Activity代码:

<span style="font-family:Verdana;">    public class LoginActivity extends Activity {  
        private EditText userName;  
        private EditText passWord;  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);          
            userName=(EditText)this.findViewById(R.id.userName);  
            passWord=(EditText)this.findViewById(R.id.passWord);         
        }  
         /** 
          * 用户登录的方法 
          */  
        public void login(View v)  
        {    
            //取得用户输入的账号和密码   
            String name=userName.getText().toString();  
            String pass=passWord.getText().toString();  
            boolean result=UserService.check(name,pass);  
            if(result)  
            {  
                Toast.makeText(getApplicationContext(),R.string.success,1).show();  
            }else  
            {  
                Toast.makeText(getApplicationContext(),R.string.fail,1).show();  
            }     
        }  
    }  </span>

<span style="font-family:Verdana;">    public class LoginActivity extends Activity {  
        private EditText userName;  
        private EditText passWord;  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);          
            userName=(EditText)this.findViewById(R.id.userName);  
            passWord=(EditText)this.findViewById(R.id.passWord);         
        }  
         /** 
          * 用户登录的方法 
          */  
        public void login(View v)  
        {    
            //取得用户输入的账号和密码  
            String name=userName.getText().toString();  
            String pass=passWord.getText().toString();  
            boolean result=UserService.check(name,pass);  
            if(result)  
            {  
                Toast.makeText(getApplicationContext(),R.string.success,1).show();  
            }else  
            {  
                Toast.makeText(getApplicationContext(),R.string.fail,1).show();  
            }     
        }  
    }  </span>

具体实现的工具类:

<span style="font-family:Verdana;">    public class UserService {  
        /** 
         * 验证用户登录是否合法 
         * 返回值:请求是否成功 
         */  
        public static boolean check(String name, String pass) {  
            String path="http://135.32.89.17:8080/lss/UserServlet";  
            //将用户名和密码放入HashMap中   
            Map<String,String> params=new HashMap<String,String>();  
            params.put("userName", name);  
            params.put("passWord", pass);         
            try {  
                return sendGETRequest(path,params,"UTF-8");  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block   
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block   
                e.printStackTrace();  
            }  
            return false;  
        }  
        private static boolean sendGETRequest(String path,  
            Map<String, String> params,String encode) throws MalformedURLException, IOException {  
            StringBuilder url=new StringBuilder(path);  
            url.append("?");  
            for(Map.Entry<String, String> entry:params.entrySet())  
            {  
                url.append(entry.getKey()).append("=");  
                url.append(URLEncoder.encode(entry.getValue(),encode));  
                url.append("&");  
            }  
            //删掉最后一个&   
            url.deleteCharAt(url.length()-1);  
            HttpURLConnection conn=(HttpURLConnection)new URL(url.toString()).openConnection();  
            conn.setConnectTimeout(5000);  
            conn.setRequestMethod("GET");  
            if(conn.getResponseCode()==200)  
             {  
               return true;  
             }  
               return false;  
             }  
    }  </span>

<span style="font-family:Verdana;">    public class UserService {  
        /** 
         * 验证用户登录是否合法 
         * 返回值:请求是否成功 
         */  
        public static boolean check(String name, String pass) {  
            String path="http://135.32.89.17:8080/lss/UserServlet";  
            //将用户名和密码放入HashMap中  
            Map<String,String> params=new HashMap<String,String>();  
            params.put("userName", name);  
            params.put("passWord", pass);         
            try {  
                return sendGETRequest(path,params,"UTF-8");  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            return false;  
        }  
        private static boolean sendGETRequest(String path,  
            Map<String, String> params,String encode) throws MalformedURLException, IOException {  
            StringBuilder url=new StringBuilder(path);  
            url.append("?");  
            for(Map.Entry<String, String> entry:params.entrySet())  
            {  
                url.append(entry.getKey()).append("=");  
                url.append(URLEncoder.encode(entry.getValue(),encode));  
                url.append("&");  
            }  
            //删掉最后一个&  
            url.deleteCharAt(url.length()-1);  
            HttpURLConnection conn=(HttpURLConnection)new URL(url.toString()).openConnection();  
            conn.setConnectTimeout(5000);  
            conn.setRequestMethod("GET");  
            if(conn.getResponseCode()==200)  
             {  
               return true;  
             }  
               return false;  
             }  
    }  </span>

运行结果:

服务器端接收内容:

 

总结:

客户端的工具类将用户输入的账号和密码放入HashMap当中,循环遍历取出HashMap中的键和值,构造出形如

http://www.xxx.xxx?key1=value1&key2=value2的字符串。利用该字符串连接服务器,传送相关值。


(二)服务端向客户端传值

上次已经完成了Android客户端向服务器端传值的功能,接下来的任务是服务器端通过连接数据库对传来的值进行判定,并将判定结果返回客户端。

对传来的数值进行判定的处理过程与web开发相同,比较简单。重点是将判定结果返回客户端的实现:

Servlet部分重点代码:

<span style="font-family:Verdana;">    /** 
     * 功能:验证手机用户登录 
     */  
    public void androidCheckUser(HttpServletRequest request,  
            HttpServletResponse response) throws ServletException, IOException {  
    PrintWriter out = response.getWriter();  
    String userName=request.getParameter("userName");  
    String passWord=request.getParameter("passWord");  
    //在服务器端解决中文乱码问题   
    userName=NewString.getNewString(userName);  
    passWord=NewString.getNewString(passWord);  
    System.out.println("账号:"+userName);  
    System.out.println("密码:"+passWord);   
    //调用dao   
    UserDao uDao=new UserDao();  
    if(uDao.checkUser(userName, passWord))  
    {   //得到登录用户的权限类型   
        String type=uDao.getType(userName);  
        if(type.equals("高级")){  
            request.setAttribute("result","high");  
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }else if(type.equals("普通")){  
            request.setAttribute("result","common");  
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }else if(type.equals("超级")){  
            request.setAttribute("result","super");   
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }  
    }else  
    {  
        request.setAttribute("result","false");  
        request.getRequestDispatcher("login.jsp").forward(request, response);  
    }  


    /** 
     * 功能:验证手机用户登录 
     */  
    public void androidCheckUser(HttpServletRequest request,  
            HttpServletResponse response) throws ServletException, IOException {  
    PrintWriter out = response.getWriter();  
    String userName=request.getParameter("userName");  
    String passWord=request.getParameter("passWord");  
    //在服务器端解决中文乱码问题  
    userName=NewString.getNewString(userName);  
    passWord=NewString.getNewString(passWord);  
    System.out.println("账号:"+userName);  
    System.out.println("密码:"+passWord);   
    //调用dao  
    UserDao uDao=new UserDao();  
    if(uDao.checkUser(userName, passWord))  
    {   //得到登录用户的权限类型  
        String type=uDao.getType(userName);  
        if(type.equals("高级")){  
            request.setAttribute("result","high");  
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }else if(type.equals("普通")){  
            request.setAttribute("result","common");  
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }else if(type.equals("超级")){  
            request.setAttribute("result","super");   
            request.getRequestDispatcher("login.jsp").forward(request, response);  
        }  
    }else  
    {  
        request.setAttribute("result","false");  
        request.getRequestDispatcher("login.jsp").forward(request, response);  
    }  </span>

如上所示,Servlet调用Dao进行判定,将判定标识写入XML格式的JSP页面中。

JSP页面结构:

<span style="font-family:Verdana;">    <%@ page language="java" import="java.util.*" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><?xml version="1.0" encoding="UTF-8"?>  
    <%String result=(String)request.getAttribute("result");%>  
    <result>  
    <flag><%=result%></flag>  
    </result>  </span>

Android客户端解析XML格式的JSP页面,得到服务器端传来的判定结果,根据结果弹出提示框。

<span style="font-family:Verdana;">    /** 
         * 验证用户登录是否合法 
         * 返回值:服务器端判断的标识 
         */  
        public static String check(String name, String pass) throws XmlPullParserException, MalformedURLException, IOException {  
            String path="http://135.32.89.17:8080/lss/UserServlet?flag=androidCheck";  
            //将用户名和密码放入HashMap中   
            Map<String,String> params=new HashMap<String,String>();  
            params.put("userName", name);  
            params.put("passWord", pass);     
            String checkr=uMethod.checkUser(path,params,"UTF-8");  
            System.out.println("check"+checkr);  
            return checkr;        
        }  </span>

<span style="font-family:Verdana;">    /** 
         * 验证用户登录是否合法 
         * 返回值:服务器端判断的标识 
         */  
        public static String check(String name, String pass) throws XmlPullParserException, MalformedURLException, IOException {  
            String path="http://135.32.89.17:8080/lss/UserServlet?flag=androidCheck";  
            //将用户名和密码放入HashMap中  
            Map<String,String> params=new HashMap<String,String>();  
            params.put("userName", name);  
            params.put("passWord", pass);     
            String checkr=uMethod.checkUser(path,params,"UTF-8");  
            System.out.println("check"+checkr);  
            return checkr;        
        }  </span>


<span style="font-family:Verdana;">    public String checkUser(String path,  
                Map<String, String> params,String encode) throws MalformedURLException, IOException, XmlPullParserException {  
                StringBuilder url=new StringBuilder(path);  
                url.append("&");  
                for(Map.Entry<String, String> entry:params.entrySet())  
                {  
                    url.append(entry.getKey()).append("=");  
                    url.append(URLEncoder.encode(entry.getValue(),encode));  
                    url.append("&");  
                }  
                //删掉最后一个&   
                url.deleteCharAt(url.length()-1);  
                HttpURLConnection conn=(HttpURLConnection)new URL(url.toString()).openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setRequestMethod("GET");  
                if(conn.getResponseCode()==200)  
                 {  
                   InputStream inputStream=conn.getInputStream();   
                   System.out.println("准备解析!");  
                   String s=parseXML(inputStream);  
                   System.out.println("准备解析!"+s);  
                  //将得到的XML内容的解析   
                   if(s.equals("high")){  //权限为高级用户   
                       return "high";  
                   }else if(s.equals("common")){  //权限为普通用户   
                       return "common";  
                   }else if(s.equals("super")){   //权限为超级用户   
                       return "super";  
                   }else if(s.equals("false")){   //权限为超级用户   
                       return "false";  
                   }  
                 }  
                   return "false";  
                 }  
            /** 
             * 解析服务器端返回的XML  
             */  
            public  String parseXML(InputStream inputStream) throws XmlPullParserException, IOException {  
                XmlPullParser parser=Xml.newPullParser();  
                parser.setInput(inputStream,"UTF-8");  
                String result=null;  
                //得到开始文档事件   
                int event=parser.getEventType();  
                while(event!=XmlPullParser.END_DOCUMENT)  
                {  
                  switch(event)  
                  {  
                    case XmlPullParser.START_TAG:  
                      if("flag".equals(parser.getName()))  
                      {  
                          result=parser.nextText();  
                          System.out.println("flag"+result);  
                      }  
                     break;  
        //一定要加,不然报错Caused by: org.xmlpull.v1.XmlPullParserException: Premature end of document.   
                    case XmlPullParser.END_TAG:       
                        break;  
                   }  
                    event = parser.next();  
                }         
                return result;  
            }  </span>

<span style="font-family:Verdana;">    public String checkUser(String path,  
                Map<String, String> params,String encode) throws MalformedURLException, IOException, XmlPullParserException {  
                StringBuilder url=new StringBuilder(path);  
                url.append("&");  
                for(Map.Entry<String, String> entry:params.entrySet())  
                {  
                    url.append(entry.getKey()).append("=");  
                    url.append(URLEncoder.encode(entry.getValue(),encode));  
                    url.append("&");  
                }  
                //删掉最后一个&  
                url.deleteCharAt(url.length()-1);  
                HttpURLConnection conn=(HttpURLConnection)new URL(url.toString()).openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setRequestMethod("GET");  
                if(conn.getResponseCode()==200)  
                 {  
                   InputStream inputStream=conn.getInputStream();   
                   System.out.println("准备解析!");  
                   String s=parseXML(inputStream);  
                   System.out.println("准备解析!"+s);  
                  //将得到的XML内容的解析  
                   if(s.equals("high")){  //权限为高级用户  
                       return "high";  
                   }else if(s.equals("common")){  //权限为普通用户  
                       return "common";  
                   }else if(s.equals("super")){   //权限为超级用户  
                       return "super";  
                   }else if(s.equals("false")){   //权限为超级用户  
                       return "false";  
                   }  
                 }  
                   return "false";  
                 }  
            /** 
             * 解析服务器端返回的XML  
             */  
            public  String parseXML(InputStream inputStream) throws XmlPullParserException, IOException {  
                XmlPullParser parser=Xml.newPullParser();  
                parser.setInput(inputStream,"UTF-8");  
                String result=null;  
                //得到开始文档事件  
                int event=parser.getEventType();  
                while(event!=XmlPullParser.END_DOCUMENT)  
                {  
                  switch(event)  
                  {  
                    case XmlPullParser.START_TAG:  
                      if("flag".equals(parser.getName()))  
                      {  
                          result=parser.nextText();  
                          System.out.println("flag"+result);  
                      }  
                     break;  
        //一定要加,不然报错Caused by: org.xmlpull.v1.XmlPullParserException: Premature end of document.  
                    case XmlPullParser.END_TAG:       
                        break;  
                   }  
                    event = parser.next();  
                }         
                return result;  
            }  </span>

运行效果:

 

总结:

服务器端将所传值写入XML格式的JSP页面中,Android对XML进行解析,得到标识值


那我也来总结一下:三个字:

看不懂。


等我改天整理出一个简单版……哦不,自己写一个很简单的服务器+一个很简单的客户端再把程序贴上来更新好了。[2015/05/08]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值