设为首页 收藏本站
查看: 1244|回复: 0

[经验分享] 如何用Web服务器搭建自己的Jetty服务器

[复制链接]

尚未签到

发表于 2017-3-1 12:32:02 | 显示全部楼层 |阅读模式
  在项目中,往往要手动设置一个Jetty服务器进行各种参数处理,比如之前在游戏公司,用的就是游戏服内部搭建Jetty服务器,然后方便外部访问.
  主要用到这几块.
  本身就是Web应用了,还用Jetty干嘛,当然,我这只是做个示例,以后做app或者平台级应用都可以用Jetty搭建外部访问Servlet.
  首先,我们设置WebServer,并且设置在监听器里,使得WEB服务器启动的时候可以加载Jetty服务器,
  这里是WebServer代码:



[java] view plain copy
  

  • 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;  
  •     }

  • }
  设置参数,启动,初始化,这些内容.



[java] view plain copy
  

  • 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



[java] view plain copy
  

  • 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
  从名字可以看出来,这个是跨域策略,方便跨域访问.



[html] view plain copy
  

  • <?xml version="1.0"?>  
  • <cross-domain-policy>  
  •   <allow-access-from domain="*" />  
  • </cross-domain-policy>  
  
内容就这些,只是作为实现.
  准备就做完了,我们启动tomcat,
  Jetty正常启动.
  我们之前设置的端口是7039
  我们在doSomething设置一个断点,然后我们访问localhost:7039/doSomething 可以看到,断点进去,
  控制台输出,于是,我们一个简单的Jetty服务器就搭建完成了,以后可以根据这个Jetty服务器进行其他各项操作.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348832-1-1.html 上篇帖子: Maven下使用Jetty进行Debug 下篇帖子: 使用Jetty搭建Java Websocket Server,实现图像传输
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表