Javabean——“helloworld”级别的应用

本文章对应于《轻量级JavaEE企业应用实战(第四版)》——Struts2+Spring4+Hibernate整合开发 李刚编著

(其实我也初心者,把遇到的不起眼问题整理解决之后po出来,有助于跟我一样的初心者快速学习JSP/Servlet)

在几天之前,我快乐的学习Javabean的第一个应用的时候,按照本书的第79页,写程序。按照书中所说,一步一步来进行。首先我看到了书中79页jsp清单和80页Person类的清单,其题目分别是codes\02\2.5\directive\beanTest.jsp和codes\02\2.5\directive\WEB-INF\src\lee\Person.java。唔我知道了些什么:大概就是在webapps下有N多层文件,最终有个叫做directive的文件夹,里面有两个分别叫做beanTest.jsp和WEB-INF的文件或文件夹。其中WEB-INF里还有子文件夹,这些在本书前些内容里也提到过文件夹的用处。好了,我为了简便,就直接在webDemo下建立项目,以下就是我建立的文件目录:
webapps:
    └webDemo
        └directive:
            ├WEB-INF:
            │   ├classes:
            │   ├lib:
            │   ├src:
            │   │   └lee:
            │   │       └Person.java
            │   └web.xml
            └beanTest.jsp

好,有了目录之后就好说了,照着书上搬程序吧。
以下为我测试的代码:
beanTest.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <jsp:useBean id="p1" class="lee.Person" scope="page"/>
    <jsp:setProperty name="p1" property="name" value="ZZU"/>    
    <jsp:setProperty name="p1" property="age" value="32"/>
    <jsp:getProperty name="p1" property="name"/><br/>
    <jsp:getProperty name="p1" property="age"/><br/>
  </body>
</html>

Person.java

public class Person{
        private String name;
        private int age;
        public Person(){
            }
        public Person(String name,int age){
                this.name = name;
                this.age = age;
            }
        public void setName(String name){
                this.name = name;
            }
        public String getName(){
                return this.name;
            }
        public void setAge(int age){
                this.age = age;
            }
        public int getAge(){
                return this.age;
            }
    }

web.xml就不贴了,基本是块骨头,没肉。

接下来我就进入的测试阶段。按照书中所说,先用javac编译Person.java文件,生成Person类,放在classes路径下。之后就打开tomcat的开始运行测试,发现抛出异常了,也就是java.lang.NoClassDefFoundError: lee/Person (wrong name: Person)这样的异常。回头检查代码发现,在jsp页面中body体内,引用类用的是这样的一个东西class=“lee.Person”。诶呦,这点东西当然难不倒我啦,肯定是这样的:在class文件下的还有个文件夹叫做lee,然后里面放的是Person.class文件。这样肯定没错啦。嘿嘿嘿~~~之后才是最可怕的事,竟然还是这样的异常错误>,< 黑人问号.jpg。

why,再想想问题。不管了我在所有的文件夹下面都放好Person.class文件,我就不行它找不到。结果不出所料依然是异常,难死了,摔书。之后就是各种查论坛,各种逛blog。然后发现大家很多都是在myeclipse中建立项目解决的这个问题的。好,那这样我也用myeclipse试试吧。当我试过之后,给出了书中的结果。嗯。是的,运行成功了。

成功之后要找原因啊,我把myeclipse中生成的工程目录和自己建的目录对比,确实没发现问题啊。现在我已经是指数次幂懵逼了 = =什么东西好诡异啊。之后我又新建了项目,把myeclipse中生成的东西一项一项的移到新的项目中,OK,依然成功。我心想,myeclispe果然牛V啊,myeclispe大法好啊,文件自带success BUFF。然后我还是郁闷啊,为什么呢,到底为什么呢。突然灵光乍现,想到成功和失败的不同的地方。

**好了,接下来是干货**

我实验测试的不同的地方在于,myeclipse中生成的项目是直接建立在tomcat内webapps下的,而我按照书中手动建立的项目是在tomcat内webapps里一个叫做directive的文件下。会不会是这样的原因,tomcat在执行操作时,查找类文件的时候是查找webapps下项目里第一个classes文件内的类文件,而不是运行项目相应的classes内的类文件。或许我这样说不太清楚,接下来我上目录。

第一个是myeclipse下生成的项目路径内文件,以webapps开始:
webapps:
    └beanTest:
        ├WEB-INF:
        │   ├classes:
        │   │   └lee:
        │   │       └Person.class
        │   ├lib:
        │   └web.xml
        └beanTest.jsp
第二个是手动建立按照书中要求推断的项目路径文件,以webapps开始:
webapps:
    └webDemo
        ├directive:
        │   ├WEB-INF:
        │   │   ├classes:
        │   │   ├lib:
        │   │   ├src:
        │   │   │   └lee:
        │   │   │       └Person.java
        │   │   └web.xml
        │   └beanTest.jsp
        ├WEB-INF:
        │   ├classes:
        │   ├lib:
        │   ├src:
        │   └web.xml
        └XXX.jsp
此时,我在运行手动建立的项目时,即在浏览器内输入这样的地址localhost:8080//webDemo/directive/beanTest.jsp时,Tomcat应该是从webDemo下的WEB-INF内的classes检索Person.class类文件,而不是从directive下的WEB-INF检索。当我检验时,把Person.class类文件放入webDemo下的WEB-INF内的classes时,再次运行,就变得正常了。
**好了,干货结束**
= =我擦,这也太反人类了吧,不在项目内检索,非要跑到父文件下检索。也可能是我这样的新手对Tomcat的运行机制不太了解,才出现这样的问题吧。

最后感叹一句,tomcat真是一只顽皮的小猫啊~~~~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章