【问题标题】:Multiple folders in Java EE 6 web pagesJava EE 6 网页中的多个文件夹
【发布时间】:2012-06-19 17:23:02
【问题描述】:

假设您有以下简单的应用程序:

<form action="helloServlet" method="post">

        Give name:<input type="text" name="name" />

        <input type="submit" value="Send"/>
</form>

还有一个处理该表单的 servlet:

package org.servlets.hello;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="helloServlet", urlPatterns={"/helloServlet"})
public class helloServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
String name = request.getParameter("name");


    PrintWriter out = response.getWriter();

    try {

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet helloServlet</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello  " + name + "</h1>");
        out.println("</body>");
        out.println("</html>");

    } finally { 
        out.close();
    }
} 

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

}

现在,当它从位于“网页”文件夹的网页运行时,它可以完美运行,但是当我尝试在网页的子文件夹中执行相同操作时,我收到 404 错误(请求的资源 () 不是可用的。)。我是否应该更改某些内容以使子文件夹成为调用 servlet 的有效位置?

【问题讨论】:

    标签: forms servlets java-ee-6


    【解决方案1】:

    如果 POST 操作 url 以 "/" 开头,则它是绝对的。否则,它是相对于当前页面的

    因为 post url &lt;form action="helloServlet" , helloServlet 是相对于当前路径的。

    这是访问 helloservlet url 的方式:

              Current Page          Servlet URL
    Usage 1   /form.html            /helloservlet
    Usage 2   /subfolder/form.html  /subfolder/helloservlet
    

    在您的情况下,用法 1 有效,因为 Servlet 映射到 /helloservlet

    解决方案:

    修改行

    &lt;form action="helloServlet" method="post"&gt;

    &lt;form action="/{contextPath}/}helloServlet" method="post"&gt;

    我认为您的上下文路径不是默认的"/" 上下文路径。在这种情况下,您应该拥有相对于域的 url。将 {contextpath} 替换为实际的上下文路径。

    【讨论】:

    • 恐怕您的解决方案不起作用。如果我将“/”放在表单操作中,它仍然会给我 404 错误。如果我进行更改并在没有子文件夹的情况下尝试相同的操作,也会给出相同的错误。在这两种情况下,搜索 servlet 的 url 是不同的。
    • 编辑了我的答案,使用
      。使用 EL 将 {contextpath} 替换为实际的上下文路径。
    【解决方案2】:

    好吧,我自己想通了。这是我的解决方案,以防其他人遇到同样的问题。据我了解,标准的 java web 项目文件夹结构如下:

    • 网页
      • WEB-INF
      • 子文件夹
    • 源包
      • org.whatever.name
    • 配置文件

    因此,如果我们在 SUBFOLDER 中有一个 hello.jsp,其中我们有一个包含以下内容的表单:

    <form action="helloServlet" method="post">
    

    还有一个 org.whatever.name 中的 servlet:

    @WebServlet(name="helloServlet", urlPatterns={"/helloServlet"})
    

    然后servlet位置根据Web Pages文件夹映射,两个文件找不到。因此,为了使 servlet 可用于子文件夹,我们要么更改 servlet:

    @WebServlet(name="helloServlet", urlPatterns={"SUBFOLDER/helloServlet"})
    

    或形式:

    <form action="../helloServlet" method="post">
    

    【讨论】:

      【解决方案3】:

      使用与域相关的 URL。

      <form action="${pageContext.request.contextPath}/helloServlet">
      

      无需在 servlet 映射中重复每个文件夹。

      另见:

      【讨论】:

        猜你喜欢
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 2016-11-11
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多