页面布局控件覆盖
报错信息:
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]