1. 程式人生 > >在Web伺服器搭建自己的Jetty伺服器,並開啟埠進行訪問

在Web伺服器搭建自己的Jetty伺服器,並開啟埠進行訪問

在專案中,往往要手動設定一個Jetty伺服器進行各種引數處理,比如之前在遊戲公司,用的就是遊戲服內部搭建Jetty伺服器,然後方便外部訪問.


主要用到這幾塊.

本身就是Web應用了,還用Jetty幹嘛,當然,我這只是做個示例,以後做app或者平臺級應用都可以用Jetty搭建外部訪問Servlet.

首先,我們設定WebServer,並且設定在監聽器裡,使得WEB伺服器啟動的時候可以載入Jetty伺服器,


這裡是WebServer程式碼:

package com.dc.web;

/**
 * Date: 2014-2-17
 *
 * Copyright (C) 2013-2015 7Road. All rights reserved.
 */


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.Servlet;

import org.dom4j.DocumentException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.road.pitaya.web.WebHandleAnnotation;
import com.road.util.ClassUtil;

/**
 * 
 * @author Tower
 */
public class WebServer
{
    private static final Logger LOGGER = LoggerFactory
            .getLogger(WebServer.class);

    /**
     * jetty自帶的server
     */
    private Server server;

    /**
     * 觸發的處理器
     */
    private ServletContextHandler context;

    /**
     * 處理器列表
     */
    private HandlerList handlerList = new HandlerList();

    /**
     * 觸發的資源處理器
     */
    private ResourceHandler resourceHandler;
    
    /**
     * 單例載入器
     */
    private static class LazyHolder
    {
        private static final WebServer INSTANCE = new WebServer();
    }

    /**
     * 獲取例項
     * 
     * @return
     */
    public static WebServer getInstance()
    {
        return LazyHolder.INSTANCE;
    }
    
    public boolean start()
    {
        LOGGER.info("WebServer is starting...");
        server = new Server(7039);

        try
        {
            context = new ServletContextHandler(ServletContextHandler.SESSIONS);
            context.setContextPath("/");
            context.setResourceBase("");

            resourceHandler = new ResourceHandler();
            resourceHandler.setResourceBase("/webResource/");

            handlerList.addHandler(context);
            handlerList.addHandler(resourceHandler);

            server.setHandler(handlerList);

            loadServletByWebServerConfig();

            server.start();
        }
        catch (DocumentException e)
        {
            LOGGER.error("load Xml Failed");
            e.printStackTrace();
            return false;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
        LOGGER.info("WebServer has started successfully");
        return true;
    }
    
    /**
     * 載入Servlet的不同介面
     * 
     * @return
     */
    public Map<String, Class<?>> resetMapHandle()
    {
        Map<String, Class<?>> HandleMap = new HashMap<String, Class<?>>();

        // 從相應的包載入Servlet的不同介面
        List<Class<?>> activityClass = ClassUtil
                .getClasses("com.dc.servlet");

        for (Class<?> class1 : activityClass)
        {
            WebHandleAnnotation annotation = class1
                    .getAnnotation(WebHandleAnnotation.class);
            if (annotation != null)
            {
                HandleMap.put(annotation.cmdName(), class1);
            }
        }

        return HandleMap;
    }

    /**
     * 使用WebServerConfig載入Servlet類
     * 
     * @return
     * @throws DocumentException
     */
    private boolean loadServletByWebServerConfig()
    {

        Map<String, Class<?>> HandleMap = resetMapHandle();
        for (Map.Entry<String, Class<?>> one : HandleMap.entrySet())
        {
            try
            {
                String path = one.getKey();
                Servlet servlet = (Servlet) one.getValue().newInstance();
                context.addServlet(new ServletHolder(servlet), path);
            }
            catch (InstantiationException e)
            {
                e.printStackTrace();
                continue;
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
                continue;
            }
        }
        return true;

    }
    
    public boolean close()
    {
        LOGGER.info("WebServer is closing...");
        try
        {
            server.stop();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        LOGGER.info("WebServer has closed successfully");
        return true;
    }

}
設定引數,啟動,初始化,這些內容.
package com.dc.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;
import com.road.entity.info.UserInfo;
import com.road.pitaya.component.LanguageComponent;
import com.road.pitaya.database.DataOption;

/**
 * 中控介面繼承用
 * 
 * @author Tower
 */
public abstract class AbstractServlet extends HttpServlet
{
	private static final long serialVersionUID = 2421477169746085074L;
	@SuppressWarnings("unused")
	private Logger LOGGER = LoggerFactory.getLogger(AbstractServlet.class);
    /**
     * 用於處理實體類的Gson例項
     */
    protected final Gson gson = new Gson();
    /** 請求客戶端的IP */
    protected String requestIP = null;
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
    	String result = null;
    	try
        {
    		requestIP = com.dc.util.ServletUtil.getRequestIP(request);
    		result = execute(request, response);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    	response.setCharacterEncoding("UTF-8");

        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);

        PrintWriter out = response.getWriter();
        out.print(result);
        out.flush();
        out.close();
    }

    public abstract String execute(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException;
    
    /**
	 * 建立一個新的賬號
	 * @return
	 */
	protected UserInfo newUserInfo(String site, String iuid, String pssd, Date createTime)
	{
		UserInfo userInfo = new UserInfo();
		userInfo.setOp(DataOption.INSERT);
		userInfo.setSite(site);//所屬平臺
		userInfo.setIuid(iuid);//賬號
		userInfo.setPssd(pssd);//密碼
		userInfo.setCreateTime(createTime);//建立時間
		userInfo.setServerId(0);// 賬號所在服編號(這裡暫不分服)
		return userInfo;
	}
	
	protected String formatTime(long millis)
	{
		int m = (int)(millis/1000);
		int ss = m%60;
		int mm = m/60%60;
		int hh = m/3600%24;
		int dd = m/86400;
		String time = "";
		if(dd > 0)
			time = LanguageComponent.getResource("Login.ServerStatusdd", dd, hh, mm, ss);
		else if(hh > 0)
			time = LanguageComponent.getResource("Login.ServerStatushh", hh, mm, ss);
		else if(mm > 0)
			time = LanguageComponent.getResource("Login.ServerStatusmm", mm, ss);
		else if(ss > 0)
			time = LanguageComponent.getResource("Login.ServerStatusss", ss);
		return time;
	}

    
}


中控介面繼承用

然後就是我們測試的Servlet

package com.dc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.road.pitaya.web.WebHandleAnnotation;

/**
 * 測試介面
 * @author Tower
 *
 */
@WebHandleAnnotation(cmdName = "/doSomething", description = "測試介面.")
public class DoSomethingServlet extends AbstractServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = -7574673387670968292L;

	@Override
	public String execute(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println(111111111);
		return null;
	}

}

對於webResources可以看到有個配置檔案:

名字叫:crossdomain.xml

從名字可以看出來,這個是跨域策略,方便跨域訪問.

<?xml version="1.0"?>
<cross-domain-policy>
  <allow-access-from domain="*" />
</cross-domain-policy>

內容就這些,只是作為實現. 準備就做完了,我們啟動tomcat,


Jetty正常啟動.

我們之前設定的埠是7039

我們在doSomething設定一個斷點,然後我們訪問localhost:7039/doSomething 可以看到,斷點進去,

控制檯輸出,於是,我們一個簡單的Jetty伺服器就搭建完成了,以後可以根據這個Jetty伺服器進行其他各項操作.

相關推薦

Web伺服器搭建自己Jetty伺服器,開啟進行訪問

在專案中,往往要手動設定一個Jetty伺服器進行各種引數處理,比如之前在遊戲公司,用的就是遊戲服內部搭建Jetty伺服器,然後方便外部訪問. 主要用到這幾塊. 本身就是Web應用了,還用Jetty幹嘛,當然,我這只是做個示例,以後做app或者平臺級應用都可以用Jetty搭

使用阿里雲搭建自己伺服器部署IIS為自己的app提供服務

之前幫實驗室搭過一個阿里雲,最近看到阿里雲有學生優惠,就自己買了個伺服器,搭了個同樣的伺服器供自己折騰,主要做測試服。下面記錄下搭建過程中遇到的問題。 買伺服器什麼就不說了,去阿里雲註冊個帳號,然後像淘寶一樣購物就好了。 買完之後可以拿到自己伺服器的公網IP

利用GitHub來搭建自己伺服器

1、建立一個GitHub賬號 2、把你的專案提交至GitHub 3、在網頁上的GitHub開啟你的專案  4 、 點選master 然後在輸入框裡面建立一個gh-page 5、點開設定按鈕,然後往下滑動,你將看到一個GitHub pages的地方 點選none,由no

伺服器搭建自己的Git伺服器

系統:Windows ,JDK1.7,gitblit1.8.0(類似軟體gitlab這個好像功能更多,svn) 第一步:Java JDK安裝與配置。(具體參考這裡的jdk安裝配置https://www.cnblogs.com/ucos/p/3924720.html) 第二步:下載Gitbli

如何搭建自己CDN伺服器

6、檔名:檔名相對網站根目錄,以/開頭,如要刪除網站根目錄下的mydir/file檔案, 用/mydir/file便可(我們建議將檔名用urlencode進行編碼)。如果是“檔案+記憶體”模式,文件名為/lum_high_cache

阿里雲伺服器搭建自己的個人網站之撥開迷霧

阿里雲最近推出了一個學生計劃,每個學生可以買一個9.9元(月供)的雲伺服器,看了覺得很實惠,就自己倒弄倒弄玩玩。 該教程分兩條主線: 第一條,利用hexo搭建自己的靜態部落格 第

教你如何在Mac上搭建自己伺服器——Nginx

WHAT 本篇主要是基於Nginx在Mac上搭建自己的伺服器。 我相信很多朋友肯定是第一次聽到Nginx,關於它具有怎樣的傳奇,這兒肯定說不完也說不透. 有興趣的朋友可以自行google或者baidu. WHY 為什麼要搭建自己的伺服器呢。 好處肯定多多,這兒說

【新手建站三部曲之一】——一塊錢搭建自己伺服器(LAMP)

本地:Windows7 雲主機:CentOS6.7 參考百度第一條教程 購買騰訊雲主機 最便宜的雲主機一年也要近千元,所以這裡的一元錢雲主機是有前提的,前提是什麼呢?前提就是你還是個寶寶,劃掉,還是個學生。。。 活動地址:http

在Mac上搭建自己伺服器——Nginx

WHAT 本篇主要是基於Nginx在Mac上搭建自己的伺服器。 我相信很多朋友肯定是第一次聽到Nginx,關於它具有怎樣的傳奇,這兒肯定說不完也說不透. 有興趣的朋友可以自行google或者baidu. WHY 為什麼要搭建自己的伺服器呢。 好處肯定多多,這兒說一條—

GPRS/GPS模組組學習——伺服器搭建之雲伺服器 ECS

在學習GPRS中,我們需要連線上一個公網IP,如果你的網路不是公網就需要進行一定的技術進行對映。如花生殼之類的。 下面我們對不是公網的情況,進行租借伺服器,進行配置等操作進行學習。 簡單瞭解一下公網IP:所謂的公網相當於一個詳細的地址,不會更變。公網的計算機和Internet上的其他計算機可

Android 從網頁中跳轉到APP,從微信開啟自己的app開啟指定頁面

先說實現步驟再說原理: 使用步驟 一,首先要給你要開啟的應用中的activity設定過濾器(在清單檔案裡設定)以JumpActivity為例如下面的: <intent-filter>  中就是所需過濾器 <activity android:name=".

阿里雲伺服器搭建FTP圖片伺服器[圖文詳解]

FastDFS是用c語言編寫的一款開源的分散式檔案系統。FastDFS為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用FastDFS很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。 Tracker

使用webpack構建本地伺服器,實現自動重新整理,直接在手機上訪問

前提 使用webpack構建前端開發環境,可以直接使用webpack構建本地服務,實現頁面儲存自動重新整理。 模組安裝 首先安裝webpack-dev-server模組 npm inst

ubuntu 14.04 server 依賴教育映象伺服器搭建本地映象伺服器

     準備一臺ubuntu14.04 server ip:192.168.x.x 1: $ sudo apt-get update 2: $ sudo apt-get install apt-mirror apache2 3: $ sudo cp /etc/apt/mi

騰訊雲Linux伺服器搭建(四) Git伺服器搭建(通過https驗證)

先安裝git: 下載 #wget https://github.com/git/git/archive/v2.9.2.tar.gz 解壓 # tar zxvf v2.9.2.tar.gz # cd git-2.9.2 編譯安裝 # make configure # ./co

IDEA 伺服器搭建 IDEA授權伺服器

本文對原作者文章進行更詳細講解 1.下載軟體:磁力連結: magnet:?xt=urn:btih:2289E4F8CEB346AC44E54C8C0DA706CC537301AA 複製磁力連結地址 magnet:?xt=urn:btih:

阿裏雲 CentOS7安裝redis4.0.9開啟遠程訪問

文件 serve 前端 prefix onf round 內部 style edi 1 安裝redis編譯的c環境 yum install gcc-c++ redis是c語言開發的,安裝redis需要先將官網下載的源碼進行編譯,編譯依賴gcc環境。 如果沒有g

Ubuntu 開啟 root 使用者開啟 ssh 遠端訪問許可權

本文主要記錄了Ubuntu下開啟 root 使用者以及 ssh 遠端訪問許可權的方法 適用於: Trusty Tahr (Ubuntu 14.04) Xenial Xerus (Ubuntu 16.04) 其他Ubuntu發行版配置方法基本相

CentOS 7 上安裝 Redis3.2.3 開啟外網訪問(親測好用,轉)

前一段時間寫過一篇codis叢集的文章,寫那篇文章主要是因為當時的專案不支援Redis自身叢集的功能。 而現在最新的專案是需要redis叢集的,這篇文章我們就來介紹下有關redis的安裝與配置。 一、redis原始碼安裝 截至到2016.8.11,redis最新穩定版本為3.2.3.本篇文章我們就以此

WEB】vue搭建自己的部落格網站部署到伺服器

技術框架和基本庫: 1.前端:vue-cli腳手架,vue-router管理路由,axios前後端互動。 2.伺服器端:使用node語言開發,express作為開發框架,提供api藉口給前端ajax呼叫。路由和render交給vue解決。同時以RESTful