我想通过JSP页面调用Servlet。调用方法是什么?
首先将JSP页面放在
/WEB-INF
文件夹中的任意位置,这样就不会在不先调用Servlet的情况下意外单独打开JSP页面。例如。 /WEB-INF/result.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>
现在通过与
@WebServlet
注释中或 <url-pattern>
中的 web.xml
配置中定义的 URL 模式匹配的 URL 调用 Servlet,例如/servletURL
:http://example.com/contextname/servletURL。
如果您的实际问题是“如何向 servlet 提交表单?”那么您只需在 HTML 表单中指定 servlet URL
action
。
<form action="servletURL" method="post">
其
doPost()
方法将被调用。
您可以像平常在
RequestDispatcher
中一样使用 Servlet
:
<%@ 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
。
没有调用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"/>
你为什么要这样做?您不应该在视图中执行控制器代码,并且当然也不应该尝试将另一个 servlet 内的代码拉入视图中。
首先对应用程序进行所有处理和重构,然后将结果传递给视图。让视图尽可能愚蠢,你甚至不会遇到这些问题。
如果这种设计对你来说很难,请尝试使用 Freemarker 甚至像 Velocity 这样的东西(尽管我不推荐它)来强制你这样做。你永远不必做这种事。
更准确地说,您试图解决的问题只是一个更大问题的症状 - 您的 servlet 的架构/设计。
您可以将 HTML 表单发布到映射到 servlet 的 URL,或者将数据插入到传递给 jsp 页面的 HttpServletRequest 对象中。