我有两个servlet(S1和S2)。 S1呈现一个HTML页面,它通过URL(img src =“URL”)访问S2。我知道S2的servlet名称,但不知道URL。当然,URL在web.xml中配置,但是如何从S1中访问它?
答案 0 :(得分:1)
我猜,ServletConfig的大多数实现都持有映射信息(org.apache.catalina.core.StandardWrapper),但由于ServletConfig-Interface没有提供getter,你必须做一些技巧来获取它并将你的应用程序绑定到特定的实现或应用程序服务器。
也许您只是从web.xml中读取它。只需选择具有给定“servlet-name”的所有“servlet-mapping”元素,并阅读“url-pattern”。由于这是在规范中,这应该适用于任何app服务器。
修改强>
这是一个肮脏的例子。使用refelction获取URL映射:
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
Class<?> clazz = config.getClass();
Field configField = clazz.getDeclaredField("config");
configField.setAccessible(true);
StandardWrapper standardWrapper = (StandardWrapper) configField.get(config);
clazz = standardWrapper.getClass();
Field mappingsField = clazz.getDeclaredField("mappings");
mappingsField.setAccessible(true);
List<?> mappings = (List<?>) mappingsField.get(standardWrapper);
System.out.println(mappings);
}catch (Exception e) {
logger.error("", e);
}
}
这适用于我的JSF,Tomcat环境。 config对象是“org.apache.catalina.core.StandardWrapperFacade”并有一个名为“config”的字段,它包含一个“org.apache.catalina.core.StandardWrapper”,它有一个名为“mappings”的字段。
但正如我所说,这是一个肮脏的黑客!
答案 1 :(得分:1)
使用:
HttpServletResponse.encodeURL(String)
在你的情况下应该是这样的:
response.encodeURL("/S2");
此方法将处理为维护会话状态而需要进行的任何URL重写,并且我认为将在URL之前添加必要的路径信息。
这些天我使用JSTL,所以我在最后一点上有点生疏,但是如果路径信息没有预先添加,你可以从请求中获取并自己添加。
答案 2 :(得分:1)
也许您应该将第二个servlet的URL作为servlet参数提供给第一个servlet。我意识到这意味着在web.xml中编码URL 两次(我真的很厌恶),但是为了避免出现问题,你可以随时构建web.xml作为构建的一部分,并从属性中填充文件。
有点讨厌和讨厌,我很欣赏,但在没有任何跨容器API解决方案的情况下,也许这是最实用的解决方案。
答案 3 :(得分:1)
您可以在doGet()或doPost()方法中轻松完成以下方法:在servlet的doGet()或doPost()方法中编写代码,以获取与servlet关联的映射。
public void doGet(HttpServletRequest request,HttpServletResponse response){
String nameOfServlet = "S2";
ServletContext context = getServletContext();
String[] mappinggs=context.getServletRegistration(nameOfServlet).getMappings().toArray();
//mappings will contain all the mappings associated with servlet "S2"
//print take the first one if there is only one mapping
System.out.println(mappings[0]);
}