服务器端的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协议由 ...
随机推荐
- 关于window.onload和body onload冲突的解决办法
在学习用js在 页面中动态显示当前时间 和依次读取公告栏信息的 实验中 发现在将两个页面整合时 window.onload=function (){}和 <body onload="d ...
- ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析
最近 在学习Android3.0中推出的 Loader 机制,其中CursorLoader 这个加载器说是可以实时监测数据和更新数据,为了一探究竟,就连带的将 ContentProvider和Curs ...
- Mac下的SSH插件(默认自带)
Mac下默认自带,直接通过终端输入ssh获取更多的参数帮助.
- web服务器/应用服务器
1.概念 Web服务器的基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.与客户端的网络浏览器配合.因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTT ...
- JAR,WAR,EAR的使用与区别
WAR(Web Archive file)网络应用程序文件 是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文 ...
- GitHub和git和repo的使用
1. GitHub的使用 https://github.com/maogefff/GitHub-git-repo 2. git的使用 https://github.com/maogefff/GitHu ...
- iOS开源项目周报0302
由OpenDigg 出品的iOS开源项目周报第十期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.TodayMin ...
- IntelliJ使用指南—— 导入Eclipse的Web项目
通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目.而IntelliJ提供了多种项目类型的导入方式,其中就有eclipse. 在 ...
- WCF 创建WCF
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- Vs2015+opencv2.4.10出现msvcp120d.dll丢失 opencv2410.props
今天vs2015配置好opencv编译运行会报错msvcp120d.dll丢失,只要把这个文件复制到你在第一步设置的Path环境变量路径里,和opencv的dll放在一起就行了.(初次配置完环境变量后 ...