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

标签 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链接

最佳答案

getNamedDispatcher 需要一个 servlet 名称;您为其提供一个 servlet URL。

使用名称,或使用 getRequestDispatcher 和 URL。

由于您进行转发,URL 不会更改 - 转发时不会发送回浏览器的重定向响应。转发的内容直接写入原始响应。

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

您重定向的 servlet 对输出执行什么操作?

我不认为你的参数命名约定有任何意义。该参数的名称不应与 servlet 名称相同;参数应该类似于“command”或“select”。然后,您可以使用命令参数值来查找 servlet 的 URL。或者,就您的情况而言,只需在前面加上 / 即可。无需进行任何 if/else 比较。

关于java - 中继 servlet(servlet 调用另一个 servlet),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8031995/

相关文章:

java - 如何使用 JSTL 确定空 session 属性

java - 多线程

java - struts2 中 HttpServletResponse 的任何其他内置方法

servlets - 检测空白 HTML 表单输入值

java - 将 POI 工作簿流式传输到 servlet 输出流

java - 使用 xml 输入/输出在现有主机上将 C++ 实现为 Web 服务

java - 跳过父项目中的 Maven 插件

java - Servlet 3.0 + JSTL + Struts 2 + Tiles 2 问题

java - 颠倒句子中每个单词的字符而不颠倒词序

java - 如何使用servlets和jsp做一个SPA?