原来代码:
function gerflowerinfo(cateval,URL){
$.ajax({
url:URL,//不能是双引号,不然为常量
type:"post",
async:true,
dataType:"json",
//jsonp: "jsoncallback",//1.解决跨域问题,然而并卵
//jsonpCallback:"loginCallback",//2.<span style="font-family: Arial, Helvetica, sans-serif;">解决跨域问题,然而并卵</span>
data:{"cateval":cateval},
success:function(data){
alert("成功了吗?");
//$("#fmeans").html("成功了吗?");
},
error:function(XMLHttpRequest,textStatus,errorThrown){
alert(XMLHttpRequest.status);//结果为0
alert(XMLHttpRequest.readyState);<span style="font-family: Arial, Helvetica, sans-serif;">//结果为0</span>
alert(errorThrown);
}
})
}
原来思路:html5页面的js中利用ajax访问服务器的数据,成功的话调用ajax中的success,对data数据进行处理。根据需求放到页面的标签当中。
问题:虽然参数成功传到了后台并且成功的从数据库中查询到了数据,但是返回前台时一直调用error.
问题分析:ajax的跨域局限性,手机和电脑在不同域,数据返回到前台有限制,这是ajax一直存在的问题。
解决方法:后来没办法,只能通过html调用js----->通过js----->访问java代码-------->通过java代码发送http请求服务器数据-------->返回到java,再发送给html
注意:1.
JS可以通过反射来访问其他一些内容。通过引入 @JavascriptInterface注解,则在JS中只能访问 @JavascriptInterface注解的函数。这样就可以增强安全性。
如果您的应用android:targetSdkVersion数值为17或者大于17记得添加 @JavascriptInterface 注解。
下面为关键代码段:
html中:
标签:<li><a href="javascript:test('1');"><img src="../img/ssfw6.jpg" alt="季节"><h3>季节</h3></a></li>
js:
function test(index)
{
action.setParam(index);//通过注解得到的
action.findflower();//调用java里面的方法
}
Activity中:
1.
twebview.addJavascriptInterface(new DemoJavaScriptInterface1(), "action");
twebview.loadUrl("file:///android_asset/html/taohua.html");
2.msg用来将服务器的数据发送给html
FinalAttribute.taomHandler=new Handler(){//定义的全局变量
@Override
public void handleMessage(Message msg) {
if (msg.what==1)
{
String content=msg.obj.toString();
DemoJavaScriptInterface1 ds= new DemoJavaScriptInterface1(content);//这个content就是从后台获取的json数据
ds.setParam(FinalAttribute.cate);//这个是分类id
//twebview.removeJavascriptInterface("action");
twebview.addJavascriptInterface(ds, "action1");
twebview.loadUrl("file:///android_asset/html/festival2.html");
}
}
};
java中:
1.
<span style="background-color: rgb(255, 204, 204);">DemoJavaScriptInterface1</span>
package com.graduationproject.custom;
import android.util.Log;
import android.webkit.JavascriptInterface;
import com.graduationproject.entity.FinalAttribute;
/**
* Created by Administrator on 2015/10/17.
*/
public class DemoJavaScriptInterface1 {
public String param;
private String content;
@JavascriptInterface、、
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@JavascriptInterface
public String getParam() {
return param;
}
@JavascriptInterface
public void setParam(String param) {
FinalAttribute.cate=param;
this.param = param;
}
public DemoJavaScriptInterface1() {
}
public DemoJavaScriptInterface1(String p) {
content=p;
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
@JavascriptInterface
public void findflower() {
FinalAttribute.taomHandler.post(new Runnable() {
public void run() {
//AlertDialog.Builder builder=new AlertDialog.Builder(getContext()).setTitle("test").create().show();
Log.i("tag", "action is alive");
GetFlowerInfo1 info = new GetFlowerInfo1(param);
info.start();
}
});
}
}
2.
<span style="background-color: rgb(51, 204, 255);">GetFlowerInfo1 </span>
package com.graduationproject.custom;
import android.os.Message;
import com.graduationproject.entity.FinalAttribute;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
/**
* Created by Administrator on 2015/10/17.
*/
public class GetFlowerInfo1 extends Thread{
private String param;
public GetFlowerInfo1(String p)
{
param=p;
}
@Override
public void run() {
getfinfoByPost(param);
}
//通过post方法向后台提交数据
public void getfinfoByPost(String paras) {
String result;
try{
//定义获取http客户端对象
DefaultHttpClient httpClient=new DefaultHttpClient();
String url="http://192.168.155.1:8080/TaoFlower/getflowerinfo?cateval="+paras;
//获取向访问地址发出的请求对象
HttpGet request=new HttpGet(url);
//获取从访问地址返回的响应对象
HttpResponse response=httpClient.execute(request);
System.out.println("paras值:"+paras);
if(response.getStatusLine().getStatusCode()== 200){
//将响应请求的对象转换成实体形式的字符形式的参数
result= EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println("result值:"+result);
Message msg=new Message();
msg.what=1;
msg.obj=result;
FinalAttribute.taomHandler.sendMessage(msg);
//创建一个json对象
// JSONObject jsonObject=new JSONObject(result);
// Gson gson=new Gson();
// List<Flower> retList = gson.fromJson(result,
// new TypeToken<List<Flower>>() {
// }.getType());
//将从后台获取的数据放到封装对象里面
//return result;
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
html页面如何获取:
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>var temp=action1.getContent();//json数据内容
var cateval=action1.getParam();//类别id
//alert(temp);