我的servlet中有以下代码
PrintWriter out = response.getWriter();
out.println("Getting Context scoped attributes<br>");
ServletContext sc = getServletConfig().getServletContext();
Enumeration contextAttribNames = sc.getAttributeNames();
while(contextAttribNames.hasMoreElements()){
String attribName = (String) contextAttribNames.nextElement();
String attribValue = (String) sc.getAttribute(attribName);//Line#21
out.println("<b>" + attribName + ":</b> " + attribValue + "<br>");
}
它只是尝试获取与应用程序/上下文范围相关的所有属性并打印它们的值。
代码编译正常,但是当我从url模式
调用此servlet时失败以下是我得到的错误
“HTTP状态500 - org.apache.catalina.core.DefaultInstanceManager无法强制转换为java.lang.String”
java.lang.ClassCastException:org.apache.catalina.core.DefaultInstanceManager无法强制转换为java.lang.String com.servlet.scopes.GetContextScopeServlet.doGet(GetContextScopeServlet.java:21) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
根据文档,javax.servlet.ServletContext有一个方法来获取具有以下签名的属性 public Object getAttribute(String attribName)
这就是为什么我要在#21行转换为String
的原因请帮助我理解问题并解决问题...
环境详情: 操作系统 - Windows7 服务器 - Apache Tomcat 7.x. JavaEE-6规范
答案 0 :(得分:1)
属性不一定都是String
类型。它们可以是任何对象类型。但是你试图将它们全部用作String
个对象
String attribValue = (String) sc.getAttribute(attribName);//Line#21
你不知道他们的类型,所以你可以做到
Object attribValue = sc.getAttribute(attribName);//Line#21
答案 1 :(得分:0)
ServletContext
中的属性并不总是String
个对象;它们可以是任何东西,通常是数据库池之类的项目。您几乎不应该将对象强制转换为String
;相反,将Enumeration
正确地参数化为Enumeration<String>
,并在属性值上使用toString()
,或者在字符串连接中使用裸Object
以使编译器调用{{} 1}}含蓄地。