java web为啥在学生群体不是很吃香?回想几乎在大学的时候很少用java来做网站。为什么呢?
一、开发、调试不方便
二、太笨重、需要依赖太多的jar,搭一个空的环境,写个hello world就要经历吐血。。。
三、各种中文乱码
解决开发调试问题,这里给大家介绍一种把jetty集成到webapp的方法,只要有jdk和webapp代码可以快速的开发、调试,这里的jetty嵌入是直接嵌入jetty的启动代码到工程中,而不是用eclipse插件或者mvn插件的形式来实现。
优点:开发快捷、轻便、debug启动调试很方便
一、依赖的jar
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.24</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-jetty</artifactId>
<version>6.1.22</version>
<scope>provided</scope>
</dependency>
/**
* webapp内嵌的jetty容器启动类。
*
* @author lywybo
* @version $Id: JettyStarter.java, v 0.1 2012-8-26 下午02:39:38 lywybo Exp $
*/
public class JettyStarter {
/** 日志对象 */
private static Log log = LogFactory.getLog(JettyStarter.class);
/**
* @param args
*/
public static void main(String[] args) {
Server jettyServer = null;
try {
// 加载jetty配置信息
URL jettyConfig = ClassLoader.getSystemResource("jetty/jetty-config.xml");
if (jettyConfig == null) {
log.fatal("Unable to locate jetty-config.xml on the classpath");
}
// 启动jetty服务
jettyServer = new Server();
XmlConfiguration configuration = new XmlConfiguration(jettyConfig);
configuration.configure(jettyServer);
jettyServer.start();
} catch (Exception e) {
log.fatal("Could not start the Jetty server: " + e);
}
}
}
三、jetty服务器的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure id="Server" class="org.mortbay.jetty.Server">
<Set name="ThreadPool">
<New class="org.mortbay.thread.BoundedThreadPool">
<Set name="minThreads">10</Set>
<Set name="maxThreads">250</Set>
<Set name="lowThreads">25</Set>
</New>
</Set>
<Property name="org.mortbay.util.URI.charset" default="UTF-8" />
<Call name="addConnector">
<Arg>
<New class="org.mortbay.jetty.nio.SelectChannelConnector">
<Set name="host">
<SystemProperty name="jetty.host" />
</Set>
<Set name="port">
<SystemProperty name="jetty.port" default="80" />
</Set>
<Set name="maxIdleTime">30000</Set>
<Set name="Acceptors">2</Set>
<Set name="statsOn">false</Set>
<Set name="confidentialPort">8443</Set>
<Set name="lowResourcesConnections">5000</Set>
<Set name="lowResourcesMaxIdleTime">5000</Set>
</New>
</Arg>
</Call>
<Set name="handler">
<New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.mortbay.jetty.Handler">
<Item>
<New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection" />
</Item>
<Item>
<New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler" />
</Item>
<Item>
<New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler" />
</Item>
</Array>
</Set>
</New>
</Set>
<Set name="handler">
<New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.mortbay.jetty.Handler">
<Item>
<New class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set><!-- ContextPath -->
<Set name="resourceBase">./src/main/resources</Set><!-- Web应用根目录 -->
<Set name="descriptor">./src/main/resources/WEB-INF/web.xml</Set>
<!--
Web应用根目录
-->
<Call name="addServlet">
<Arg>org.mortbay.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
<!-- 增加其它的Servlet -->
</New>
</Item>
</Array>
</Set>
</New>
</Set>
<Set name="UserRealms">
<Array type="org.mortbay.jetty.security.UserRealm" />
</Set>
<Set name="stopAtShutdown">true</Set>
<Set name="sendServerVersion">true</Set>
<Set name="gracefulShutdown">1000</Set>
</Configure>
四、运行
把上面的信息配置成功之后就可以,在jettyStart.java右键run或者debug。debug的时候只要不改变方法、接口的名字,可以做到不用重启服务器,直接调试,非常方便,快捷。
五、可能遇到的问题
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
at org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory.getCompiler(CompilerAdapterFactory.java:105)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:924)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
at org.apache.jasper.compiler.AntCompiler.generateClass(AntCompiler.java:219)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:451)
在嵌入jetty并且需要运行jsp,需要依赖下面的包,否则会报上面的错误
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-jetty</artifactId>
<version>6.1.22</version>
<scope>provided</scope>
</dependency>