首先默认已经装了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 交互案例(新)相关推荐

  1. android studio开发工具遇到一个新问题一直卡indexing paused due to batch update不停的转

    3.2.1以上版本的android studio开发工具遇到一个新问题一直卡indexing paused due to batch update不停的转 解决方法有一下两种方式: 1.第一种解决方式 ...

  2. Android studio+idea+tomcat+mysql实现网络视频播放器app全套源码(前端后端都有)

    目录 文章目录 前言 一.功能介绍 1.登录页背景视频(主流app必备) 2.glide实现下拉刷新和上拉无限加载视频列表 3.exoplayer播放器实现全视频无卡顿播放.全屏播放 4.二维码生成器 ...

  3. android studio编程实例,Android Studio JNI 开发简单案例

    进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C .C++ 写的,那么在 Android 中怎么调用底层的库呢?这里就需要了解 JNI 技术. Android Studio 出来两年多 ...

  4. Android Studio开发第二篇创建新项目

    创建新项目很简单,File-New-New Project,这个没什么好说的跟Eclipse都差不都. 第二步SDK选择,有手机平板还有Wear,TV,汽车Auto,谷歌眼镜等几个种平台,这里就先选择 ...

  5. Android Studio从gthub上导入新项目的时候,R文件丢失的问题

    当你更新了sdk版本后可能会遇到这样的情况:导入人家的完整的项目会出现R文件丢失,或者新建一个项目直接就不生成R文件,这种情况下,你可能Fix了好多次,clean了N次,但是还是不行,你可以试试下面的 ...

  6. android studio 3.0新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  7. Android Studio 3.2新功能特性

    android studio3.2预览版本已经发布了,下面这些功能在最新的版本已经提供,但可能尚未在测试版本中发布渠道中提供. 什么是新的助理 Android Studio 3.2有一个新的Assis ...

  8. Android Studio启用新代号,新版本Arctic Fox(白狐)重点新特性一览!

    目录 Android Studio 新的版本命名规则 Arctic Fox 有哪些新特性? 总结 对于Android开发者来说,Android Studio 是我们首选的开发工具,它基于强大的Inte ...

  9. Android studio 4.2新特性及升级异常

    Android studio 版本及特性系列目录 Android 12 终于来了,你准备好了吗? Android studio 4.2新特性 Android studio 4.1新特性 Android ...

最新文章

  1. TensorFlow:Object_Detection_API在Windows10上的配置
  2. 汇编--条件跳转指令
  3. leetcode C++ 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后
  4. 浏览器中xhr选项是做什么用的呢_XHR和AJAX终于搞懂了!!
  5. jQuery easyUI--zTree属性菜单
  6. 自定义EventSource(一)EventCounter
  7. netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)
  8. Vue学习笔记(3)(Vue CLI)
  9. Linux命令Man解释:PPPD(8):点对点daemon协议
  10. 阿里布局物联网!开源操作系统 AliOS Things 喜提 1 亿芯片出货量
  11. bzoj 2502: 清理雪道(有下界的最小流)
  12. 时钟转盘html源代码
  13. 汽车工况电量计算-转速扭矩图
  14. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 第一篇
  15. 芋道Docker部署
  16. Couldn‘t delete the database.MySQL said: Error dropping database (can‘t rmdir ‘./test‘, errno: 66)
  17. 新用户域名实名认证教程---金万维
  18. 我如何构建Pomodoro Clock应用程序,以及在此过程中学到的课程
  19. ThinkPHP5客户关系管理系统(CRM)
  20. 数据结构 算法与应用(c++ 描述) 自练答案

热门文章

  1. Linux下启动crm项目
  2. 写一个项目的具体流程
  3. 镜头的选择和主要参数
  4. python根据身份证前17位数计算第18位数
  5. python实现SHA256
  6. 网络操作系统和“鲜果在线”
  7. Redis 最佳实践 1
  8. java jdk linux 安装_Linux安装JDK
  9. Mac虚拟机vitrualbox、Parallels Desktop、VMware体验
  10. 开一家披萨店需要多少钱,都要什么设备?【Lucy比萨】