龙空技术网

Android与javaweb数据交互

嘻嘻哈哈笑呵呵 709

前言:

眼前各位老铁们对“java怎么和数据库交互”大概比较关切,看官们都想要了解一些“java怎么和数据库交互”的相关内容。那么小编在网络上收集了一些关于“java怎么和数据库交互””的相关文章,希望姐妹们能喜欢,朋友们快快来了解一下吧!

Android向前端发送数据

一般需要交互的数据无非就是文件和字符串(可以替代很多东西),文件又可以变为字符串流进行传输。本文将使用okhttp包从Android端向后端发送数据和接收返回数据。

注意:个人电脑测试若无https协议的域名或ip地址,请在Android的AndroidManifest.xml文件中声明使用明文传输,即不加密而使用http协议。

<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true" android:usesCleartextTraffic="true"//此处默认选项为false,不启用明文传输,改为true即可android:theme="@style/AppTheme"></application>

数据发送,Android端向客户端发送消息如果为get直接在url中添加参数即可,下面主要介绍post,用字符串作为post参数,文件将经过base64编码为字符串传输,字符串类型数据可采用json传输也可以直接用字符串。

注意:okhttp包需额外下载,包含okhttp和okio两个包且版本存在不适配问题,需要对应,这里采用okhttp3.12, okio1.14。如果使用grade(一般Android都是这个),可直接在build.grade中使用`implementation group: 'com.squareup.okio', name: 'okio', version: '1.14.0'`导入,建议下载对应包。

注意:数据发送操作(向网络申请数据)为耗时操作,不可在主线程中运行,另外不建议直接在oncreate等视图创建方法中调用,可以作为按钮点击事件调用。另外收sdk限制同时会限制jdk版本,这里使用的base64编码是Android自带的,与稍后后端解析时的不同。因为jdk版本原因及编码规范,存在不同格式的base64编码,Androidsdk26以上可采用java自带的base64编码工具。

new Thread(){      //重写线程run方法      @Override      public void run()      {          //定义okhttp对象          OkHttpClient okHttpClient = new OkHttpClient();          try {              //如果传输文件              FileInputStream inputStream = new FileInputStream(new File(getDataDir() + "/x1.png"));              //文件读取为bytes              byte[] bytes = new byte[inputStream.available()];              inputStream.read(bytes);              //将bytes使用base64编码              String a1 = Base64.encodeToString(bytes, Base64.NO_PADDING);              //post的方法体,用来添加数据(key-value方式),但只能添加字符串作为数据              FormBody formBody = new FormBody.Builder().add("w1", a1).add("w2", "wad").build();              //请求创建              Request request = new Request.Builder().url(";).post(formBody).build();              //执行请求              Call call = okHttpClient.newCall(request);              Response response = call.execute();//获得服务端返回内容              //将返回内容作为字符串输出,也可转换为bytes等              System.out.println(response.body().string());          }          catch (IOException e) {         		 e.printStackTrace();      }	}}.start();//线程直接启动

服务端接收与返回数据

项目使用tomcat,利用struts的action请求和返回数据。action可返回不限于json、html网页、流格式的内容。项目大致结构如下。

项目结构图

其中images文件夹作为Android端文件存储库和返回信息库,一般不建议将此类文件放入项目内,一个是通过相对路径不方便调取(存在诸多问题,所以放在外边采用绝对路径访问),还有就是对于tomcat下webapps的内容均可以通过url访问,文件直接就泄露了。index.jsp并无什么用,只是默认主页。

struts.xml配置文件,此文件build完成时需在WEB-INF/classes文件夹下,关于在web.xml里配置struts不再给出.

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"";><struts>//此包用于返回json数据,继承json-default包,也可通过result-types指定,不再介绍<package name="backJOSN" extends="json-default">//活动配置,负责返回json数据,可以返回json文件或者自定义json串,这里是有action内部变量组成的json串<action name="login" class="com.example.titanback.LoginAction"><result type="json"></result></action></package>//继承默认包,可返回文件流或者html文件文本<package name="backHTML" extends="struts-default">//返回图片的活动<action name="imgBack" class="com.example.titanback.ImgBackAction"><result type="stream">//返回流//配置返回流,返回png格式图片,并配置对应变量<param name="contentType">image/png</param><param name="inputStream">inputStream</param></result></action></package></struts>

代码,此代码将返回json字符串:

//可继承Action接口或继承ActionSupport类public class LoginAction extends ActionSupport{        //变量和setter、getter方法        private String username;        private String password;        public void setUsername(String username) { this.username = username; }        public String getPassword() { return password; }        public String getUsername() { return username; }        public void setPassword(String password) { this.password = password; }        @Override        public String execute() throws Exception        {              //获取上下文,getResponse可获取response对象              HttpServletRequest actionContext = ServletActionContext.getRequest();              //输出获取参数              System.out.println(actionContext.getParameter("w1"));              String a1 = actionContext.getParameter("w1");              //文件写入流,采用绝对路径              FileOutputStream outputStream = new FileOutputStream("C:\\Users\\1\\Desktop\\Titan\\titanback\\images\\x1.png");              //将base64解码,注意以为jdk原因,需要去掉换行符,最好采用utf-8编码              ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getMimeDecoder().decode(a1.replace("\r\n", "").getBytes(StandardCharsets.UTF_8)));              //输出流直接转换              inputStream.transferTo(outputStream);              outputStream.close();//关闭              setUsername("w112");//设置参数              setPassword("wdaw");              return SUCCESS;			}}

注意:关于base64编码问题,请看:()

此代码将返回png格式图片流:

public class ImgBackAction implements Action{      //要返回的变量      private InputStream inputStream;      public InputStream getInputStream() { return inputStream; }      public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; }      @Override      public String execute() throws Exception      {            //绝对路径打开文件,并获取流            FileInputStream inputStream = new FileInputStream(new File("C:\\Users\\1\\Desktop\\Titan\\titanback\\images\\jisaunqi.png")); //设置变量            setInputStream(inputStream);            return SUCCESS;      }}

标签: #java怎么和数据库交互 #html与java后台交互 #html如何与java交互