首先默认已经装了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. 在git中出现中文乱码的解决方案
  2. STL中的空间配置器
  3. Thinkpad X240使用U盘安装Win7系统
  4. java中的gui_java gui快速入门教程
  5. blender教学记录
  6. 进程vs线程 java 1615387415
  7. JavaScript 简史:从网景到框架 | 技术头条
  8. Java I/O系统之Writer
  9. 信标链 分片链 是什么?
  10. Julia : HDF5、JLD2库、group、dataset
  11. 【Unity3D插件】XCharts插件分享《图表插件》
  12. 2016版excel_【收藏转发】全套Excel自动计算表139份(回弹、土工、钢筋、集料、粉煤灰等)...
  13. 2.16 自定义快速访问工具栏以提升工作效率 [原创Excel教程]
  14. excel做ns流程图_NS流程图是什么图?用这款软件轻松画NS流程图
  15. 浅谈“互联网+”浪潮下传统行业的战略转型
  16. 制作商品详情页面案例
  17. crosscheck(crosscheck是什么意思)
  18. 活性DNA羟化酶 Tet1 活性测定
  19. 平安京服务器维护无法发布新内容,《阴阳师》手游3月6日维护更新公告
  20. 前端词汇(后续整理)

热门文章

  1. 街篮中服务器维修什么时候能结束,《街篮》32强名单确定 贺岁杯首轮结束
  2. 解决win7 WLAN Autoconfig无法启动,错误1086的解决方案
  3. DNS那些事——从浏览器输入域名开始分析DNS解析过程
  4. 和快乐女声交友,SNS要干嘛?
  5. bowtie 加mn标签_bowtie和bowtie2用法详解
  6. 【Java基础】基本类型和包装类的区别
  7. 红帽系统RHEL7 安装cuda10.2及对应的cudnn7.6.5
  8. 【LOL DOTA】面向对象详解
  9. 【案例拆解】如何利用数据分析手段,有效地驱动产品迭代!
  10. DotNetty使用之心跳机制