tomcat是一个服务器程序

可以对webapp目录下的Servlet代码进行执行和操作

编写的Servlet代码的步骤一般是在本地的ide中编写和测试,然后打包工程为war格式的文件,部署在服务器tomcat路径的webapp目录下面,

重启服务器上的tomcat服务之后,会自动解析war包,监听响应端口的http请求,并执行响应的Servlet代码。

Servlet代码的编写方式:

编写一个继承HTTPServlet 的子类

override 其中的doGet和doPost方法

在相应的web配置文件中配置该Servlet的url接口

我们工程中用于数据同步的Servlet类如下:

  1. package Servlet;
  2. import Db.*;
  3. import Json.*;
  4. import Json.dbJson.*;
  5. import Jwt.JavaWebToken;
  6. import Output.Output;
  7. import com.google.gson.Gson;
  8. import com.google.gson.GsonBuilder;
  9. import com.google.gson.reflect.TypeToken;
  10.  
  11. import javax.servlet.ServletException;
  12. import javax.servlet.annotation.WebServlet;
  13. import javax.servlet.http.HttpServlet;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.io.IOException;
  17.  
  18. import java.lang.reflect.*;
  19. import java.sql.ResultSet;
  20. import java.sql.SQLException;
  21. import java.util.Date;
  22.  
  23. @WebServlet(name = "Servlet.Sync")
  24. public class Sync extends HttpServlet {
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. String username = request.getParameter("username");
  27. String modelnum = request.getParameter("modelnum");
  28. String token = request.getParameter("token");
  29. String content = request.getParameter("content");
  30. JavaWebToken.verifyToken(token, username, modelnum);
  31. DatabaseAdapter adapter = new DatabaseAdapter();
  32. Json.Sync syncback = new Json.Sync();
  33. Gson gson = new Gson();
  34. //java.lang.reflect.Type classType = new TypeToken<Json.Sync>() {}.getType();
  35. //Json.Sync sync = gson.fromJson(content, classType);
  36. Json.Sync sync = gson.fromJson(content, Json.Sync.class);
  37. try{
  38. for(Field field : sync.getClass().getDeclaredFields()){
  39. field.setAccessible(true);
  40. Object obj = field.get(sync);
  41. Type t = field.getGenericType();
  42. if(t instanceof ParameterizedType){
  43. ParameterizedType pt = (ParameterizedType) t;
  44. Class clz = (Class) pt.getActualTypeArguments()[0];//List里面的示例的类型
  45. Class clazz = obj.getClass();//List这个类型
  46. Field anchorField = clz.getField("anchor");
  47. Field statusField = clz.getField("status");
  48. Field idField = clz.getField("id");
  49. Method sizeMethod = clazz.getDeclaredMethod("size");
  50. Method getMethod = clazz.getDeclaredMethod("get", int.class);
  51. getMethod.setAccessible(true);
  52. Method addMethod = clazz.getDeclaredMethod("add", Object.class);
  53. addMethod.setAccessible(true);
  54. int size = (Integer) sizeMethod.invoke(obj);
  55. for(int i = 0; i < size; i++){
  56. Object pattern = getMethod.invoke(obj, i);
  57. if(0 == statusField.getInt(pattern)){
  58. //新增的
  59. anchorField.set(pattern, (new Date()).getTime());
  60. Insert.insert(adapter, pattern, username, false);
  61. statusField.set(pattern, 9);
  62. addMethod.invoke(field.get(syncback), pattern);
  63. }
  64. else {
  65. //不是新增的
  66. Object patternInServer = Search.search(adapter, clz, username, idField.getInt(pattern), false);
  67. if(patternInServer == null){
  68. //没找到,在垃圾箱中找找
  69. patternInServer = Search.search(adapter, clz, username, idField.getInt(pattern), true);
  70. }
  71. if(patternInServer == null){
  72. //在服务器数据库和垃圾箱中都没找到,一定是客户端的代码写错了
  73. anchorField.set(pattern, (new Date()).getTime());
  74. statusField.set(pattern, -1);
  75. addMethod.invoke(field.get(syncback), pattern);
  76. continue;
  77. }
  78. if(anchorField.get(pattern).equals(anchorField.get(patternInServer))) {
  79. //两个数据之前已经同步好了, 直接利用status进行更新不会发生冲突
  80. if(statusField.getInt(pattern) == -1){
  81. anchorField.set(pattern, (new Date()).getTime());
  82. anchorField.set(patternInServer, anchorField.get(pattern));
  83. Delete.delete(adapter, clz, username, idField.getInt(pattern), false);
  84. Insert.insert(adapter, patternInServer, username, true);
  85. statusField.set(pattern, -1);
  86. addMethod.invoke(field.get(syncback), pattern);
  87. }
  88. else if(statusField.getInt(pattern) == 1) {
  89. anchorField.set(pattern, (new Date()).getTime());
  90. anchorField.set(patternInServer, anchorField.get(pattern));
  91. Update.update(adapter, pattern, username, false);
  92. statusField.set(pattern, 9);
  93. addMethod.invoke(field.get(syncback), pattern);
  94. }
  95. else{
  96. //不可能有这种情况,一定是客户端代码写错了
  97. anchorField.set(pattern, (new Date()).getTime());
  98. statusField.set(pattern, -1);
  99. addMethod.invoke(field.get(syncback), pattern);
  100. }
  101. }
  102. else {
  103. //表示之前本地就没有更新到最新的版本,下面的操作可能存在冲突,目前考虑冲突全部以服务器端优先
  104. if(statusField.getInt(patternInServer) == -1){
  105. //是在垃圾桶中找到这个记录的,证明之前在其他的客户端中对这一项进行了删除,这里对服务器进行更新,同时删除本地
  106. anchorField.set(pattern, (new Date()).getTime());
  107. anchorField.set(patternInServer, anchorField.get(pattern));
  108. Update.update(adapter, pattern, username, true);
  109. statusField.set(pattern, -1);
  110. addMethod.invoke(field.get(syncback), pattern);//status -1 发回本地,然本地删除
  111. }
  112. else {
  113. //仍然在服务器端的数据库中,可能出现的冲突时文本的修改,这里以服务器为主
  114. anchorField.set(pattern, (new Date()).getTime());
  115. anchorField.set(patternInServer, anchorField.get(pattern));
  116. statusField.set(patternInServer, 9);
  117. addMethod.invoke(field.get(syncback), patternInServer);
  118. }
  119. }
  120. }
  121. }
  122. }
  123. }
  124. } catch (IllegalAccessException e) {
  125. e.printStackTrace();
  126. } catch (NoSuchMethodException e) {
  127. e.printStackTrace();
  128. } catch (InvocationTargetException e) {
  129. e.printStackTrace();
  130. } catch (NoSuchFieldException e) {
  131. e.printStackTrace();
  132. }
  133. Output.output(gson.toJson(syncback), response);
  134. }
  135.  
  136. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  137. String username = request.getParameter("username");
  138. String modelnum = request.getParameter("modelnum");
  139. String token = request.getParameter("token");
  140. Long maxanchor = Long.parseLong(request.getParameter("maxanchor"));
  141. JavaWebToken.verifyToken(token, username, modelnum);
  142. Json.Sync syncback = new Json.Sync();
  143. DatabaseAdapter adapter = new DatabaseAdapter();
  144. syncback.DiaryList = Search.searchForGet(adapter, Diary.class, maxanchor);
  145. syncback.DiarybookList = Search.searchForGet(adapter, Diarybook.class, maxanchor);
  146. syncback.DiaryLabelList = Search.searchForGet(adapter, DiaryLabel.class, maxanchor);
  147. syncback.LabelList = Search.searchForGet(adapter, Label.class, maxanchor);
  148. syncback.SentenceList = Search.searchForGet(adapter, Sentence.class, maxanchor);
  149. syncback.SentencebookList = Search.searchForGet(adapter, Sentencebook.class, maxanchor);
  150. syncback.SentenceLabelList = Search.searchForGet(adapter, SentenceLabel.class, maxanchor);
  151. Gson gson = new Gson();
  152. Output.output(gson.toJson(syncback), response);
  153. adapter.Destroy();
  154. }
  155.  
  156. }

它的web配置为:

  1. <servlet>
  2. <servlet-name>Sync</servlet-name>
  3. <servlet-class>Servlet.Sync</servlet-class>
  4. </servlet>
  5.  
  6. <servlet-mapping>
  7. <servlet-name>Sync</servlet-name>
  8. <url-pattern>/Servlet.Sync</url-pattern>
  9. </servlet-mapping>

这表明这个功能的url接口为http://。。。。。/Servlet.Sync

服务器端的tomcat,servlet框架的更多相关文章

  1. Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置

    1.Tomcat是什么       Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty. ...

  2. 深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)

    概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层 ...

  3. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  4. tomcat&servlet初记

    tomcat&servlet初记 1. web相关概念 2. web服务器软件的学习:tomcat 3. servlet入门学习 web相关概念 1,软件架构 1,cs架构:客户端/服务器端 ...

  5. 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 ...

  6. TOMCAT ---> servlet概念

    1 TOMCAT ---> servlet概念 2 TOMCAT 目录结构 (各个文件夹都存放什么东西) 3 TOMCAT 程序的层级 web | |---- js,jsp,html,css ( ...

  7. JAVA 之 Tomcat知识框架【转】

    一.Tomcat服务器(很熟悉) 1.Web开发概述 javaSE: javaEE:13种 javaME: JavaEE规范: 13种技术的总称.Servlet/Jsp JDBC JNDI JTA.. ...

  8. Tomcat&Servlet

    Tomcat&Servlet 一.web开发相关的概念 1. 软件架构 1.1 C/S架构 C:Client客户端, S:Server服务器 比如:QQ.微信.大型网游 优点: 显示效果炫 安 ...

  9. Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例

    前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...

  10. JavaWeb基础(day15)( http + tomcat + servlet + 响应)

    HTTP+Tomcat+Servlet+响应 HTTP HTTP  超文本传输协议(Hyper Text  Transfer  Protocol  ),一种网络协议. 协议的组成和过程 HTTP协议由 ...

随机推荐

  1. 关于window.onload和body onload冲突的解决办法

    在学习用js在 页面中动态显示当前时间 和依次读取公告栏信息的 实验中 发现在将两个页面整合时 window.onload=function (){}和 <body onload="d ...

  2. ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析

    最近 在学习Android3.0中推出的 Loader 机制,其中CursorLoader 这个加载器说是可以实时监测数据和更新数据,为了一探究竟,就连带的将 ContentProvider和Curs ...

  3. Mac下的SSH插件(默认自带)

    Mac下默认自带,直接通过终端输入ssh获取更多的参数帮助.

  4. web服务器/应用服务器

    1.概念 Web服务器的基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.与客户端的网络浏览器配合.因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTT ...

  5. JAR,WAR,EAR的使用与区别

    WAR(Web Archive file)网络应用程序文件   是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文 ...

  6. GitHub和git和repo的使用

    1. GitHub的使用 https://github.com/maogefff/GitHub-git-repo 2. git的使用 https://github.com/maogefff/GitHu ...

  7. iOS开源项目周报0302

    由OpenDigg 出品的iOS开源项目周报第十期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.TodayMin ...

  8. IntelliJ使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目.而IntelliJ提供了多种项目类型的导入方式,其中就有eclipse. 在 ...

  9. WCF 创建WCF

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  10. Vs2015+opencv2.4.10出现msvcp120d.dll丢失 opencv2410.props

    今天vs2015配置好opencv编译运行会报错msvcp120d.dll丢失,只要把这个文件复制到你在第一步设置的Path环境变量路径里,和opencv的dll放在一起就行了.(初次配置完环境变量后 ...