【问题标题】:embedded jetty forward from servlet to jsp从servlet到jsp的嵌入式码头
【发布时间】:2011-12-21 17:01:46
【问题描述】:

我尝试让我的嵌入式码头 servlet 进行一些处理,然后将控制权交给将生成结果页面的 JSP。

servlet 被正确映射和调用,但是找不到 JSP。由于我使用嵌入式码头,我没有 web.xml,也没有战争。也许这意味着码头不知道在哪里寻找我的 JSP 或其他东西。如果是这种情况,我如何告诉 eclipse/jetty 在哪里可以找到它,或者我在呼叫前锋时是否缺少某些东西。

注意我使用的是常规的 Maven 项目,所以必须自己创建 WEB-INF 文件夹。可能是出了什么问题的线索!?

import java.io.IOException;

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

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.springframework.core.io.ClassPathResource;

public class RunHelloServlet {

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

    ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

    contextHandler.setContextPath(".");
    server.setHandler(contextHandler);

    contextHandler.addServlet(new ServletHolder(new HelloServlet()), "/hello");

    server.start();
    server.join();
}

public static class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public HelloServlet() {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String par1 = request.getParameter("par1");
        request.setAttribute("key", par1);

        // logic

        try {
            RequestDispatcher r = request.getRequestDispatcher("/result.jsp");
            request.getRequestDispatcher("/WEB-INF/result.jsp").forward(request, response);
        }
        catch (ServletException e1) {
            e1.printStackTrace();
        }

    }
}

}

我的pom如下...

<project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hp.it.kmcs.search</groupId>
  <artifactId>JettyTest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>JettyTest</name>
  <url>http://maven.apache.org</url>

 <properties>
    <jettyVersion>7.2.0.v20101020</jettyVersion>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.eclipse.jetty.aggregate</groupId>
        <artifactId>jetty-all-server</artifactId>
        <version>7.6.0.RC1</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.1.0.RELEASE</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
<plugins>
  <plugin>
    <!-- This plugin is needed for the servlet example -->
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>${jettyVersion}</version>
  </plugin>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1</version>
    <executions>
      <execution><goals><goal>java</goal></goals></execution>
    </executions>
    <configuration>
      <mainClass>com.hp.it.kmcs.JettyTest.RunHelloServlet</mainClass>
    </configuration>
  </plugin>
</plugins>

【问题讨论】:

    标签: jsp servlets jetty forwarding embedded-jetty


    【解决方案1】:

    所以我使用 setWar 和正确的 jar 来实现它。使用此代码可以直接寻址 jsp (localhost:8080/result.jsp),更重要的是使用 servlet (localhost:8080/hello) .forward 命令转发到 jsp。这将使我能够使用我的 jsp 提供一些动态内容。

    代码如下...(注意:Embedded Jetty => 不需要 web.xml)

    import java.io.File;
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.eclipse.jetty.server.Handler;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.handler.DefaultHandler;
    import org.eclipse.jetty.server.handler.HandlerList;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.eclipse.jetty.webapp.WebAppContext;
    
    public class RunHelloServlet {
    
    public static void main(String[] args) throws Exception {
    
        System.setProperty("DEBUG", "true");
        Server server = new Server(8080);
    
        WebAppContext webappcontext = new WebAppContext();
        webappcontext.setContextPath("/");
    
        File warPath = new File("C:/dev/workspace/JettyTest", "src/main/webapp");
        webappcontext.setWar(warPath.getAbsolutePath());
        HandlerList handlers = new HandlerList();
        webappcontext.addServlet(new ServletHolder(new HelloServlet()), "/hello");
    
        handlers.setHandlers(new Handler[] { webappcontext, new DefaultHandler() });
        server.setHandler(handlers);
        server.start();
    }
    
    public static class HelloServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public HelloServlet() {
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
            // logic
    
            try {
                request.getRequestDispatcher("/result.jsp").forward(request, response);
            }
            catch (Throwable e1) {
                e1.printStackTrace();
            }
    
        }
    }
    }
    

    POM.xml...

    <project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.hp.it.kmcs.search</groupId>
      <artifactId>JettyTest</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>JettyTest</name>
      <url>http://maven.apache.org</url>
    
    <properties>
        <jettyVersion>7.2.0.v20101020</jettyVersion>
    </properties>
    <dependencies>
    
        <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>7.6.0.RC1</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-util</artifactId>
        <version>7.6.0.RC1</version>
        <type>jar</type>
        <classifier>config</classifier>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jsp-2.1-glassfish</artifactId>
        <version>2.1.v20100127</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jdt.core.compiler</groupId>
        <artifactId>ecj</artifactId>
        <version>3.5.1</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>servlet-api-2.5</artifactId>
        <version>6.1.14</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>7.6.0.RC0</version>
        <type>jar</type>
        <scope>compile</scope>
        </dependency>
    </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <!-- This plugin is needed for the servlet example -->
            <groupId>org.mortbay.jetty</groupId>
           <artifactId>jetty-maven-plugin</artifactId>
            <version>${jettyVersion}</version>
          </plugin>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1</version>
            <executions>
              <execution><goals><goal>java</goal></goals></execution>
            </executions>
            <configuration>
              <mainClass>com.hp.it.kmcs.JettyTest.RunHelloServlet</mainClass>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    【讨论】:

    • 谢谢 - 这帮助我找出了相关问题的答案。对我来说,从通用 ServletContextHandler 切换到 WebAppContext 解决了它(嵌入式码头与 guice servlet 注入)。我正在将 ResourceBase 设置为 Web 应用程序路径。
    【解决方案2】:

    您的嵌入应用程序控制台是否像这样显示 INFO:

    INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /servletpath, did not find org.apache.jasper.servlet.JspServlet
    

    默认情况下,嵌入式 Jetty 没有启用 JSP 支持。有关详细信息,请参阅here。 HTH。

    【讨论】:

    • 没有控制台输出不会这样抱怨。我现在在摆弄它的时候在我的工作区中破坏了一些东西:) 但我很快就会给你确切的控制台输出
    • 哦,关于 JSP 支持的那篇文章至少可以说令人困惑。然而,它结束说你可以使用已经使用的码头聚合罐
    • 控制台说...... 2011-12-22 14:12:17.262:INFO:oejs.Server:jetty-7.6.0.RC1 2011-12-22 14:12:17.370 :INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,file:/C:/dev/workspace/JettyTest/} 2011-12-22 14:12:17.425:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0: 8080 开始
    • 好的,那似乎没问题,只是问一下,因为这就是我遇到的问题。
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2013-12-30
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多