【问题标题】:Jetty Set up Servlet to Communicate with JSP PageJetty 设置 Servlet 与 JSP 页面通信
【发布时间】:2016-03-09 13:01:33
【问题描述】:

我对 JSP 和 Jetty 很陌生,我真的很困惑为什么这段代码不起作用。

这是我的主课

    public static void main(String[] args) {

        Server server = new Server(8080);

        // As we are using the Servlet to server responses remove the resource
        // handler.
        ResourceHandler resource_handler = new ResourceHandler();
        resource_handler.setDirectoriesListed(true);
        resource_handler.setWelcomeFiles(new String[] { "index.jsp",
                "index.html" });
        resource_handler.setResourceBase("./target/classes/webapp");

        // Initialise Servlet context handler
        ServletContextHandler context = new ServletContextHandler(
                ServletContextHandler.SESSIONS);

        context.setContextPath("/");



        // Create WebAppContext for JSP files.
        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setResourceBase("./target/classes/webapp");

        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { webAppContext, context,
                resource_handler, new DefaultHandler() });
        server.setHandler(handlers);

        try {
            server.start();
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(-1);
        }

    }

这是我的小服务程序

public class IndexServlet extends HttpServlet {

    private static final long serialVersionUID = 0x1C30CCL;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Set response content type.
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);

        request.setAttribute("message", "hello");


    }

}

这是我的 index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"%> 

<!DOCTYPE html>
<html>
<head>
<title>Book a hotel!</title>
</head>
<body>

<form action="index.jsp" method="post">
<input type="text" name="username" placeholder="Enter Username" />
<input type="Submit">
</form>
<p> The current local time at the hotel is: <%= new java.util.Date() %> </p>
    <h1>${message }</h1>

</body>
</html>

这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>

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


<servlet>
    <servlet-class>ncl.raffaello.IndexServlet</servlet-class>
    <servlet-name>IndexServlet</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>IndexServlet</servlet-name>
    <url-pattern>index.jsp</url-pattern>
</servlet-mapping>


</web-app>

我的问题是,虽然我知道 .jsp 在我没有 servlet 时可以工作,但我希望 servlet 设置请求变量,但是当启用 servlet 时,就像在我的代码示例中一样,它不会运行任何.jsp !有什么帮助吗?我不知道该怎么办......

【问题讨论】:

    标签: java jsp servlets jetty


    【解决方案1】:

    你必须使用

    PrintWriter out = res.getWriter(); out.println("something") 在您的sevlet 中打印jsp 页面上的内容。

    简单教程here.

    将您的 servlet 映射 url 模式从 index.jsp 更改为 test

    <servlet-mapping>
            <servlet-name>IndexServlet</servlet-name>
            <url-pattern>test</url-pattern>
        </servlet-mapping>
    

    将 index.jsp 中的表单操作修改为 &lt;form action="test"&gt;

    构建项目并启动服务器。

    如果您点击 url localhost:8080,您应该会获得 index.jsp,因为您将其设置为 welcomePage。如果没有尝试localhost:8080/index.jsp。你现在应该得到表格了。

    如果您提交表单,IndexServlet 将被调用

    【讨论】:

    • 抱歉,Sysout 只是调试代码。执行该代码,只是在我的页面上打印出“一些东西”,它不显示 web 表单和 jsp 的其余部分
    • 你得到index.jsp这个网址localhost:8080/index.jsp了吗?
    • 是的,我用过那个网址
    【解决方案2】:

    您正在定义一个映射为 /index.jsp 的 servlet 以及具有相同名称的静态欢迎页面。

    当容器收到对 /index.jsp 的请求时,它会查找最长的完全匹配,因此它与 servlet 匹配并调用您的 doGet。

    只有在没有找到完全匹配的情况下,容器才会调用 jsp,在这种情况下,它将与 jsp 处理器将匹配的 *.jsp 匹配。

    你有两个选择:

    1. 使 servlet 的映射不是 index.jsp。

    2. 将 jsp 放在子目录中,例如“welcomes”,因此您将欢迎文件定义为 /welcome/index.jsp。然后对 /index.jsp 的任何请求都将转到 servlet,对“/”的请求将转到 index.jsp。然后 servlet 可以将请求转发到 /welcomes/index.jsp 并调用该 jsp。

    【讨论】:

    • 我最终做了后者并且它有效,我的问题是,是否可以在发送 GET 请求时“拦截”调用,设置一些参数然后转移到那个 .jsp 页面然后将显示该参数的相同名称。
    • 除非服务器提供了一些特殊的定制方式来做这件事。基本上,服务器无法将相同的 uri (/index.jsp) 匹配到一个资源用于入站请求和不同资源用于转发请求。
    • 好的,这非常有用,我会将您的答案标记为已接受并选择第二个选项。非常感谢!
    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2011-08-04
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多