服务器端的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协议由 ...
随机推荐
- unity 优化之overdraw查看
scene视图里面能直接看,打开左上角那个下拉选项,选择overdraw就行 转载篇在game视图下查看overdraw: https://blog.csdn.net/complicate ...
- (转载)GRASP职责分配原则
GRASP (职责分配原则) 要学习设计模式,有些基础知识是我们必须要先知道的,设计模式是关于类和对象的一种高效.灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈 ...
- assert函数的用法
assert这个函数在php语言中是用来判断一个表达式是否成立.返回true or false; 例如: <?php $s = 123; assert("is_int($s)" ...
- PTA (Advanced Level) 1015 Reversible Primes
Reversible Primes A reversible prime in any number system is a prime whose "reverse" in th ...
- 创建.NET Core程序的Nuget Package
最近在看ASP.NET Core MVC的教材,几乎每章开始都要重复从Empty project开始创建一个ASP.NET Core的项目,然后手动修改project.json,增加经典三目录(Mod ...
- C# SocketUdpServer
public interface ISocketUdpServer { void Start(); void Stop(); int SendData(byte[] data, IPEndPoint ...
- python爬虫实战(九)--------拉勾网全站职位(CrawlSpider)
相关代码已经修改调试成功----2017-4-24 详情代码请移步我的github:https://github.com/pujinxiao/Lagou_spider 一.说明 1.目标网址:拉勾网 ...
- 【C#高级】泛型(一)
泛型,.net 2.0之后出现,基本只要代码中出现 ‘<>’ 尖括号就可以确定是泛型. 在2.0之前大多是使用Object来代替,因为所有类都是Object的派生类,根据继承的原理Obje ...
- 一个简单的json解析器
实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json; import java.util.LinkedList; import ja ...
- Java学习--list,set,Map接口使用
list接口: 泛型:规定list中的元素的类型 /* * * 泛型不能使用基本数据类型(可以使用基本类型的包装类) * */ public void tes ...