`
wandejun1012
  • 浏览: 2751203 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JETTY嵌入式Web容器的开发(一)---基础开发

    博客分类:
  • java
 
阅读更多

 

qiuJETTY嵌入式Web容器的开发(一)---基础开发

JETTY嵌入式Web容器体积小,启动速度快,性能好,免费开源,是一款很适合开发调试和简单演示的轻量级Web容器.

而且它的嵌入式的特点,使得开发者可以直接将容器的操作包含在程序逻辑里,得以摆脱TOMCAT,JBOSS等独立容器带来的安装,维护,部署等一系列令人头疼的问题.

JETTY嵌入式开发步骤
  • 下载

本文采用的是2012年最新版本的JETTY8 (8.1.4版)

jetty-hightide-8.1.4.v20120524.zip

  • ECLIPSE建立一个普通JAVA项目testjetty

注意:

是JAVA  APPLICATION项目,不是WAR项目.

JDK要1.6

在项目里建立jetty目录

目录下再建立etc目录

将jetty-hightide-8.1.4.v20120524.zip包中etc目录下的jetty.xml和webdefault.xml文件拷贝入新建的 /jetty/etc目录下

将jetty-hightide-8.1.4.v20120524.zip文件中lib/目录下的所有jar文件和lib/jsp子目录下的所有jar文件都加入项目的buildPath

(很多讨论JETTY开发的文章总是在最小JAR包数上做文章,我觉得初学者还是应该将所有JAR包都加入,因为作为一款Web 容器,JETTY的JAR容纳了大量的细节功能. 有的JAR包你没有加入,也许测HELLOWORLD这类功能能够通过,但在真正的商用页面里,就会针对各种HTTP元素出问题)

在项目里建webRoot目录

webRoot目录下建立WEB-INF目录,以后web.xml就放在这里

建成的项目的结构如下:

JETTY嵌入式Web容器的开发(一)---基础开发

  • 修改/jetty/etc/jetty.xml

我做了下面两处修改(粗体),以利于测试

"1.0"?>

 

"Server" class="org.eclipse.jetty.server.Server">

"ThreadPool">

 

"org.eclipse.jetty.util.thread.QueuedThreadPool">

"minThreads">30

"maxThreads">200

"detailedDump">false

 

 

"addConnector">

 

"org.eclipse.jetty.server.nio.SelectChannelConnector">

"host">"jetty.host" />

"port">"jetty.port" default="8088"/>

"maxIdleTime">300000

"Acceptors">2

"statsOn">false

"confidentialPort">8443

"lowResourcesConnections">20000

"lowResourcesMaxIdleTime">5000

 

 

 

  • JETTY  Service

package org.jetty.demo;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

import org.eclipse.jetty.server.Server;

import org.eclipse.jetty.server.handler.ContextHandlerCollection;

import org.eclipse.jetty.webapp.WebAppContext;

import org.eclipse.jetty.xml.XmlConfiguration;

import org.xml.sax.SAXException;

public class JettyCustomServer extends Server {

private String xmlConfigPath;

private String contextPath;

private String warPath;

private String resourceBase = "./webRoot";

private String webXmlPath = "./webRoot/WEB-INF/web.xml";

public JettyCustomServer(String xmlConfigPath,String contextPath,String resourceBase,String webXmlPath) {

this(xmlConfigPath,contextPath,resourceBase,webXmlPath,null);

}

public JettyCustomServer(String xmlConfigPath,String contextPath) {

this(xmlConfigPath,contextPath,null,null,null);

}

public JettyCustomServer(String xmlConfigPath,String contextPath,String warPath) {

this(xmlConfigPath,contextPath,null,null,warPath);

}

public JettyCustomServer(String xmlConfigPath,String contextPath,String resourceBase,String webXmlPath,String warPath) {

super();

if(StringUtils.isNotBlank(xmlConfigPath)){

this.xmlConfigPath = xmlConfigPath;

readXmlConfig();

}

if(StringUtils.isNotBlank(warPath)){

this.warPath = warPath;

if(StringUtils.isNotBlank(contextPath)){

this.contextPath = contextPath;

applyHandle(true);

}

}else{

if(StringUtils.isNotBlank(resourceBase))

this.resourceBase = resourceBase;

if(StringUtils.isNotBlank(webXmlPath))

this.webXmlPath = webXmlPath;

if(StringUtils.isNotBlank(contextPath)){

this.contextPath = contextPath;

applyHandle(false);

}

}

}

private void readXmlConfig(){

try {

XmlConfiguration configuration =  new XmlConfiguration(new FileInputStream(this.xmlConfigPath));

configuration.configure(this);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

} catch (SAXException e1) {

e1.printStackTrace();

} catch (IOException e1) {

e1.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

public void applyHandle(Boolean warDeployFlag){

ContextHandlerCollection handler = new ContextHandlerCollection();

WebAppContext webapp = new WebAppContext();

webapp.setContextPath(contextPath);

webapp.setDefaultsDescriptor("./jetty/etc/webdefault.xml");

if(!warDeployFlag){

webapp.setResourceBase(resourceBase);

webapp.setDescriptor(webXmlPath); 

}else{

webapp.setWar(warPath);

}

handler.addHandler(webapp);

super.setHandler(handler);

}

public void startServer(){

try {

super.start();

System.out.println("current thread:"+super.getThreadPool().getThreads()+"| idle thread:"+super.getThreadPool().getIdleThreads());

super.join();

} catch (Exception e) {

e.printStackTrace();

}

}

public String getXmlConfigPath() {

return xmlConfigPath;

}

public void setXmlConfigPath(String xmlConfigPath) {

this.xmlConfigPath = xmlConfigPath;

}

public String getContextPath() {

return contextPath;

}

public void setContextPath(String contextPath) {

this.contextPath = contextPath;

}

public String getResourceBase() {

return resourceBase;

}

public void setResourceBase(String resourceBase) {

this.resourceBase = resourceBase;

}

public String getWebXmlPath() {

return webXmlPath;

}

public void setWebXmlPath(String webXmlPath) {

this.webXmlPath = webXmlPath;

}

public String getWarPath() {

return warPath;

}

public void setWarPath(String warPath) {

this.warPath = warPath;

}

}

  • 做一个简单的可执行的服务启动类

package org.jetty.demo;

public class JettyServerStart {

public static void main(String[] args) {

JettyCustomServer server = newJettyCustomServer("./jetty/etc/jetty.xml","/testContext");

server.startServer();

}

}

  • /webRoot/目录下做一个JSP测试页面

<%@ page language="java" contentType="text/html; charset=GBK"

pageEncoding="GBK"%>

 

 

 

"Content-Type" content="text/html; charset=GBK">

Insert title here

 

 

hello jetty! 中国!

 

 

  • 做一个测试Servlet

package org.jetty.demo;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class HelloWorldServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("doGet");

resp.getWriter().write("hello world!");

resp.getWriter().close();

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("doPost");

super.doPost(req, resp);

}

}

  • /webRoot/WEB-INF目录下建立一个web.xml

"1.0" encoding="UTF-8"?>

"http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

 

 

This is the description of my J2EE component

This is the display name of my J2EE component

HelloWorldServlet

org.jetty.demo.HelloWorldServlet

 

 

HelloWorldServlet

/servlet/HelloWorldServlet

 

 

index.jsp

 

 

JETTY嵌入式Web容器的开发(一)---基础开发

  • 启动服务

执行JettyServerStart

CONSOLE日志:

2012-06-27 15:49:35.250:INFO:oejs.Server:jetty-8.1.4.v20120524

2012-06-27 15:49:35.484:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/testContext,file:/D:/RND/javaathome/eclipsehelio/testjetty/webRoot/}

2012-06-27 15:49:35.484:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/testContext,file:/D:/RND/javaathome/eclipsehelio/testjetty/webRoot/}

2012-06-27 15:49:35.703:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8088

current thread:30| idle thread:26

看红字部分,记得我们在./jetty/etc/jetty.xml文件中做的修改么?

测试

测试访问JSP页面

http://localhost:8088/testContext/index.jsp

JETTY嵌入式Web容器的开发(一)---基础开发

测试访问SERVLET

http://localhost:8088/testContext/servlet/HelloWorldServlet

JETTY嵌入式Web容器的开发(一)---基础开发

 

refurl:http://my.oschina.net/u/989066/blog/157073

分享到:
评论

相关推荐

    信通商务网2025修正版

    中国电子商务平台,打造中国最具影响力的企业电子商务平台,商机信息,产品资料,企业名录,行业展览会,商务新闻。

    经典文学作品阅读体验.doc

    经典文学作品阅读体验

    python-30.判断 2 的幂-反正你没它快.py

    python-30.判断 2 的幂——反正你没它快.py

    基于随机森林实现特征选择降维及回归预测 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    元胞自动机模拟病毒传染(SEIR模型) 附Python代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    2004-2020年各省货运量数据

    2004-2020年各省货运量数据 1、时间:2004-2020年 2、来源:国家统计j、统计nj 3、指标:行政区划代码、地区、年份、货运量(万吨) 4、范围:31省

    ADC推理软件AI程序

    ADC推理软件AI程序

    【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    漫画作品与增强现实体验.doc

    漫画作品与增强现实体验

    漫画作品改编舞台剧经验.doc

    漫画作品改编舞台剧经验

    ,,ABC-DQ:基于MATLAB Simulink的三相静止坐标系到两相静止坐标系(Clark变)到两相旋转坐标系变(Park变)的仿真模型 仿真条件:MATLAB Simulink R2015b

    ,,ABC_DQ:基于MATLAB Simulink的三相静止坐标系到两相静止坐标系(Clark变)到两相旋转坐标系变(Park变)的仿真模型。 仿真条件:MATLAB Simulink R2015b ,MATLAB Simulink;三相静止坐标系;两相静止坐标系;Clark变换;Park变换;仿真模型;R2015b,MATLAB Simulink中的Clark-Park变换仿真模型研究

    武汉东湖高新集团智慧园区 22页PPT(21页).pptx

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

    自驾游中行程时间灵活调整.doc

    自驾游中行程时间灵活调整

    ,,基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线 程序

    ,,基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线 程序有基于matpower和非matpower(效果好一点) ,核心关键词:蒙特卡洛法; 概率潮流; IEEE33节点电网; 光伏风电概率出力模型; 随机抽样; 电压概率出力曲线; matpower; 非matpower方法。,基于蒙特卡洛法的电网概率潮流分析:IEEE33节点光伏风电模型构建与验证

    基于视觉检测的机械臂药品自动分类与搬运仿真系统实现与优化(含详细可运行代码及解释)

    内容概要:本文详细介绍了基于视觉检测的机械臂药品自动分类与搬运仿真的实现方法。首先通过搭建环境和加载相关模型,接着利用 OpenCV 对摄像头捕获的画面进行药瓶识别,再通过 PyBullet 实现机械臂路径规划及其动作控制,最后通过主循环不断地完成对药物的分类抓取操作。为增强系统性能和稳定性进行了多项改进:采用先进的YOLOv8模型实现更精准的物体检测、增加更细致的夹爪开合逻辑提高物品抓取的成功率,同时加入碰撞检测机制保障运动过程的安全性。该仿真是用Python编程语言开发,并涉及多领域的技术集成。 适用人群:适用于自动化设备研究开发的技术专家或从事机器人相关专业学习的研究人员。 使用场景及目标:可用于研究自动化药房、医院仓库管理等医疗物资自动处理流程的设计;帮助理解并实践如何构建一个完整的机器人视觉引导下的机械手作业体系,以及针对具体应用场景提出有效的改进建议和技术路线图。 其他说明:为了使系统更接近真实环境,开发者还可以继续探索更多先进的机器视觉算法,并深入探讨机械臂硬件层面的选择,以期打造出更加智能化的产品应用于各行各业。

    初识Python-公共课-pdf.zip

    初识Python-公共课-pdf.zip

    Anaconda 2023 State of Data Science Report.pdf

    anaconda

    ,,VSC-HVDC仿真模型 Kundur’s 4-machine 2-area power system.pscad柔性直流输电仿真模型,同步机VSGVSM模型,还有多端如张北直流电网以及基本mmc

    ,,VSC-HVDC仿真模型 Kundur’s 4-machine 2-area power system.pscad柔性直流输电仿真模型,同步机VSGVSM模型,还有多端如张北直流电网以及基本mmc逆变器,自己为biye网上收集的一些觉得有用的基础模型,找这个模型就搜了好久,可以传授找模型的一些地方,怕麻烦的可以拿模型,学习基础用还是可以的。 另外可代接电流型HVDCPSCAD的模型设计。 ,VSC-HVDC仿真模型; Kundur's 4-machine 2-area 模型; 柔性直流输电仿真模型; 虚拟同步机VSGVSM模型; 多端直流电网模型; MMC逆变器模型; 模型搜索资源; 模型交易或共享平台; 电流型HVDCPSCAD模型设计。,基于多端柔性直流输电的VSC-HVDC仿真模型研究:含Kundur四机两区电力系统与VSGVSM模型应用

    56页-智慧双碳园区建设方案.pdf

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

Global site tag (gtag.js) - Google Analytics