带包的Servlet不起作用,并将包复制到URL中两次

时间:2016-02-13 17:58:28

标签: java html jsp url servlets

编辑:被标记为重复(Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available")我第一次设置servlet时没有任何问题,一切正常,当我提交它时,正确加载结果。副本显示了如何设置xml和jsp,我以相同的方式设置它们。如果我在正常重试后没有填写它们,但第二次无论它是否正确,网址都会变为.../one/one/main,从而产生404。

如果我将xml的url模式设置为没有包的类名(在示例<url-pattern>/servlet</url-pattern>中),则servlet甚至不会在第一次正确尝试时启动。无论网址格式和表单引用,在网址格式上我都有/one/Main,格式为one/Main。在副本中,我尝试的任何形式的示例都会在提交后生成404。 我试图删除xml servlet配置并使用{(1}})从servlet中使用@WebServlet,我有同样的问题,第一次工作,第二次尝试它的一个/一个/主要在网址。

在这个简单的servlet中,每当我使用一个包时,当我第二次不填写两个输入文本字段时,它会将网址更改为@WebServlet(description = "Main", urlPatterns = { "/one/Main" })

../one/one/Main

jsp表单部分

public void doPost(HttpServletRequest request
        , HttpServletResponse response) throws ServletException, IOException{

    String action = request.getParameter("action");
    String url = "/index.jsp";
    if(action==null)
        action="join";

    if(action.equals("join"))
        url="/index.jsp";
    else if(action.equals("ok")){
        String fName = request.getParameter("firstName");
        String sName = request.getParameter("secondName");
        if(fName==null||sName==null||fName.equals("")||sName.equals("")){
            url = "/index.jsp";
            request.getSession().setAttribute("message"
                    , "Please fill all the fields");
        }
        else{
            url = "/thanks.jsp";
            request.getSession().setAttribute("user"
                    , new User(fName, sName));
        }
    }
    getServletContext().getRequestDispatcher(url)
        .forward(request, response);
}

xml servlet mapping

<form action="one/Main" method="post">..</form>

我试图复制<servlet> <servlet-name>Main</servlet-name> <servlet-class>one.Main</servlet-class> </servlet> <servlet-mapping> <servlet-name>Main</servlet-name> <url-pattern>/one/Main</url-pattern> </servlet-mapping> 包之外的类,并相应地重新配置表单标记和xml(将servlet类设置为one,将模式设置为Main并将jsp操作设置为{{ 1}}),在那一点上它完美地工作,我可以错过填写字段我想要多少次,它将继续使用消息重新加载正确的页面,但是一旦servlet当我运行并错过输入两次时,/Main javabean位于 one 包内,url更改为double package Main,我有404。

1 个答案:

答案 0 :(得分:1)

问题是您在JSP中使用相对路径来提交表单。一旦JSP与您的servlet不在同一个基本路径上,您在提交表单后就会有不同的基本路径。

您应该阅读5.1.2 Relative URLs以了解相对网址的工作原理:

  

相对网址(在RFC1808中定义)并不包含任何协议   或机器信息。它的路径通常指的是一个资源   与当前文档相同的机器。相对URL可能包含   相对路径组件(".."表示层次结构中的一个级别   由路径定义,并可能包含片段标识符。

     

使用基本网址将相对网址解析为完整网址。 RFC1808   定义了此过程的规范算法。

     

作为相对URL解析的示例,假设我们有基本URL   http://www.acme.com/support/intro.html。中的相对URL   以下是超文本链接的标记:

 <A href="suppliers.html">Suppliers</A>
     

会扩展为完整的网址   http://www.acme.com/support/suppliers.html,而相对网址   在以下图像标记中

<IMG src="../icons/logo.gif" alt="logo">
     

会扩展为完整的网址http://www.acme.com/icons/logo.gif