JavaWeb应用开发使用jetty札记

应该做点变化了,决定使用Maven来管理工程,并且在Java Web开发中使用Jetty来作为测试容器。

1.JavaWeb工程配置jetty-maven-plugin插件

<plugin>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>9.2.6.v20141205</version>
				<configuration>
					<scanIntervalSeconds>10</scanIntervalSeconds>
				</configuration>
			</plugin>

jetty的Maven插件由org.mortbay.jetty转到了org.eclipse.jetty。在使用最新的jetty-mavevn-plugin需要JRE1.7+,因此在使用的时候需要格外注意执行Maven命令所依赖的JRE版本。

执行mvn -version,就可以看到具体执行Maven命令时的JRE版本。

Apache Maven 3.1.0 (893ca28a1da9d5f51ac03827af98bb730128f9f2; 2013-06-28 10:15:32+0800)
Maven home: D:\__dev\apache-maven-3.1.0
Java version: 1.6.0_30, vendor: Sun Microsystems Inc.
Java home: D:\__dev\Java\jdk1.6.0_30\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

在如上的环境下执行mvn jetty:run命令时就会发现如下错误:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.2.6.v20141205:run (default-cli) on project tiles: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.2.6.v20141205:run failed: Unable to load the mojo ‘run‘ in the plugin ‘org.eclipse.jetty:jetty-maven-plugin:9.2.6.v20141205‘ due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/eclipse/jetty/maven/plugin/JettyRunMojo : Unsupported major.minor version 51.0

这个问题的产生就是我们执行mvn -version命令后看到的Java version并不是1.7+,这里可以在不改变系统的JAVA_HOME设置做个临时性的变动。在命令窗执行:set JAVA_HOME=java_jdk_1.7_的目录。

具体操作如下图所示(本机没有现成的JDK7这里使用了JDK8):

重新设置完成之后,执行jetty:run命令:

从上图标注可以看到Jetty Server启动成功。

这一段内容主要说明在使用jetty-maven-plugin是注意的执行Maven命令的JRE环境。

另外较低版本的jetty-maven-plugin有:

<plugin> 
				<groupId>org.mortbay.jetty</groupId> 
				<artifactId>jetty-maven-plugin</artifactId> 
				<version>7.1.6.v20100715</version> 
				<configuration> 
					<scanIntervalSeconds>1</scanIntervalSeconds> 
					<reload>automatic</reload> 
					<webAppConfig> 
						<contextPath>/tiles</contextPath> 
					</webAppConfig> 
				</configuration> 
			</plugin>

相关文档:

[org.eclipse.jetty].[jetty-maven-plugin].[9.x]:http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html

[org.mortbay.jetty].[jetty-maven-plugin].[old_version]:http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin

建议使用最近发布的版本,关注jetty从http://eclipse.org/jetty/documentation开始。

2.基于Jetty可编程开发web应用

2.0. 添加依赖

<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.eclipse.jetty.aggregate</groupId>
			<artifactId>jetty-all</artifactId>
			<version>7.6.9.v20130131</version>
		</dependency>

如果在应用中使用到jsp的话需要添加jetty-jsp依赖,在jetty-all中并为聚合jetty-jsp模块。

2.1创建服务

package secondriver.embedded.jetty.app;

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

import secondriver.embedded.jetty.app.servlet.DispatchHandler;

public class ProgrammableServer {

	public static void main(String[] args) throws Exception {
		// 创建Server
		Server server = new Server();

		// 添加ThreadPool
		QueuedThreadPool queuedThreadPool = new QueuedThreadPool();
		queuedThreadPool.setName("queuedTreadPool");
		queuedThreadPool.setMinThreads(10);
		queuedThreadPool.setMaxThreads(200);

		server.setThreadPool(queuedThreadPool);

		// 添加Connector
		SelectChannelConnector connector = new SelectChannelConnector();
		connector.setPort(8888);
		connector.setAcceptors(4);
		connector.setMaxBuffers(2048);
		connector.setMaxIdleTime(10000);

		server.addConnector(connector);

		// 添加Handler
		ContextHandlerCollection context = new ContextHandlerCollection();
		ContextHandler contextHandler = context.addContext("/", "/");
		contextHandler.setHandler(new DispatchHandler());

		Handler defaults = new DefaultHandler();

		HandlerCollection collection = new HandlerCollection();
		collection.setHandlers(new Handler[] { context, defaults });

		server.setHandler(collection);

		// 启动服务
		server.start();
		while (server.isStarted()) {
			System.out.println("server starting...");
			break;
		}
		System.out.println("server stared...");
		System.out.println("ContextHandlerCollectio.getServer() = "
				+ context.getServer().hashCode());
		System.out.println("Server:" + server.hashCode());
		server.join();
	}
}

2.2.编写分发处理类DispatchHandler

package secondriver.embedded.jetty.app.servlet;

import java.io.IOException;

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

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class DispatchHandler extends AbstractHandler {

	public void handle(String target, Request baseRequest,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		/**
		 * 这里将是根据不同的请求来分发给不同的Handler来处理
		 */
		if (target.equals("/index")) {
			new IndexHandler().handle(target, baseRequest, request, response);
		} else {
			new HelloHandler().handle(target, baseRequest, request, response);
		}
	}
}

2.3.编写相应的Handler(IndexHandler和HelloHandler)

public class IndexHandler extends AbstractHandler {

	@Override
	public void handle(String target, Request baseRequest,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");

		PrintWriter out = response.getWriter();
		out.write("<h3>Hello World Jetty!</h3>");
		out.write(Calendar.getInstance().getTime().toString());
		out.flush();
		out.close();
	}
}
public class HelloHandler extends AbstractHandler {

	public void handle(String target, Request baseRequest,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.write("<h3>This is a HelloHandler and contextPath is ‘/hello‘.</h3>");
		out.flush();
		out.close();
	}
}

2.4.启动服务,通过浏览器访问:http://localhost:8888/index 和 http://localhost:8888/hello

从通过可以看到访问响应的结果更加请求不同而被分发给不同的Handler来处理了。很多时候可不不这么使用,而是将Jetty作为嵌入式容器集成在应用中。

3.jetty作为嵌入式容器集成在应用中

关于这方面的使用有一个开源项目做的很不错-Sparkjava。

Sparkjava:http://sparkjava.com/   Github: https://github.com/perwendel/spark

示例可参见:

http://git.oschina.net/secondriver/Spark-Java-App

https://git.oschina.net/secondriver/jetty-app

时间: 2024-12-28 21:52:24

JavaWeb应用开发使用jetty札记的相关文章

学习JavaWeb项目开发需要掌握的技术

武汉java培训学习JavaWeb项目开发需要掌握的技术,国内外信息化建设已经进入基于Web应用为核心的阶段, java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Java的WEB项目需要掌握的技术如下:Java语言面向对象分析设计思想设计模式和框架结构XML语言网页脚本语言数据库应用服务器集成开发环境下面我们具体地看每个技术.1.Java语言Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.

当用Myeclipse8.6集成开发环境,进行JavaWeb项目开发的时候,用集成开发环境中的run Server进行程序调试时,出现如下错误解决方案

当用Myeclipse8.6集成开发环境,进行JavaWeb项目开发的时候,用集成开发环境中的run Server进行程序调试时,出现如下错误解决方案: 'Starting Tomcat v6.0 Server at localhost'has encountered a problem 错误提示: Several ports(8080,8009)required by Tomcatv6.0 Server at localhost are already in use.The server ma

搭建JavaWeb应用开发环境

下载和安装Tomcat服务器 下载Tomcat安装程序包:http://tomcat.apache.org/,下载一个zip版本,解压到本地即完成了Tomcat的安装. 测试是否安装成功:进入Tomcat目录,双击 bin 目录下的 startup.bat 文件启动Tomcat服务器,在浏览器中输入http://localhost:8080/,有内容出来就表示成功了. Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件.

(转)一个JavaWeb项目开发总结

原文地址:http://www.cnblogs.com/lzb1096101803/p/4907775.html 一.学会如何读一个JavaWeb项目源代码 步骤:表结构->web.xml->mvc->db->spring ioc->log->代码 先了解项目数据库的表结构,这个方面是最容易忘记的,有时候我们只顾着看每一个方法是怎么进行的,却没有去了解数据库之间的主外键关联.其实如果先了解数据库表结构,再去看一个方法的实现会更加容易. 然后需要过一遍web.xml,知道

Javaweb项目开发的前后端解耦的必要性

JavaWeb项目为何我们要放弃jsp?为何要前后端解耦?为何要动静分离? 使用jsp的痛点: 1.jsp上动态资源和静态资源全部耦合在一起,服务器压力大,因为服务器会收到各种静态资源的http请求,动态代码的等等,除非你使用nginx. 万一你的java代码出现了bug,你的页面是显示不出来的,直接蹦到了5xx页面,用户体验极差. (现在javaWeb项目业界的标准是nginx+tomcat,动静分离,请求先到nginx,所有的静态资源请求全部交给nginx,动态资源全部给tomcat,此外n

JavaWeb 项目开发中的技术总结

前言: 在项目开发过程中的一点点指导思想 1.环境准备 win系统 Eclipse 开发平台 maven tomcat Mysql 数据库,mysql5.6 操作数据库的jar 包 JDBC 连接数据库的jar,mysql-connector-java-xxx.jar DbUtils 操作数据库jar包,基于 JDBC的封装 数据源jar,可以有c3p0.dbcp 日志文件,log4j 前台编写jquery需要的js 编写前台使用的公用样式 bootstrap 2.需求 创建一个表,对该表进行增

hadoop+javaWeb的开发中遇到包冲突问题

1.HDFS + WEB 项目 报java.lang.VerifyError... 异常 抛异常: Exception in thread "main" java.lang.VerifyError: (class: com/google/common/collect/Interners, method: newWeakInterner signature: ()Lcom/google/common/collect/Interner;) Incompatible argument to

JavaWeb入门级开发知识整理

一.开发环境所需软件 1.Tomcat Tomcat是Apache-Jarkarta 的一个免费/开放源码的子项目,是一个支持JSP和Servelt技术的容器,它同时又是一个Web服务器软件. 2.MyEclipse MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用的开发.MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错. 3.MySQL MySQL是一个开源轻便的

TomCat以及JavaWeb的开发目录结构

1. 部署并启动 tomcat 服务器.1). 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下2). 配置一个环境变量. java_home(指向 JDK 安装的根目录) 或 jre_home3). 通过双击 apache-tomcat-6.0.16\bin 目录下的 startup.bat, 启动服务器4). 可以在浏览器中输入 localhost:8080 来检验 Tomcat 安装是否正确. 5). 若已经启动了一个 Tomcat 应用, 若再启动同一个 Tom