2012-01-30 41 views
10

Tôi đã tải xuống Eclipse cho Java EE và Jetty 8.1 và muốn triển khai Servlet rất đơn giản.Làm cách nào để viết một Servlet đơn giản cho Jetty bằng Eclipse?

Cầu nối hoạt động tốt khi tôi bắt đầu sử dụng java -jar start.jar.

Phát triển Servlet Tôi đã làm điều này:

  1. Trong Eclipse, Tôi chọn lựa "New Dynamic Project Web".

  2. Tôi đã thêm jetty\lib\servlet-api-3.0.jar vào "Đường dẫn xây dựng" trong Eclipse.

  3. Trong dự án này, "New Servlet", và một Servlet được tạo ra và tôi đã thêm một số mã:

    /** 
    * Servlet implementation class MyServlet 
    */ 
    @WebServlet("/MyServlet") 
    public class MyServlet extends HttpServlet { 
        private static final long serialVersionUID = 1L; 
    
        /** 
        * @see HttpServlet#doGet(HttpServletRequest request, 
           HttpServletResponse response) 
        */ 
        protected void doGet(HttpServletRequest request, 
           HttpServletResponse response) 
         throws ServletException, IOException { 
         PrintWriter out = response.getWriter(); 
         out.println("<html><body><h1>My Servlet</h1></body></html>"); 
        } 
    
        /** 
        * @see HttpServlet#doPost(HttpServletRequest request, 
           HttpServletResponse response) 
        */ 
        protected void doPost(HttpServletRequest request, 
           HttpServletResponse response) 
         throws ServletException, IOException { 
         // TODO Auto-generated method stub 
        } 
    
    } 
    
  4. Tôi tạo ra một tập tin web.xml trong WebContent\WEB-INF\web.xml với nội dung này:

    <?xml version="1.0" encoding="utf-8" ?> 
    <web-app 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    version="2.4"> 
    <servlet> 
        <servlet-name>My Servlet</servlet-name> 
    <servlet-class>MyServlet.class</servlet-class> 
    </servlet> 
    
    <servlet-mapping> 
        <servlet-name>My Servlet</servlet-name> 
        <url-pattern>/Servlet</url-pattern> 
    </servlet-mapping> 
    

  5. Tôi đã sao chép .class -files đã biên dịch trong build\classes đến WebContent\WEB-INF\classes

  6. Bây giờ tôi chọn Xuất dự án dưới dạng .war -file thành jetty\webapps\MySite.war.

  7. tôi bắt đầu Jetty với java -jar start.jar và ghé thăm localhost:8080/MySite/Servlet nhưng bây giờ tôi nhận được tin nhắn này:

    Servlet Not Initialized 
    
    javax.servlet.UnavailableException: Servlet Not Initialized 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:546) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:485) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:412) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) 
    at org.eclipse.jetty.server.Server.handle(Server.java:351) 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:451) 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:916) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:647) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:233) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:615) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534) 
    at java.lang.Thread.run(Thread.java:722) 
    

và nếu tôi truy cập localhost:8080/MySite/ tôi thấy hai thư mục WEB-INF\META-INF\ cả với kích thước 0 bytes.

Vì vậy, nó không giống như của tôi .war -export trong Eclipse đã hoạt động.

Làm cách nào để xuất Servlet đơn giản cho Jetty của tôi bằng Eclipse?


bây giờ tôi đã cài đặt Jetty WTP plugin cho Eclipse, nhưng tôi không thể chạy servlet này sử dụng nó:

2012-01-30 10:06:50.322:INFO:oejs.Server:jetty-8.1.0.RC4 
2012-01-30 10:06:50.353:INFO:oejdp.ScanningAppProvider:Deployment monitor C:\Users\Jonas\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps at interval 1 
2012-01-30 10:06:50.353:INFO:oejdp.ScanningAppProvider:Deployment monitor C:\Users\Jonas\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\contexts at interval 1 
2012-01-30 10:06:50.353:INFO:oejd.DeploymentManager:Deployable added: C:\Users\Jonas\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\contexts\MySite.xml 
2012-01-30 10:06:50.650:WARN:oejuc.AbstractLifeCycle:FAILED o.e.j.w.WebAppContext{/MySite,file:/C:/Users/Jonas/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/MySite/},C:\Users\Jonas\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0/wtpwebapps/MySite: java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor 
java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor 
    at org.eclipse.jetty.annotations.AnnotationConfiguration.createAnnotationParser(AnnotationConfiguration.java:111) 
    at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:73) 
    at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:428) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1208) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:36) 
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:183) 
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:491) 
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:138) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:142) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:53) 
    at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:604) 
    at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:535) 
    at org.eclipse.jetty.util.Scanner.scan(Scanner.java:398) 
    at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:332) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:118) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:552) 
    at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:227) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.util.component.AggregateLifeCycle.doStart(AggregateLifeCycle.java:58) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:53) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:91) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:263) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1214) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1137) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:457) 
    at org.eclipse.jetty.start.Main.start(Main.java:600) 
    at org.eclipse.jetty.start.Main.main(Main.java:82) 
Caused by: 
java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at org.eclipse.jetty.annotations.AnnotationConfiguration.createAnnotationParser(AnnotationConfiguration.java:111) 
    at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:73) 
    at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:428) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1208) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:36) 
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:183) 
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:491) 
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:138) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:142) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:53) 
    at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:604) 
    at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:535) 
    at org.eclipse.jetty.util.Scanner.scan(Scanner.java:398) 
    at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:332) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:118) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:552) 
    at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:227) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.util.component.AggregateLifeCycle.doStart(AggregateLifeCycle.java:58) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:53) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:91) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:263) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1214) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1137) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:457) 
    at org.eclipse.jetty.start.Main.start(Main.java:600) 
    at org.eclipse.jetty.start.Main.main(Main.java:82) 

Trả lời

8

Thứ nhất, web.xml của bạn là sai.

Phần tử lớp servlet chứa tên lớp đầy đủ của servlet.

từ web.lược đồ xml bạn đã sử dụng http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd tại dòng 923. Do đó, nội dung của phần tử lớp servlet ở dòng 9 phải là MyServlet, không phải là MyServlet.class.

Thứ hai, chỉ sử dụng một cách để đăng ký một servlet, bộ lọc hoặc người nghe để làm rõ. Nếu bạn thích sử dụng chú thích để đăng ký chúng vào một thùng chứa servlet. Bạn đã xóa tốt hơn phần tử servlet và servlet-mapping trong web.xml. Nếu không, bạn đã xóa chú thích tốt hơn trong nguồn java. Và nếu bạn muốn sử dụng web.xml, bạn nên cập nhật phiên bản giản đồ 2,4-3,0

Cuối cùng, vấn đề thứ hai của bạn đến từ các plugin Jetty WTP Eclipse có thể được giải quyết bằng cách cố gắng này: jetty run error for websockets project

+0

Tôi đã thay đổi phần tử servlet-class từ 'MyServlet.class' thành' my.package.MyServlet' và nhận xét chú thích '@ WebServlet' và bây giờ nó hoạt động. Cảm ơn. – Jonas

4

Cách bạn đang truy cập vào Servet có thể sai. Nếu chúng ta quan sát cuộc chiến bạn đang triển khai là MySite.war và url bạn đang sử dụng là localhost:8080\MyServlet\Servlet

Hãy thử với localhost:8080\MySite\Servlet

+0

Ngoài ra bạn có thể thêm một plugin vào nhật thực để kết nối với máy chủ Jetty của bạn thông qua nhật thực. Thử thêm máy chủ mới. và sau đó bạn có thể chạy ứng dụng của bạn trực tiếp trong nhật thực không cần xuất khẩu để chiến tranh và sau đó xuất bản cho Jetty một cách riêng biệt –

+0

Xin lỗi, đó là lỗi đánh máy của tôi, tôi đã truy cập vào 'localhost: 8080 \ MySite \ Servlet'. URI '' localhost: 8080 \ MyServlet \ Servlet' trả về '404 Not Found'. Tôi sẽ có một cái nhìn cho các plugin, nhưng nó sẽ làm việc để xuất khẩu một tập tin chiến tranh quá. – Jonas

Các vấn đề liên quan