【问题标题】:How to call servlet through a JSP page如何通过 JSP 页面调用 servlet
【发布时间】:2011-08-04 17:13:10
【问题描述】:

我想通过 JSP 页面调用 Servlet。调用的方法是什么?

【问题讨论】:

  • 当你说你想“通过jsp调用servlet”时,你到底想做什么?是否要将请求转发到另一个 servlet?是否要重定向到 servlet?您想调用您的一个 servlet 中包含的方法吗?
  • 我只想重定向到 servlet
  • 下面有很多很好的答案。您需要在 web.xml 中为您的 servlet 创建一个映射(下面有一个示例),然后您需要调用 response.redirect(响应对象将出现在您的 jsp 中)到您的 servlet 的映射。
  • @ElGuapo 亲爱的我有一个 userIndex.jsp,我想在其中获取两个 servlet,一个是获取和发送用户信息,另一个是发送书籍信息。当我登录时,它显示的是用户信息,而不是书籍类,所以我如何同时调用两者??

标签: jsp servlets


【解决方案1】:

可以为此使用<jsp:include>

<jsp:include page="/servletURL" />

但通常情况正好相反。您调用 servlet,该 servlet 又转发到 JSP 以显示结果。创建一个 Servlet,它在 doGet() 方法中执行类似以下操作。

request.setAttribute("result", "This is the result of the servlet call");
request.getRequestDispatcher("/WEB-INF/result.jsp").forward(request, response);

/WEB-INF/result.jsp

<p>The result is ${result}</p>

现在通过与web.xml 中的&lt;url-pattern&gt; 匹配的URL 调用Servlet,例如http://example.com/contextname/servletURL.

请注意,JSP 文件明确放置在/WEB-INF 文件夹中。这将阻止用户单独打开 JSP 文件。用户只能调用 servlet 才能打开 JSP 文件。


如果您的实际问题是“如何向 servlet 提交表单?”那么您只需在 HTML 表单 action 中指定 servlet URL。

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

然后将调用其doPost() 方法。


另见:

【讨论】:

  • 好答案。在第一次写作 7 年后,告诉我我需要知道的一切,我需要改变的一切以及我现在要做的一切:)
  • 亲爱的,我有一个 userIndex.jsp,我想在其中获取两个 servlet,一个是获取和发送用户信息,另一个是发送书籍信息。当我登录时,它显示的是用户信息,而不是书籍 servlet,所以我如何同时调用两者?当我手动提供 servlet 的链接时,会获取书籍。
【解决方案2】:

你可以像平时在Servlet中一样使用RequestDispatcher

<%@ page contentType="text/html"%>
<%@ page import = "javax.servlet.RequestDispatcher" %>
<%
     RequestDispatcher rd = request.getRequestDispatcher("/yourServletUrl");
     request.setAttribute("msg","HI Welcome");
     rd.forward(request, response);
%>

请始终注意,在使用 forward 之前不要提交任何响应,因为它会导致 IllegalStateException

【讨论】:

  • 我不确定是什么,request.setAttribute("msg","HI Welcome");应该是这样做的,但这不会发送“HI Welcome”的请求“msg”。它实际上被忽略了。
【解决方案3】:

您为什么要这样做?您不应该在视图中执行控制器代码,当然也不应该尝试将另一个 servlet 中的代码拉入视图。

首先对应用程序进行所有处理和重构,然后将结果传递给视图。让视图尽可能的愚蠢,你甚至不会遇到这些问题。

如果这种设计对你来说很难,试试 Freemarker 甚至像 Velocity 之类的东西(虽然我不推荐它)来强迫你这样做。你永远不必做这种事情。

更准确地说,您试图解决的问题只是一个更大问题的症状 - 您的 servlet 架构/设计。

【讨论】:

    【解决方案4】:

    您可以将您的 jsp 页面提交给 servlet。为此使用&lt;form&gt; 标签。

    并重定向使用:

    response.sendRedirect("servleturl")
    

    【讨论】:

    • 从 JSP 发送重定向到 servlet 只会冒着服务器日志被 IllegalStateException: response already committed 异常混乱的风险。 JSP 不适合充当请求/响应控制器。
    • @BalusC:是的,jsp 是错误的地方。 OP 应该使用 servlet 进行处理,然后重定向到 JSP。但是 OP 要求这样做,这就是我回答使用 response.sendRedirect("") 的原因。
    【解决方案5】:

    您可以将 HTML 表单发布到映射到 servlet 的 URL,也可以将数据插入到传递给 jsp 页面的 HttpServletRequest 对象中。

    【讨论】:

      【解决方案6】:

      没有调用 Servlet 的方法。您应该在 web.xml 中进行映射,然后触发此映射。

      示例:web.xml:

        <servlet>
          <servlet-name>hello</servlet-name>
          <servlet-class>test.HelloServlet</servlet-class>
        </servlet>
      
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
        </servlet-mapping>
      

      这个映射意味着每次调用http://yoursite/yourwebapp/hello都会触发这个servlet 比如这个jsp:

      <jsp:forward page="/hello"/> 
      

      【讨论】:

      • 这将是您创建映射的方式。但是,您必须调用 response.sendRedirect(redirectURL);到带有您创建的映射的完整 URL...您必须确保在调用 sendRedirect 之前刷新响应,否则您会收到错误...但是,我认为您应该在这里采用@smas 的完整方法...因为前锋不需要冲洗。
      • 从 JSP 向 servlet 发送转发只会冒着服务器日志被IllegalStateException: response already committed 异常弄乱的风险。 JSP 不适合充当请求/响应控制器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多