Android Studio 与 Tomcat 交互案例(新)
首先默认已经装了Tomcat了,这方面的教程网上一大堆。
github地址
文章目录
- 两数求和
- 账户登录与注册
两数求和
参考android与tomcat数据交互所写
移动端输入两个数,点击按钮,在web端计算结果并返回,最后在页面弹出
Web端:
web项目名:WebProject_war
只写了个Servlet进行逻辑的运算,Servlet名为:Servlet
package com.Servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Servlet*/
@WebServlet("/Servlet")
public class Servlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Servlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub// TODO Auto-generated method stub//避免使用super.doPost(request,response)PrintWriter out = response.getWriter();String n1 = request.getParameter("n1").trim();String n2 = request.getParameter("n2").trim();if(n1!=null && n2 != null && !"".equals(n1) && !"".equals(n2)) {int a = Integer.parseInt(n1);int b = Integer.parseInt(n2);out.print(Integer.toString(a+b));out.flush();out.close();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
接着导出改项目的war包,不管是IDEA还是Eclipse导出War包的博客有很多,这里不在讲了。
导出后,将war包放在tomcat根目录下的webapps文件夹下。并且在根目录的bin文件夹中点击startup.bat启动tomcat。
移动端:
新建项目TomcatTest
编写一个简单的页面,有两个输入框和一个按钮。
activtiy_main.xml 代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:padding="10dp"android:orientation="vertical"><EditTextandroid:id="@+id/shuju1"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="input n1"/><EditTextandroid:id="@+id/shuju2"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="input n2"/><Buttonandroid:id="@+id/sum"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAllCaps="false"android:text="Sum"/></LinearLayout>
然后是MainActivity.java的代码:
package com.example.tomcattest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;public class MainActivity extends AppCompatActivity {private EditText shuju1;private EditText shuju2;String n1,n2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.sum);shuju1 = (EditText) findViewById(R.id.shuju1);shuju2 = (EditText) findViewById(R.id.shuju2);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {try {// Log.d("MainActivity","Start");final String URL="http://10.0.2.2:8080/WebProject_war/Servlet";//根据自己的项目需要修改new Thread(new Runnable() {public void run(){String msg = "";n1 = shuju1.getText().toString();//获取输入框的值n2 = shuju2.getText().toString();try {// Log.d("MainActivity","Continue");URL url = new URL(URL);//生成一个URL实例,指向我们刚才设定的地址URL/*openConnection()方法只是创建了一个HttpURLConnection实例,并不是真正连接,在连接之前可以设置一些属性*/HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST"); //设置请求方式为postconn.setReadTimeout(5000);//设置超时信息conn.setConnectTimeout(5000);//设置超时信息conn.setDoInput(true);//设置输入流,允许输入conn.setDoOutput(true);//设置输出流,允许输出conn.setUseCaches(false);//设置POST请求方式不能够使用缓存/*定义我们要传给servlet的参数,格式好像一定要xxx=xxx,代表键值对,如果有多组,要加一个&, //如“cmd1=version&cmd2=value”*/String data = "n1=" + n1 + "&n2=" + n2;// System.out.println("shuju" +" " + n1 +" "+n2);/*获取输出流,其实在这之前还应该有一个操作:conn.connect();意思为建立HttpURLConnection连接,只不过//getOutputStream()方法会隐含进行连接,所以不调用connect()也可以建立连接*/OutputStream out = conn.getOutputStream();//把data里的数据以字节的形式写入out流中out.write(data.getBytes());//刷新,将数据缓冲区中的数据全部输出,并清空缓冲区out.flush();//关闭输出流并释放与流相关的资源out.close();/*这里是将conn.getInputStream中的数据包装在字符流的缓冲流reader中这里值得一说的是:无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发出去,同时getInputStream返回的值就是servlet返回的数据*/BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;if ((line = reader.readLine()) != null) {/*如果数据比较多的话要把if换成while,循环体代码也要小改一下,由于我当时只是测试,就没改*/msg = line;}Looper.prepare();//为了在子线程中使用ToastToast.makeText(MainActivity.this, "The answer is " +msg, Toast.LENGTH_SHORT).show();Looper.loop();conn.disconnect();} catch (IOException e) {e.printStackTrace();}}}).start();} catch (Exception e) {e.printStackTrace();}}});}
}
最后在AndroidManifest.xml中声明网页权限,并且允许使用未加密网络
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.tomcattest"><uses-permission android:name="android.permission.INTERNET"/><application....android:usesCleartextTraffic="true">....</application></manifest>
关于URL="http://10.0.2.2:8080/WebProject_war/Servlet"
中链接的写法,就是你的ip:端口/项目名/访问文件
在一般的JavaWeb程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?
我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是Android模拟器(Android虚拟机),而不是你的电脑,明白了吗?这就是为什么你在模拟器中使用localhost时会报“Web
page not available”的原因。
那到底要如何才能访问到本地电脑上的Web应用呢?在Android中,默认将我们本地电脑的地址映射为10.0.2.2,因此,只需要将原先的localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的Web资源了。
这样,一个简单的求和计算机就生成了。
账户登录与注册
数据库用的MySQL ,数据库名为login,表名为user_table,字段如上图所示,其实这里演示只需要user和pwd两个属性就够了。
web后端:
用Eclipse写的
项目名为LoginTest,结构如下
这里主要是访问LoginCheckServlet,里面实现登录和注册的逻辑,而具体实现在Dao下。
接着导出改项目的war包,不管是IDEA还是Eclipse导出War包的博客有很多,这里不在讲了。
导出后,将war包放在tomcat根目录下的webapps文件夹下。并且在根目录的bin文件夹中点击startup.bat启动tomcat。
代码如有需要,去github自取。
android前端:
项目名LoginTest
页面两个输入框两个按钮,activity_main.xml代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="13dp"android:orientation="vertical"><EditTextandroid:id="@+id/admin"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="账户"/><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword"/><Buttonandroid:id="@+id/regist"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAllCaps="false"android:text="注册"/><Buttonandroid:id="@+id/login"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAllCaps="false"android:text="登录"/></LinearLayout>
然后在MainActivity.java中实现具体逻辑
package com.example.logintest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private EditText admin;private EditText password;private Button login;private Button regist;final String URL_LOGIN ="http://10.0.2.2:8080/LoginTest/loginCheckServlet";//根据自己的项目需要修改@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);admin = (EditText)findViewById(R.id.admin);password = (EditText) findViewById(R.id.password);login = (Button) findViewById(R.id.login);regist = (Button) findViewById(R.id.regist);login.setOnClickListener(this);regist.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.login:Log.d("Main","Start");new Thread(new Runnable() {@Overridepublic void run() {String ad = admin.getText().toString();String pw = password.getText().toString();String flag = "";try {Log.d("Main","Continue");URL url =new URL(URL_LOGIN);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST"); //设置请求方式为postconn.setReadTimeout(5000);//设置超时信息conn.setConnectTimeout(5000);//设置超时信息conn.setDoInput(true);//设置输入流,允许输入conn.setDoOutput(true);//设置输出流,允许输出conn.setUseCaches(false);//设置POST请求方式不能够使用缓存String data = "admin=" + ad + "&password=" + pw + "&flag=login";OutputStream out = conn.getOutputStream();out.write(data.getBytes());out.flush();out.close();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;if ((line = reader.readLine()) != null) {/*如果数据比较多的话要把if换成while,循环体代码也要小改一下,由于我当时只是测试,就没改*/flag = line;}} catch (IOException e) {e.printStackTrace();}String msg = "";if(flag.equals("true")) msg = "登录成功";else msg = "失败";Log.d("Main",msg);Looper.prepare();Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();Looper.loop();}}).start();break;case R.id.regist:new Thread(new Runnable() {@Overridepublic void run() {String ad = admin.getText().toString();String pw = password.getText().toString();String flag = "";try {URL url =new URL(URL_LOGIN);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST"); //设置请求方式为postconn.setReadTimeout(5000);//设置超时信息conn.setConnectTimeout(5000);//设置超时信息conn.setDoInput(true);//设置输入流,允许输入conn.setDoOutput(true);//设置输出流,允许输出conn.setUseCaches(false);//设置POST请求方式不能够使用缓存String data = "admin=" + ad + "&password=" + pw + "&flag=regist";OutputStream out = conn.getOutputStream();out.write(data.getBytes());out.flush();out.close();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;if ((line = reader.readLine()) != null) {/*如果数据比较多的话要把if换成while,循环体代码也要小改一下,由于我当时只是测试,就没改*/flag = line;}} catch (IOException e) {e.printStackTrace();}String msg = "";if(flag.equals("true")) msg = "注册成功";else msg = "注册失败";Looper.prepare();Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();Looper.loop();}}).start();break;default:}}
}
最后在AndroidManifest.xml中声明网页权限,并且允许使用未加密网络
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.tomcattest"><uses-permission android:name="android.permission.INTERNET"/><application....android:usesCleartextTraffic="true">....</application></manifest>
关于URL="http://10.0.2.2:8080/WebProject_war/Servlet"
中链接的写法,就是你的ip:端口/项目名/访问文件
在一般的JavaWeb程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?
我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是Android模拟器(Android虚拟机),而不是你的电脑,明白了吗?这就是为什么你在模拟器中使用localhost时会报“Web
page not available”的原因。
那到底要如何才能访问到本地电脑上的Web应用呢?在Android中,默认将我们本地电脑的地址映射为10.0.2.2,因此,只需要将原先的localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的Web资源了。
Android Studio 与 Tomcat 交互案例(新)相关推荐
- android studio开发工具遇到一个新问题一直卡indexing paused due to batch update不停的转
3.2.1以上版本的android studio开发工具遇到一个新问题一直卡indexing paused due to batch update不停的转 解决方法有一下两种方式: 1.第一种解决方式 ...
- Android studio+idea+tomcat+mysql实现网络视频播放器app全套源码(前端后端都有)
目录 文章目录 前言 一.功能介绍 1.登录页背景视频(主流app必备) 2.glide实现下拉刷新和上拉无限加载视频列表 3.exoplayer播放器实现全视频无卡顿播放.全屏播放 4.二维码生成器 ...
- android studio编程实例,Android Studio JNI 开发简单案例
进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C .C++ 写的,那么在 Android 中怎么调用底层的库呢?这里就需要了解 JNI 技术. Android Studio 出来两年多 ...
- Android Studio开发第二篇创建新项目
创建新项目很简单,File-New-New Project,这个没什么好说的跟Eclipse都差不都. 第二步SDK选择,有手机平板还有Wear,TV,汽车Auto,谷歌眼镜等几个种平台,这里就先选择 ...
- Android Studio从gthub上导入新项目的时候,R文件丢失的问题
当你更新了sdk版本后可能会遇到这样的情况:导入人家的完整的项目会出现R文件丢失,或者新建一个项目直接就不生成R文件,这种情况下,你可能Fix了好多次,clean了N次,但是还是不行,你可以试试下面的 ...
- android studio 3.0新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- Android Studio 3.2新功能特性
android studio3.2预览版本已经发布了,下面这些功能在最新的版本已经提供,但可能尚未在测试版本中发布渠道中提供. 什么是新的助理 Android Studio 3.2有一个新的Assis ...
- Android Studio启用新代号,新版本Arctic Fox(白狐)重点新特性一览!
目录 Android Studio 新的版本命名规则 Arctic Fox 有哪些新特性? 总结 对于Android开发者来说,Android Studio 是我们首选的开发工具,它基于强大的Inte ...
- Android studio 4.2新特性及升级异常
Android studio 版本及特性系列目录 Android 12 终于来了,你准备好了吗? Android studio 4.2新特性 Android studio 4.1新特性 Android ...
最新文章
- 在git中出现中文乱码的解决方案
- STL中的空间配置器
- Thinkpad X240使用U盘安装Win7系统
- java中的gui_java gui快速入门教程
- blender教学记录
- 进程vs线程 java 1615387415
- JavaScript 简史:从网景到框架 | 技术头条
- Java I/O系统之Writer
- 信标链 分片链 是什么?
- Julia : HDF5、JLD2库、group、dataset
- 【Unity3D插件】XCharts插件分享《图表插件》
- 2016版excel_【收藏转发】全套Excel自动计算表139份(回弹、土工、钢筋、集料、粉煤灰等)...
- 2.16 自定义快速访问工具栏以提升工作效率 [原创Excel教程]
- excel做ns流程图_NS流程图是什么图?用这款软件轻松画NS流程图
- 浅谈“互联网+”浪潮下传统行业的战略转型
- 制作商品详情页面案例
- crosscheck(crosscheck是什么意思)
- 活性DNA羟化酶 Tet1 活性测定
- 平安京服务器维护无法发布新内容,《阴阳师》手游3月6日维护更新公告
- 前端词汇(后续整理)
热门文章
- 街篮中服务器维修什么时候能结束,《街篮》32强名单确定 贺岁杯首轮结束
- 解决win7 WLAN Autoconfig无法启动,错误1086的解决方案
- DNS那些事——从浏览器输入域名开始分析DNS解析过程
- 和快乐女声交友,SNS要干嘛?
- bowtie 加mn标签_bowtie和bowtie2用法详解
- 【Java基础】基本类型和包装类的区别
- 红帽系统RHEL7 安装cuda10.2及对应的cudnn7.6.5
- 【LOL DOTA】面向对象详解
- 【案例拆解】如何利用数据分析手段,有效地驱动产品迭代!
- DotNetty使用之心跳机制