像SpringMVC一样在Android上做Web开发

Android客户端连接SSM(Spring+SpringMVC+Mybatis)框架Java服务器端 Android客户端开发越来越流行,但是,Android客户端对应的服务器端采用什么框架呢?对于功能较为简单的应用,我建议,直接采用java web开发最简单的MVC框架即可(很多Android应用的服务器端开发框架,我都是采用这种);但是,对于功能较为复杂,数据库表较多,逻辑关系比较复杂的应用开发,服务器端逻辑关系自然也是一样,我们是否可以考虑采用java web开发流行的SSH2/SSM等框架呢 阅读详情

一部分Android开发者看到这个标题时可能有点疑惑,SpringMVC不是用来做JavaWeb开发的吗?难道被移植到Android上来了?答案是否定的,因为SpringMVC是基于Servlet的,在Android上开发一个支持Servlet的容器(Tomcat、JBoss)可不简单,所以我们是在Android上开发了一套全新的WebServer + WebFramework。

AndServer2.0基于编译时注解实现了SpringMVC的大部分注解Api,其Request的分发流程也基本和SpringMVC一致,与SpringMVC最大的不同是SpringMVC基于运行时注解,并且SpringMVC提供的功能更多更强大。不过AndServer提供的功能在Android上来做服务端开发是完全足够的。

看到这里读者朋友应该知道了,AndServer2.0是使用注解开发Web程序的,为了有个更直观的了解,我们先看一个模拟用户登录的Http Api:

@RestController

public class UserController {

@PostMapping("/login")

public String login(@RequestParam("account") String account,

@RequestParam("password") String password) {

if(...) {

return "Successful";

}

return "Failed";

}

}

复制代码

假设服务端的Address是192.168.1.11,监听的端口是8080,那么通过http://192.168.1.11:8080/login就可以访问该登录Http Api了。

感兴趣的读者可以帮我们做一下Code Review:

github.com/yanzhenjie/…

下文将依次介绍以下三点:

系统层架构

应用层架构

使用示例

1. 系统层架构

我们都知道Http是根据Http协议使用Socket做了连接属性、数据格式、交互逻辑方面的包装,我们来模拟一段服务端启动Server的代码:

public void startServer(String address, int port) {

InetAddress inetAddress = InetAddress.getByName();

ServerSocket serverSocket = new ServerSocket(8080, 512, inetAddress);

while (true) {

Socket socket = serverSocket.accept();

HttpConnection connection = HttpParser.parse(socket);

HttpThead thread = new HttpThread(connection);

thread.start();

}

}

ServerSocket监听了某个端口,当有Socket连接上来的时候去把这个Socket解析为HttpConnection,解析过程是按照Http协议拟定的格式,从Socket的InputStream读取一些数据后,用Request和Response包装Socket和未读取的流(比如标记下次读取流的起点),下文会再提到。

接着HttpParser用HttpConnection包装了Request和Reponse返回,可想而知,作为服务端程序,HttpConnection至少包涵了Request和Response对象:

public class HttpConnection {

private Request mRequest;

private Response mResponse;

...

}

紧接着启动了一个线程去处理当前连接,其实也就是处理当前Request,用Response写出数据,怎么处理这个Request是一个WebFramework的核心,作为Http服务端程序,应该能提供Html文件、JS文件、Java Method(Http Api)等让客户端访问,因此得有一个管理员来负责请求和资源的匹配,所以有一个叫做HttpDispatcher的类来决定这个Request应该发给哪个资源去处理:

public class HttpDispatcher {

public void dispath(Request request, Response response) {

...

}

}

在HttpThead里面,当线程被唤起时只需要负责调用HttpDispatcher#diaptch()即可,到这里就比较清晰了,只需要HttpDispatcher把当前Request派发到对应的Html File或者Java Method处理就可以了,具体的处理就属于HttpFramework的事,我们下文再讲。

这就是一个简单的WebServer的蓝图,我们根据设想画出了系统层架构图:

13467292-f55d91799ea13a1f

系统层运行时流程图:

13467292-e5edc4a7ceb4d0a5

上图中,Handler表示处理请求的操作手柄,可能是Html File或者Java Method。值得高兴的一点是,在我们迭代了几个版本后,发现Apache组织提供了上述蓝图中的HttpParser层,因此为了稳定性和节省人力我们已经替换该层为Apache的实现。

2. 应用层架构

应用层就是上文中提到的WebFramework,也就是上一个小节流程图的Framework层,包括了Session的处理、Cookie的处理、Cache的处理等。

接着上文,HttpDispatcher需要把当前Request派发到对应的Html File或者Java Method处理,而Handler代表了Html File或者Java Method,因为此二者区别极大,用一个类来表示它们显然有些不合理,于是我们想到了使用Adapter模式,所以有了一个抽象类RequestHandler:

public abstract class RequestHandler {

public abstract void handle(Request request, Response response);

}

RequestHandler可以表示任何文件或者Java Method,HttpDispatcher的作用是分发请求到各个资源,所以HttpDispatcher不应该来分析某个RequestHandler具体是什么东西,它应该直接调用RequestHandler来处理请求,因为Html File或者Java Method对应的RequestHandler在实现上显然大有不同,所以这里适用Adapter模式,于是我们用HandlerAdapter去做RequestHandler的适配:

public class HandlerAdapter {

public RequestHandler getHandler(Request request) {

...

}

...

}

HandlerAdapter除了能获取RequestHandler之外,还需要做一些描述性的工作,好让HttpDispatcher知道当前适配的RequestHandler是可以处理正要分发的这个Request的。

因为Html File和Java Method的返回值又是大相径庭,因为返回值是输出到客户端展示的,所以我们把返回值抽象为View:

public class View {

public Object output() {

...

}

...

}

如上所以,output()方法就是获取Handler输出的内容,还有其他方法是对这个输出的描述,这里不例举。

因为View是返回值,没有具体的交互了,所以不适用Adapter模式了,因此我们必须有一个处理返回值的机制,把处理返回值的机制叫做ViewResolver:

public class ViewResolver {

public void resolver(View view, Request request, Response response) {

...

}

}

在ViewResolver中根据输出内容的类型不同,处理方式也不同,最终把输出内容通过Response对象写出去,底层是使用上文中提到的被Response包装的Socket写出。

这就是一个简单的WebFramework的蓝图,我们根据设想画出了应用层架构图:

13467292-5420a2a6bb70a7b7

应用层运行时流程图:

13467292-bc2c66187b12778c

上图中,Interceptor表示对请求的拦截器,比如可以做一些不允许没登录或者没权限的请求进入的工作。ExceptionResolver表示全局异常处理器,比如某个Api发生了异常,会转到ExceptionResolver中处理,而不至于当前请求不响应或者响应了不想被客户端看到的消息。

另外需要补充的是,上文中提到的都是粗略的设计,中间还有一些细节,例如Session的处理、Cookie的处理、缓存的处理等都未提到,其中任何一个知识点单独拿出来都可以写一篇文章,由于篇幅关系这里不做详细介绍。

架构设计和流程到此就都介绍完了,有兴趣的开发者也可以自己实现一下。

3. 使用示例

AndServer对于方便使用的理念是:只需要添加注解即可,不需要再做额外的配置。所以除了像文章开头那样用注解写好Api之外,只需要指定监听端口启动服务器就可以了。

与读者做个约定,下文中服务器Address都是192.168.1.11,监听的端口是8080。

3.1. 网站部署示例

我们先来部署一个位于Assets中/web下的网站:

@Website

public class InternalWebsite extends AssetsWebsite {

public InternalWebsite() {

super("/web");

}

}

因此SD的文件可以删除也可以增加,所以很方便做一些文件的热插拔,部署SD卡的网站:

@Website

public class InternalWebsite extends StorageWebsite {

public InternalWebsite() {

super("/sdcard/AndServer/web");

}

}

如上所示,开发者只需要将网站所在的路径告诉AndServer,并添加Website注解即可,该网站的Html、CSS、JS、其它文件都可以被访问,例如/web目录下有一个index.html文件,那么访问地址就是http://192.168.1.11:8080/或者http://192.168.1.11:8080/index.html。

3.2. Http Api开发示例

在文章开头我们看了一个模拟用户的Http Api,下面我们增加一个模拟获取用户信息的Api:

@RequestMapping("/user")

@RestController

public class UserController {

@PostMapping("/login")

public String login(@RequestParam("account") String account,

@RequestParam("password") String password) {

if(...) {

return "Successful";

}

return "Failed";

}

@GetMapping("/info/{userId}")

public User info(@PathVariable("userId") String userId) {

User user = ...;

return user;

}

}

于是我们得到两个地址:

POST http://192.168.1.11:8080/user/login

GET http://192.168.1.11:8080/user/info/uid_001

接下来什么配置都不用做,只需要启动服务器,这几个地址就可以用了。

3.3. 启动服务器

AndServer.serverBuilder()

.inetAddress(NetUtils.getLocalIPAddress())

.port(8080)

.timeout(10, TimeUnit.SECONDS)

.build()

.start();

如上所示只需要指定要监听的服务端地址和端口,启动服务器就可以访问上面的所有地址了,不需要再做其他配置

加群即可获取Java工程化、高性能及分布式、高性能、高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及领取相关资料,群号:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

java web接口开发(三) 接口调用实现 前面两篇文章讲解了,接口服务的搭建以及接口的开发,如果你还未了解,可以先看看文章,java web开发(一) 环境搭建和 java web开发(二) 接口开发。本篇文章,结合后台接口服务和客户端。客户端从接口获取数据,然后展示。(客户端使用Android)。 一.接口服务创建。可以参考上篇文章,这儿就不啰嗦了! 二. 实现Android项目。 1.创建Android项目。相信大家都会... 阅读详情

相关推荐

完整成绩管理系统web与Android端开发

在当前的教育领域,成绩管理系统扮演着至关重要的角色。它不仅能够帮助学校、教师和学生高效地管理学生的学习成绩,还可以提供丰富的数据分析,从而优化教学方法和学习策略。本系统旨在打造一个全面、灵活且用户友好的成绩管理平台,提供Web端和Android移动端两个接口,使数据访问更加方便,提高工作效率。Web端作为系统的主界面,为管理员、教师和学生提供登录入口。管理员可以进行用户管理、课程管理、成绩录入和数据统计等操作;教师可以录入和查看学生分数,进行成绩分析;学生则可以查询个人成绩。

weixin_42593130的博客 803

web开发和android开发的区别

相同点: 两者都运行在各自的虚拟机中 不同点: 1.android中java可以加载c/c++编写的so库文件,web中不可以;web中只能将c/c++翻译成wasm文件,然后进行调用。(分析:web中之所以不能加载so文件的原因应该是浏览器不能直接操作文件系统) 2.android是c/s架构,web是b/s架构   Node.js和Javascript的区别: Node.js是j...

pkx1993的博客 1万+

SpringMVC MyBatis写全注解开发的安卓访问Sqlserver数据库后台代码 简单易懂适合新手

全部注解开发,对SQlServer数据库访问从头到尾。使用SQLjdbcjar包访问,SpringMVC MyBatis写全注解开发的安卓访问Sqlserver数据库后台代码 简单易懂适合新手。

Android和SpringMVC交互,像SpringMVC一样在Android上做Web开发

版权声明:转载须标明本文转自严振杰的博客 https://blog.youkuaiyun.com/yanzhenjie1003/article/details/82846398一部分Android开发者看到这个标题时可能有点疑惑,SpringMVC不是用来做JavaWeb开发的吗?难道被移植到Android上来了?答案是否定的,因为SpringMVC是基于Servlet的,在Android上开发一个支持...

weixin_39570530的博客 519

RFSOC实战解析(一):深入RF Data Converter的时钟与数据接口设计

本文深入解析RFSOC中RF Data Converter的时钟与数据接口设计,涵盖GHz采样、数据流处理、时钟树同步及AXI-Stream接口实战。通过详细案例和调试技巧,帮助工程师高效配置IP核,优化ADC/DAC性能,解决跨时钟域和信号完整性等关键问题。

weixin_30955617的博客 473

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

android spring mvc设计模式,像SpringMVC一样,在Android上做Web开发

AndServerAndroid平台的Web服务器和Web开发框架。AndServer像SpringMVC一样提供了注解方式,不同的是AndServer基于编译时注解,如果你使用过SpringMVC,那么你将很快的掌握它。静态网站部署动态Http Api部署@RestController@RequestMapping(path = "/user")public class UserControll...

weixin_39818662的博客 291

ADS 2024实战:手把手教你搞定2.3-3.5GHz宽带Doherty功放仿真与版图(附源文件)

本文详细解析了在ADS 2024环境中实现2.3-3.5GHz宽带Doherty功放的全流程设计,包括仿真与版图实现。从软件环境搭建、器件模型导入到核心电路设计、匹配网络优化,再到系统集成与版图生成,提供了实战技巧和关键参数设置。特别针对5G通信和卫星应用中的高效率需求,展示了如何通过ADS 2024的新功能提升设计效率。

weixin_42639246的博客 461

在Android上做服务端开发/Web开发/SpringMVC开发

像SpringMVC一样在Android上做Web开发 一部分Android开发者看到这个标题时可能有点疑惑,SpringMVC不是用来做JavaWeb开发的吗?难道被移植到Android上来了?答案是否定的,因为SpringMVC是基于Servlet的,在Android上开发一个支持Servlet的容器(Tomcat、JBoss)可不简单,所以我们是在Android上开发了一套全新的WebSer...

布莱克‌ 1万+

用友U8登录慢卡顿?别急着重启服务器,先检查UA_Message这张表(附SQL清理脚本)

本文针对用友U8登录慢卡顿问题,深入分析UA_Message表积压消息对系统性能的影响,并提供SQL清理脚本和优化方案。通过诊断、清理、索引优化和预防措施四步法,显著提升U8客户端登录速度,适用于后台管理和数据库维护场景。

weixin_28726671的博客 380

FairyGUI深度解析:Unity复杂UI开发的高效解决方案与性能优化

在Unity游戏和应用开发中,UI系统的性能与开发效率是核心挑战。原生UGUI的组件化模型在应对复杂、动态界面时,常面临Draw Call过高、层级管理臃肿的问题。其原理在于,每个UI元素对应一个GameObject,渲染合批受限于Transform层级与材质状态,易导致性能瓶颈。FairyGUI(FGUI)作为一种专业的第三方UI解决方案,其技术价值在于采用了截然不同的“舞台-显示对象”渲染模型。该模型通过内部轻量级对象管理与自主合批系统,实现了极高的运行时效率与Draw Call优化。在应用场景上,FG

weixin_31315567的博客 341

安卓app项目中如何发送消息到web后台

最近一个小项目需要将安卓机上获取到的一些信息发送到web后台上去,安卓机上的app代码是现成的,只需要稍微修改一下就可重新打包安装运行,web后台一开始是想通过springMVC的controller来利用底层servlet的doPost和doGet去处理客户端发送的http请求,但无论怎么尝试好像都失败了,无奈下只得采用建立TCP连接,利用Socket编程来实现通信。 需求 app上设置...

rebornyp的博客 1664

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9233

用AndServer做安卓手机服务器

用AndServer搭建手机服务器以及跨域问题解决AndServer官方文档地址AndServer简介什么情况需要用? AndServer官方文档地址 https://yanzhenjie.com/AndServer/ AndServer简介 AndServer是Android平台的Web Server和Web Framework。 它基于编译时注解提供了类似SpringMVC的注解和功能,如果您...

思量的博客 2505

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

SAP 关于替代料物料混用问题处理方案简介

电子料很多都是需要进行替代的,并且需要考虑当A物料库存不足时,需要考虑B物料的库存来满足需求,当需求不满足的时候也需要考虑物料的价格因素,同时考虑价格低的物料进行采购。3、还遇到过比较奇葩的处理替代料的解决方案就是将SAP系统中的需求数据用接口的方式全部传输到外围系统,同时还将所有物料的库存信息都通过接口的方式传输到外围系统中,然后通过外围系统进行替代料逻辑的处理,然后在回写回SAP更改BOM中的优先级,然后在重新下单,貌似解决了替代料的问题,但是好像又没有解决。时间:2024-01-27。

我小时候很黑的博客 2351

SpringMVC与安卓之间的交互1

springMVC与android的交互

lazyCoder 6599

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

关于Web,JavaWeb,SpringMVC,SpringBoot

目录WebjavaWebweb和javaweb区别SpringMVCSpringBootspringmvc和springboot比较 Web web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。 是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。 javaWeb

LXMoon_的博客 541

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

AndServer注解详解:SpringMVC风格的Android Web框架

AndServer是一款专为Android平台设计的Web服务器和Web框架,它采用SpringMVC风格的注解系统,让开发者能够轻松在Android应用中构建RESTful API和Web服务。本文将详细解析AndServer的核心注解体系,帮助开发者快速上手这个强大的Android Web开发工具。 ## 一、控制器注解:定义请求处理类 ### @Controller:标记控制器类 `@C

gitblog_02713的博客 536

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android开发应用实战详解,android开发网站

在我写过的 《Android程序员的Java后台学习建议》 中提到,因为 Java 的先天优势,Android 开发者在转岗选择时,转 Java 后端占据很大比例,因为 Java 后端岗位需求量较大,同时技术迁移成本也较低,比如现在 Java 开发中应用最广泛的。大潮过去后更多是淘汰“裸泳”,而如今的市场愈发趋向大前端,竞争之下我觉得移动开发的边界可以更广。,你需要关注的不再是当个设备上的业务逻辑,更需要关注的是大数据、并发、性能优化、分布式等等,这些都是转岗的你需要从头开始的,这是无可避免的成本。

2301_82101470的博客 1048

学安卓开发需要php,安卓后台开发需要学习什么?

安卓后台开发需要学习什么?时间:2017-03-20来源:Android开发学习网学习android开发需要学习java,学完javaSE部分,你就可以去学习安卓了,但是学习完android你也只能做出单机的应用,所以你需要学习安卓后台开发的一些知识,也就是服务器编程。什么是安卓后台开发?安卓后台开发就是安卓服务器端开发,单纯的单机应用实际上是很难做好用户体验的,例如你做一款游戏,用户一...

weixin_34212182的博客 573

Android 部署web服务器

AndServer 是一个轻量级的 Android Web 服务器库,它允许开发者在 Android 设备上构建和运行 Web 应用程序。AndServer 是由严振杰开发的一个轻量级 Android Web 服务器库,它类似于 Apache 或 Tomcat,但是专门为 Android 设计,无需额外的第三方库或硬件编译。它体积小、使用简单,支持动态网站、静态网站以及 HTTP API。

ZLGSPACE的博客 3123

android调用springmvc写的restful

下载srpingmvc的相关jar http://www.cnblogs.com/liuhongfeng/p/4919963.html 配置spingmvc和相关接口 http://blog.youkuaiyun.com/jianyuerensheng/article/details/51258942 如果报错,检查JDK版本是否和本地的一致 在UserController.jave

xiexuan2007的专栏 2281
上一篇: 设计一个百万级的消息推送系统
下一篇: 微服务网关Zuul迁移到Spring Cloud Gateway
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值