服务器端的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协议由 ...
随机推荐
- 思维题--code forces round# 551 div.2
思维题--code forces round# 551 div.2 题目 D. Serval and Rooted Tree time limit per test 2 seconds memory ...
- 开发者必备的12个JavaScript库
现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计.为了方便大家发挥自己的创意,就产生了很多 JS 框架,Node. ...
- Types的Type访问模式
在Types类中定义的访问都类如下: 1.MapVisitor类 2.SimpleVisitor 3.UnaryVisitor 4.TypeRelation
- mysql 递归查询 主要是对于层级关系的查询
最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在 ...
- GB2312编码(为什么要加2020H、8080H,外码→内码→交换码→字形码)
为什么要加上2020H和8080H? 区位码.内码.国标码怎么转换非常简单,但是令人迷惑的是为什么要那么转换?这种转换不可能平白无故地那样转换! 我搜索很多资料,找到最好的解释,总结如下: 首先,注意 ...
- 以安全模式启动firefox
碰到firefox打开后一直没有响应,解决方法: 以安全模式打开
- [转].Net Windows服务安装完成后自动启动
本文转自:http://www.cnblogs.com/hb_cattle/archive/2011/12/04/2275319.html 考虑到部署方便,我们一般都会将C#写的Windows服务制作 ...
- RabbitMQ---4、消息确认Ack
一:消费者确认 消费者确认或者说消费者应答指的是RabbitMQ需要确认消息到底有没有被收到 - 自动应答 boolean autoAck = true; channel.basicConsume(Q ...
- Docker学习(四): 操作容器
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- T4模板的一些配置(从EF数据更新)
<#@ template debug="false" hostspecific="false" language="C#" #> ...