服务器端的tomcat,servlet框架
tomcat是一个服务器程序
可以对webapp目录下的Servlet代码进行执行和操作
编写的Servlet代码的步骤一般是在本地的ide中编写和测试,然后打包工程为war格式的文件,部署在服务器tomcat路径的webapp目录下面,
重启服务器上的tomcat服务之后,会自动解析war包,监听响应端口的http请求,并执行响应的Servlet代码。
Servlet代码的编写方式:
编写一个继承HTTPServlet 的子类
override 其中的doGet和doPost方法
在相应的web配置文件中配置该Servlet的url接口
我们工程中用于数据同步的Servlet类如下:
package Servlet;
import Db.*;
import Json.*;
import Json.dbJson.*;
import Jwt.JavaWebToken;
import Output.Output;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.lang.reflect.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date; @WebServlet(name = "Servlet.Sync")
public class Sync extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String modelnum = request.getParameter("modelnum");
String token = request.getParameter("token");
String content = request.getParameter("content");
JavaWebToken.verifyToken(token, username, modelnum);
DatabaseAdapter adapter = new DatabaseAdapter();
Json.Sync syncback = new Json.Sync();
Gson gson = new Gson();
//java.lang.reflect.Type classType = new TypeToken<Json.Sync>() {}.getType();
//Json.Sync sync = gson.fromJson(content, classType);
Json.Sync sync = gson.fromJson(content, Json.Sync.class);
try{
for(Field field : sync.getClass().getDeclaredFields()){
field.setAccessible(true);
Object obj = field.get(sync);
Type t = field.getGenericType();
if(t instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType) t;
Class clz = (Class) pt.getActualTypeArguments()[0];//List里面的示例的类型
Class clazz = obj.getClass();//List这个类型
Field anchorField = clz.getField("anchor");
Field statusField = clz.getField("status");
Field idField = clz.getField("id");
Method sizeMethod = clazz.getDeclaredMethod("size");
Method getMethod = clazz.getDeclaredMethod("get", int.class);
getMethod.setAccessible(true);
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.setAccessible(true);
int size = (Integer) sizeMethod.invoke(obj);
for(int i = 0; i < size; i++){
Object pattern = getMethod.invoke(obj, i);
if(0 == statusField.getInt(pattern)){
//新增的
anchorField.set(pattern, (new Date()).getTime());
Insert.insert(adapter, pattern, username, false);
statusField.set(pattern, 9);
addMethod.invoke(field.get(syncback), pattern);
}
else {
//不是新增的
Object patternInServer = Search.search(adapter, clz, username, idField.getInt(pattern), false);
if(patternInServer == null){
//没找到,在垃圾箱中找找
patternInServer = Search.search(adapter, clz, username, idField.getInt(pattern), true);
}
if(patternInServer == null){
//在服务器数据库和垃圾箱中都没找到,一定是客户端的代码写错了
anchorField.set(pattern, (new Date()).getTime());
statusField.set(pattern, -1);
addMethod.invoke(field.get(syncback), pattern);
continue;
}
if(anchorField.get(pattern).equals(anchorField.get(patternInServer))) {
//两个数据之前已经同步好了, 直接利用status进行更新不会发生冲突
if(statusField.getInt(pattern) == -1){
anchorField.set(pattern, (new Date()).getTime());
anchorField.set(patternInServer, anchorField.get(pattern));
Delete.delete(adapter, clz, username, idField.getInt(pattern), false);
Insert.insert(adapter, patternInServer, username, true);
statusField.set(pattern, -1);
addMethod.invoke(field.get(syncback), pattern);
}
else if(statusField.getInt(pattern) == 1) {
anchorField.set(pattern, (new Date()).getTime());
anchorField.set(patternInServer, anchorField.get(pattern));
Update.update(adapter, pattern, username, false);
statusField.set(pattern, 9);
addMethod.invoke(field.get(syncback), pattern);
}
else{
//不可能有这种情况,一定是客户端代码写错了
anchorField.set(pattern, (new Date()).getTime());
statusField.set(pattern, -1);
addMethod.invoke(field.get(syncback), pattern);
}
}
else {
//表示之前本地就没有更新到最新的版本,下面的操作可能存在冲突,目前考虑冲突全部以服务器端优先
if(statusField.getInt(patternInServer) == -1){
//是在垃圾桶中找到这个记录的,证明之前在其他的客户端中对这一项进行了删除,这里对服务器进行更新,同时删除本地
anchorField.set(pattern, (new Date()).getTime());
anchorField.set(patternInServer, anchorField.get(pattern));
Update.update(adapter, pattern, username, true);
statusField.set(pattern, -1);
addMethod.invoke(field.get(syncback), pattern);//status -1 发回本地,然本地删除
}
else {
//仍然在服务器端的数据库中,可能出现的冲突时文本的修改,这里以服务器为主
anchorField.set(pattern, (new Date()).getTime());
anchorField.set(patternInServer, anchorField.get(pattern));
statusField.set(patternInServer, 9);
addMethod.invoke(field.get(syncback), patternInServer);
}
}
}
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
Output.output(gson.toJson(syncback), response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String modelnum = request.getParameter("modelnum");
String token = request.getParameter("token");
Long maxanchor = Long.parseLong(request.getParameter("maxanchor"));
JavaWebToken.verifyToken(token, username, modelnum);
Json.Sync syncback = new Json.Sync();
DatabaseAdapter adapter = new DatabaseAdapter();
syncback.DiaryList = Search.searchForGet(adapter, Diary.class, maxanchor);
syncback.DiarybookList = Search.searchForGet(adapter, Diarybook.class, maxanchor);
syncback.DiaryLabelList = Search.searchForGet(adapter, DiaryLabel.class, maxanchor);
syncback.LabelList = Search.searchForGet(adapter, Label.class, maxanchor);
syncback.SentenceList = Search.searchForGet(adapter, Sentence.class, maxanchor);
syncback.SentencebookList = Search.searchForGet(adapter, Sentencebook.class, maxanchor);
syncback.SentenceLabelList = Search.searchForGet(adapter, SentenceLabel.class, maxanchor);
Gson gson = new Gson();
Output.output(gson.toJson(syncback), response);
adapter.Destroy();
} }
它的web配置为:
<servlet>
<servlet-name>Sync</servlet-name>
<servlet-class>Servlet.Sync</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>Sync</servlet-name>
<url-pattern>/Servlet.Sync</url-pattern>
</servlet-mapping>
这表明这个功能的url接口为http://。。。。。/Servlet.Sync
服务器端的tomcat,servlet框架的更多相关文章
- Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置
1.Tomcat是什么 Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty. ...
- 深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)
概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层 ...
- Web开发之Tomcat&Servlet
<!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...
- tomcat&servlet初记
tomcat&servlet初记 1. web相关概念 2. web服务器软件的学习:tomcat 3. servlet入门学习 web相关概念 1,软件架构 1,cs架构:客户端/服务器端 ...
- What is the difference Apache (Http Server) and Tomcat (Servlet Container)
The Apache Project The Apache Project is a collaborative software development effort. Its goal is to ...
- TOMCAT ---> servlet概念
1 TOMCAT ---> servlet概念 2 TOMCAT 目录结构 (各个文件夹都存放什么东西) 3 TOMCAT 程序的层级 web | |---- js,jsp,html,css ( ...
- JAVA 之 Tomcat知识框架【转】
一.Tomcat服务器(很熟悉) 1.Web开发概述 javaSE: javaEE:13种 javaME: JavaEE规范: 13种技术的总称.Servlet/Jsp JDBC JNDI JTA.. ...
- Tomcat&Servlet
Tomcat&Servlet 一.web开发相关的概念 1. 软件架构 1.1 C/S架构 C:Client客户端, S:Server服务器 比如:QQ.微信.大型网游 优点: 显示效果炫 安 ...
- Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例
前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...
- JavaWeb基础(day15)( http + tomcat + servlet + 响应)
HTTP+Tomcat+Servlet+响应 HTTP HTTP 超文本传输协议(Hyper Text Transfer Protocol ),一种网络协议. 协议的组成和过程 HTTP协议由 ...
随机推荐
- 蓝桥杯-Anagrams问题
算法训练 Anagrams问题 时间限制:1.0s 内存限制:512.0MB 问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写 ...
- 一款开源免费的办公套件系统:DzzOffice详细部署
一.系统环境 个人建议centos 7 系统 cat /etc/redhat-release CentOS Linux release (Core) 基本更新 yum update -y 基本优化 关 ...
- pull强制覆盖本地
今天我总结的是在项目中经常用到的Git命令,上传和下拉文件. 当然在进行上传和下拉操作之前,你首先要做的就是将本地和Git库连接起来. 连接命令: git remote add origin + 你G ...
- Linux 服务器开发常用命令操作
1)查看网络端口 netstat -na --ip 2)查看特定应用程序进程 ps -ef | grep vsftp or ps aux | grep xxx.exe 3)查看系统日志 vi /et ...
- 【文档】四、Mysql Binlog事件含义详解
下面对binlog中事件做个简单说明: UNKNOWN_EVENT 这个事件类型应该永远不会出现.它从不会写入binlog中.如果binlog中的事件没法被识别成其他已知事件,他被当做UNKNOWN_ ...
- redis之 集群配置(主从复制)
集群的作用: 集群的方式有二种: 第二种的好处是:master宕机以后可以直接切换到slave1 主从通信的过程 先通过dump导出大块的rdb 然后把aof缓冲过来,然后通过replicationf ...
- Integer 与 int -- 自动装箱(autoboxing)与自动拆箱(unboxing)
转载于 http://www.ticmy.com/?p=110 jdk1.5引入了自动装箱(autoboxing)与自动拆箱(unboxing),这方便了集合类以及一些方法的调用,同时也使初学者对其感 ...
- javascript的ajax功能的概念和示例
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML). 个人理解:ajax就是无刷新提交,然后得到返回内容. 对应的不使用ajax时的传统网 ...
- C#中使用Log4Net记录日志
https://www.cnblogs.com/W--Jing/p/8125652.html 实例参考 https://www.cnblogs.com/soundcode/p/4866078.html ...
- “PPT中如何插入和提取swf文件”的解决方案
解决方案: 如何在PPT中插入swf文件: 1.依次单击Office按钮,Powerpoint选项,勾选“在功能区显示‘开发工具’选项卡”后,确定: 2.单击“开发工具”选项卡中的“其他控件”按钮,然 ...