中继servlet(servlet调用另一个servlet)

时间:2011-11-07 01:53:26

标签: java servlets

您好我有一个关于servlet调用另一个servlet的问题

我有一个名为Relay的主servlet,它将负责控制其他servlet

用户将单击并将转发到Relay servlet

<li><a href="/oosd/Relay?selectAnimal=SelectAnimalServlet">Check the available animals</a> </li>

在Relay servlet中将获取参数的值以确定要运行的servlet

String selectAnimal = request.getParameter("selectAnimal");

if (selectAnimal.equals("SelectAnimalServlet")){
            getServletContext().getNamedDispatcher("/SelectAnimalServlet") 
            .forward(request, response); 
            //for testing
            System.out.println("Request forwarded to " + selectAnimal + " servlet");
        }

SelectAnimalServlet代码:

try
{     
    HttpSession session = request.getSession(true);
    session.getAttribute("currentSessionUser");
    List<AnimalSelectBean> beans = DAO.getAnimalList(); 
    request.setAttribute("beans", beans); 
    request.getRequestDispatcher("CheckAnimal.jsp").forward(request, response); 


}

现在,当我运行它因某些原因无法工作时,如果我直接将链接更改为SelectAnimalServlet,那么代码可以解决这个问题吗?

编辑:

这是我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>content.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>UpdateAnimalServlet</servlet-name>
    <servlet-class>content.UpdateAnimalServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>SelectAnimalServlet</servlet-name>
    <servlet-class>content.SelectAnimalServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Relay</servlet-name>
    <servlet-class>content.Relay</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SelectAnimalServlet</servlet-name>
    <url-pattern>/SelectAnimalServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UpdateAnimalServlet</servlet-name>
    <url-pattern>/UpdateAnimalServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Relay</servlet-name>
    <url-pattern>/Relay</url-pattern>
  </servlet-mapping>
</web-app>

我也改变了:

getServletContext().getNamedDispatcher("/SelectAnimalServlet") 
                .forward(request, response); 

到:

response.sendRedirect(response.encodeRedirectURL(selectAnimal));

并且使用http://localhost:8080/oosd/Relay?selectAnimal=SelectAnimalServlet链接

的空白网页仍然是相同的

1 个答案:

答案 0 :(得分:1)

getNamedDispatcher需要一个servlet名称;你正在为它提供一个servlet URL。

使用名称,或将getRequestDispatcher与URL一起使用。

由于您正在转发,因此URL不会更改 - 在转发时没有重定向响应发送回浏览器。转发的内容直接写入原始回复。

现在您正在转发,您需要重定向到URL,而不仅仅是servlet的名称。

您重定向的servlet为输出做了什么?

我不相信你的参数命名约定有任何意义。该参数的名称不应与servlet名称相同;参数应该类似于“command”或“select”。然后,您将使用命令参数值来查找servlet的URL。或者,在您的情况下,只需添加一个/,您就完成了。没有必要进行任何if/else比较。