如何通过 JSP 页面调用 Servlet

23

我想通过一个JSP页面来调用一个Servlet,应该使用什么方法调用?


1
当你说想要“通过jsp调用servlet”时,你到底想做什么?你想将请求转发到另一个servlet吗?你想重定向到一个servlet吗?你想调用一个包含在你的servlet之一的方法吗? - El Guapo
我只想重定向到Servlet。 - Rupesh
下面有许多好的答案。您需要在web.xml中为您的servlet创建一个映射(下面有一个示例),然后您需要调用response.redirect(响应对象将出现在您的jsp中)到您的servlet的映射。 - El Guapo
@ElGuapo 亲爱的,我有一个 userIndex.jsp 页面,我想要获取两个 servlet。其中一个是获取并发送用户信息,另一个是发送书籍信息。当我登录时,它会显示用户信息,但不会显示书籍信息,那么我该如何同时调用这两个 servlet 呢? - Muhammad Siddique
6个回答

41

可以 使用 <jsp:include> 来实现这个功能。

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

通常情况下则恰好相反,你调用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中的<url-pattern>的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年了,它告诉我所有我需要知道的事情,需要改变的事情以及我现在要做的一切 :) - thonnor
亲爱的,我有一个 userIndex.jsp 页面,想要获取两个 servlet。其中一个是获取并发送用户信息,另一个是发送图书信息。当我登录时,它会显示用户信息,但没有图书 servlet,那么我该如何同时调用它们?手动给出 servlet 的链接时,才能获取图书信息。 - Muhammad Siddique

6
您可以像在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"); 这段代码的作用是什么,但它不会发送一个名为 "msg" 值为 "HI Welcome" 的请求。实际上它被忽略了。 - user1853517

3

没有直接调用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的完整方法... 因为转发不需要刷新。 - El Guapo
3
将JSP转发到servlet只会增加服务器日志中“IllegalStateException: response already committed”异常的混乱。 JSP不适合充当请求/响应控制器的角色。 - BalusC

2
为什么你想这样做呢?你不应该在视图中执行控制器代码,更不能尝试将另一个servlet的代码拉入视图中。
首先进行所有处理和重构应用程序,然后只需将结果传递给视图。使视图变得尽可能简单,并且您甚至不会遇到这些问题。
如果这种设计对您来说很难,请尝试使用Freemarker或类似Velocity(虽然我不建议)来强制您这样做。您永远不必这样做。
更准确地说,您正在尝试解决的问题只是更大问题的症状 - 您的servlet架构/设计问题。

1

您可以将 JSP 页面提交到 Servlet。为此,请使用 <form> 标签。

并且要进行重定向,请使用:

response.sendRedirect("servleturl")

1
从JSP到servlet的重定向只会冒着服务器日志混乱的风险,出现“IllegalStateException:response already committed”异常。 JSP不是充当请求/响应控制器的正确位置。 - BalusC
@BalusC:是的,JSP不是处理这个问题的正确位置。OP应该使用servlet进行处理,然后重定向到JSP。但是OP要求这样做,所以我建议使用response.sendRedirect("") - Harry Joy

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接