Session 严重:为servlet目录页java.lang.InstanceionException分配异常
我正在练习“使用购物车和会话跟踪的在线商店”或coreservlet教程。我在运行CatalogPage servlet时发现异常。stacktrace如下所示:Session 严重:为servlet目录页java.lang.InstanceionException分配异常,session,servlets,tomcat6,Session,Servlets,Tomcat6,我正在练习“使用购物车和会话跟踪的在线商店”或coreservlet教程。我在运行CatalogPage servlet时发现异常。stacktrace如下所示: SEVERE: Allocate exception for servlet CatalogPage java.lang.InstantiationException at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(Instant
SEVERE: Allocate exception for servlet CatalogPage
java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1149)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
<servlet>
<servlet-name>CatalogPage</servlet-name>
<servlet-class>com.servletcontroller.CatalogPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CatalogPage</servlet-name>
<url-pattern>/CatalogPage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>KidsBooksPage</servlet-name>
<servlet-class>com.servletcontroller.KidsBooksPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KidsBooksPage</servlet-name>
<url-pattern>/KidsBooksPage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TechBooksPage</servlet-name>
<servlet-class>com.servletcontroller.TechBooksPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TechBooksPage</servlet-name>
<url-pattern>/TechBooksPage</url-pattern>
</servlet-mapping>
java是一个抽象的servlet类,由两个类扩展,每个类分别有init()定义。代码如下所示:
public abstract class CatalogPage extends HttpServlet {
private Item[] items;
private String[] itemIDs;
private String title;
protected void setItems(String[] itemIDs) {
this.itemIDs = itemIDs;
items = new Item[itemIDs.length];
}
protected void setTitle(String title) {
this.title = title;
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
if (items == null) {
response.sendError(response.SC_NOT_FOUND, "Missing Items.");
return;
}
PrintWriter out = response.getWriter();
out.println(ServletUtilities.headWithTitle(title)
+ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">"
+ title + "</H1>");
Item item;
for (int i = 0; i < items.length; i++) {
out.println("<HR>");
item = items[i];
// Show error message if subclass lists item ID
// that’s not in the catalog.
if (item == null) {
out.println("<FONT COLOR=\"RED\">" + "Unknown item ID "
+ itemIDs[i] + "</FONT>");
} else {
out.println();
String formURL = "OrderPage";
// Pass URLs that reference own site through encodeURL.
formURL = response.encodeURL(formURL);
out.println("<FORM ACTION=\"" + formURL + "\">\n"
+ "<INPUT TYPE=\"HIDDEN\" NAME=\"itemID\" "
+ " VALUE=\"" + item.getItemID() + "\">\n"
+ "<H2>" + item.getShortDescription() + " ($"
+ item.getCost() + ")</H2>\n"
+ item.getLongDescription() + "\n" + "<P>\n<CENTER>\n"
+ "<INPUT TYPE=\"SUBMIT\" "
+ "VALUE=\"Add to Shopping Cart\">\n"
+ "</CENTER>\n<P>\n</FORM>");
}
}
out.println("<HR>\n</BODY></HTML>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
public class KidsBooksPage extends CatalogPage {
public void init() {
String[] ids = { "lewis001", "alexander001", "rowling001" };
setItems(ids);
setTitle("All-Time Best Children’s Fantasy Books");
}
}
public class TechBooksPage extends CatalogPage {
public void init() {
String[] ids = { "hall001", "hall002" };
setItems(ids);
setTitle("All-Time Best Computer Books");
}
}
公共抽象类CatalogPage扩展了HttpServlet{
私人物品[]项;
私有字符串[]itemIDs;
私有字符串标题;
受保护的无效集合项(字符串[]项ID){
this.itemIDs=itemIDs;
items=新项目[ItemId.length];
}
受保护的无效集合标题(字符串标题){
this.title=标题;
}
@凌驾
受保护的无效数据集(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
response.setContentType(“text/html”);
if(items==null){
response.sendError(response.SC_未找到,“缺少项”);
回来
}
PrintWriter out=response.getWriter();
out.println(ServletUtilities.headWithTitle(title)
+“\n”+”
+标题+“”);
项目;
对于(int i=0;i”);
项目=项目[i];
//如果子类列出项目ID,则显示错误消息
//那不在目录里。
如果(项==null){
out.println(“+”未知项目ID”
+itemIDs[i]+“”);
}否则{
out.println();
字符串formURL=“OrderPage”;
//通过encodeURL传递引用自己站点的URL。
formURL=response.encodeURL(formURL);
out.println(“\n”
+“\n”
+“+项。getShortDescription()+”($”
+item.getCost()+“”\n“
+item.getLongDescription()+“\n”+“\n\n”
+“\n”
+“\n
\n”);
}
}
out.println(“
\n”);
}
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//TODO自动生成的方法存根
doGet(请求、响应);
}
}
公共类KidsBooksPage扩展了CatalogPage{
公共void init(){
字符串[]id={“lewis001”、“alexander001”、“rowling001”};
设置项目(ID);
setTitle(“所有时间最佳儿童幻想书”);
}
}
公共类TechBookPage扩展了CatalogPage{
公共void init(){
字符串[]id={“hall001”,“hall002”};
设置项目(ID);
setTitle(“所有时间最好的计算机书籍”);
}
}
web.xml中的sevlet映射如下所示:
SEVERE: Allocate exception for servlet CatalogPage
java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1149)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
<servlet>
<servlet-name>CatalogPage</servlet-name>
<servlet-class>com.servletcontroller.CatalogPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CatalogPage</servlet-name>
<url-pattern>/CatalogPage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>KidsBooksPage</servlet-name>
<servlet-class>com.servletcontroller.KidsBooksPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KidsBooksPage</servlet-name>
<url-pattern>/KidsBooksPage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TechBooksPage</servlet-name>
<servlet-class>com.servletcontroller.TechBooksPage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TechBooksPage</servlet-name>
<url-pattern>/TechBooksPage</url-pattern>
</servlet-mapping>
目录页
com.servletcontroller.CatalogPage
目录页
/目录页
儿童书页
com.servletcontroller.KidsBooksPage
儿童书页
/儿童书页
TechBooksPage
com.servletcontroller.TechBooksPage
TechBooksPage
/TechBooksPage
请帮助我找到该异常的根本原因。CatalogPage.java是一个抽象类,因此不能以这种方式实例化和显示它。根据的第281页,不应显示,因为“…每个显示页面的代码列出了页面标题和项目标识符…”,这是CatalogPage.java不能做的。因此,唯一的显示页面是KidsBooksPage.java和TechBooksPage.java