我在 Eclipse 中使用 @WebServlet
注释。根据给定的 url 模式确定 servlet 类名的最佳方法是什么?在使用 WebServlet
之前,我能够在 web.xml 中搜索该模式。但现在我必须在整个项目中搜索 url 模式。
一个具体的例子是:
servlet-name: MyServlet
url-pattern: /myPattern/*
假设我不知道本例中的 servlet 名称。我知道模式“/myPattern/*”。除了搜索“/myPattern/*”之外,我还能做些什么来快速查找名称 MyServlet
吗?
最佳答案
您可以从上下文中获取所有 ServlerRegistrations,并遍历每个 ServlerRegistrations 来搜索给定 urlPattern 的匹配项。请参阅以下方法 searchServletRegistrationByUrlPattern()。
如果您的项目中经常需要此功能,您可以创建一个以 urlPattern 作为键、以 servletName 作为值的 Map。类似于 createMapOfUrlPatternsToServletNames() + searchServletRegistrationByUrlPattern2()。
package testingThings;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/myPattern/*")
public class FindServletByUrlPattern extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Search through all ServletRegistrations and return this which is mapped of the given urlPattern.
* If no match is found returns null.
*
* @param urlPattern
* @return ServletRegistration | null
* @throws IOException
*/
protected ServletRegistration searchServletRegistrationByUrlPattern(String urlPattern) throws IOException {
Map<String, ? extends ServletRegistration> servletRegistrations = getServletContext().getServletRegistrations();
for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
ServletRegistration servletRegistration = entry.getValue();
Collection<String> mappings = servletRegistration.getMappings();
if (mappings.contains(urlPattern)) {
return servletRegistration;
}
}
return null;
}
/**
* Search in a map for given urlPattern.
* If no match is found returns null.
*
* @param urlPattern
* @return ServletRegistration | null
* @throws IOException
*/
protected ServletRegistration searchServletRegistrationByUrlPattern2(String urlPattern) throws IOException {
// create urlPattern map
Map<String, String> urlPatterns = createMapOfUrlPatternsToServletNames();
String servletName = urlPatterns.get(urlPattern);
if (servletName== null) {
return null;
}
ServletRegistration servletRegistrationOfSearchedUrlPatternInMap = getServletContext().getServletRegistration(servletName);
return servletRegistrationOfSearchedUrlPatternInMap;
}
protected Map<String, String> createMapOfUrlPatternsToServletNames() throws IOException {
Map<String, String> urlPatters = new TreeMap<String, String>();
Map<String, ? extends ServletRegistration> servletRegistrations = getServletContext().getServletRegistrations();
for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
ServletRegistration servletRegistration = entry.getValue();
Collection<String> mappings = servletRegistration.getMappings();
for (String urlPattern : mappings) {
urlPatters.put(urlPattern, entry.getValue().getName());
}
}
return urlPatters;
}
protected void showInfoAboutServletRegistration(ServletRegistration servletRegistration, HttpServletResponse response) throws IOException {
if (servletRegistration == null) {
response.getWriter().append("there is not servlers for this url-pattern<br>");
}
else {
response.getWriter()
.append("Servlet Name: ").append(servletRegistration.getName()).append("<br>")
.append("Servlet Class Name: ").append(servletRegistration.getClassName()).append("<br>")
.append("Mapping: ").append(Arrays.toString(servletRegistration.getMappings().toArray())).append("<br>")
.append("<br><br>")
;
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
// get ServletRegistration of the current servlet through servlet's name
ServletRegistration servletRegistrationOfCurrentServlet = getServletContext().getServletRegistration(getServletName());
// show in browser
showInfoAboutServletRegistration(servletRegistrationOfCurrentServlet, response);
// search ServletRegistration through url-pattern directly
String urlPattern = request.getParameter("url-pattern");
if (urlPattern == null) {
response.getWriter().append("use a query string parameter 'url-pattern' in order to search servlets for a pattern");
}
else {
ServletRegistration servletRegistrationOfSearchedUrlPattern = searchServletRegistrationByUrlPattern(urlPattern);
// show in browser
showInfoAboutServletRegistration(servletRegistrationOfSearchedUrlPattern, response);
}
// search ServletRegistration through url-pattern over map
ServletRegistration servletRegistrationOfSearchedUrlPatternInMap = searchServletRegistrationByUrlPattern2(urlPattern);
showInfoAboutServletRegistration(servletRegistrationOfSearchedUrlPatternInMap, response);
showInfoAboutAllServletRegistrations(request, response);
}
protected void showInfoAboutAllServletRegistrations(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter()
.append("<h3>All ServletRegistrations</h3>")
.append("<table>")
.append("<tr><th>")
.append("servletName:" )
.append("</th><th>")
.append("servletClassName:" )
.append("</th><th>")
.append("Mapping:" )
.append("</th></tr>")
;
Map<String, ? extends ServletRegistration> servletRegistrations = request.getServletContext().getServletRegistrations();
for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
ServletRegistration servlet = entry.getValue();
String servletName = servlet.getName();
String servletClassName = servlet.getClassName();
Collection<String> mappings = servlet.getMappings();
response.getWriter()
.append("<tr><td>")
.append(servletName)
.append("</td><td>")
.append(servletClassName)
.append("</td><td>")
.append(Arrays.toString(mappings.toArray()))
.append("</td></tr>")
;
}
}
}
Java文档
关于java - 如何使用 url 模式查找 servlet 类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667633/