周一
接着半拉子半死不活的投票系统,继续孤军奋战于无人境界。我的PL头儿就没见着鬼影,大好的周一,不来上班。谁让人牛呢。
javax.servlet.ServletException: org/apache/jsp/testjsp_jsp (wrong name: org/apache/jsp/TestJSP_jsp) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:244) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NoClassDefFoundError: org/apache/jsp/testjsp_jsp (wrong name: org/apache/jsp/TestJSP_jsp) java.lang.ClassLoader.defineClass1(Native Method)
这个错误,调了一个小时都没用。服务器Tomcat已经被我关开疯了。于是,我换了一下思路,开始琢磨servlet起作用的机制。
首先右键点我的电脑。打开属性。然后选择
“
高级
”
里面的
“
环境变量
”
,在新的打开界面中的系统变量里需要设置三个属性
“java_home”
、
“path”
、
“classpath”,
其中在没安装过
jdk
的环境下,
path
属性是本来存在的。而
java_home
和
classpath
是不存在的。
首先点
“
新建
”
,然后在变量名写上
java_home
,顾名其意该变量的含义就是
java
的安装路径,呵呵,然后在变量值写入刚才安装的路径
“E:\Java\jdk1.6.0_02”
;
其次在系统变量里面找到 path ,然后点编辑, path 变量的含义就是系统在任何路径下都可以识别。打开该变量时,会发现其 “ 变量值 ” 后面的文本框中已经有了内容,我们不要删除这些内容,而是按 “End” ,定位到该文本框的末尾,如果末尾有一个分号 “;” ,就直接添加 JAVA 命令所在的路径,如果没有分号,则需要添加一个分号后再添加 JAVA 命令的路径 ——java 命令的路径是 “%java_home%\bin;%java_home%\jre\bin”( 其中 “%java_home%” 的意思为刚才设置 java_home 的值),也可以直接写上 “E:\Java\jdk1.6.0_02” ;
最后再点 “ 新建 ” ,然后在变量名上写 classpath, 该变量的含义是为 java 加载类 (class or lib) 路径,只有类在 classpath 中, java 命令才能识别,其值为 “.;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar ( 要加 . 表示当前路径 )” ,与 “%java_home%” 有相同意思。
-----------------------事实证明,貌似没用-----------------------------------------
1.
到
Tomcat
的安装目录的
webapps
目录,可以看到
ROOT
,
examples, tomcat-docs
之类
Tomcat
自带的的目录;
2.
在
webapps
目录下新建一个目录,起名叫
myapp
;
3.myapp
下新建一个目录
WEB-INF
,注意,目录名称是区分大小写的;
4.WEB-INF
下新建一个文件
web.xml
,内容如下:
<?
xml
version
=
"1.0"
encoding
=
"ISO-8859-1"?
>
<
display-name
>
My Web Application
</
display-name
>
</ web-app > |
在我的电脑
->
属性
->
高级
->
环境变量
->
系统变量中添加以下环境变量
(
假定你的
tomcat
安装在
e:\tomcat
):
CATALINA_HOME
:
c:\tomcat
CATALINA_BASE
:
c:\tomcat
TOMCAT_HOME: c:\tomcat
如果是第一次设置
tomcat
的环境变量,上面的这三个变量都是没有的,因此都需要
“
新建
”
,以第一个变量为例:点击
“
新建
”,
输入变量名为
CATALINA_HOME
,输入变量值为
c:\tomcat
。
然后修改环境变量中的 classpath (这一步与上面 jdk 相关联,这里的 classpath 变量便是上面在安装 jdk 时所创建的环境变量):把 tomat 安装目录下的 common\lib 下的 servlet.jar 追加到 classpath 中去,修改后的 classpath 如 下: classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib \tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar (注意:末尾最好别加分号) 注意:双击打开 classpath 变量时,其值为 jdk 的相关值,即:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar ,现在要追加 tomcat 的该变量值,需要先 在末尾添加一个分号 ( 如果末尾有分号,就不必添加了 ) ,然后再添加 tomcat 的值: %CATALINA_HOME%\common\lib\servlet-api.jar 。
--------------------------------依然没用!!--------------------------------------
5. 在 myapp 下新建一个测试的 jsp 页面,文件名为 index.jsp ,文件内容如下:
< html > < body >
<
center
>
</ body > </ html > |
6.
重启
Tomcat
7.
打开浏览器,输入
http://localhost:8080/myapp/index.jsp
看到当前时间的话说明就成功了。
8. 如果在这一步出现如下错误:
exception
javax.servlet.ServletException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver
那 就检查一下 Tomcat/lib 下是否已经有 el-api.jar el-ri.jar 两个 jar 文件,没有则拷贝到此目录下。重启 Eclipse 测试;同时,如果机器上已经有 Eclipse ,又安装 MyEclipse , MyEclipse 会自动查找 jre, 他首先检测到的是 C:\Program Files\Java ( jdk 安装目录)中的 jre ,而不是 C:\Program Files\Java\jdk1.5.0_06 中的 jre ,原先的 Eclipse 的 jre 也随之改动(解决方法 (Eclipse 为例, MyEclipse 类似 )window->preferences->Java->Installed JRES->Edit-> 更改 jre home 为 C:\Program Files\Java\jdk1.5.0_06 );如果还不行,就将 el-api.jar 包也添加到 classpath 环境变量中去。 如 果这样还不行,就再参考一下这一段:原 因:在 Eclipse 的 Windows -->> Preference -->>Tomcat 设置 Tomcat Home 路径后,又在 Tomcat 的 Advanced 选中设置了相同的 Tomcat Base 路径,关键一步是 Advanced 下有项: Add Java projects to tomcat classpath ,勾上所选项目之后,才可以正常的引起 javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver
解决办法:从哪里勾上的,就从哪里勾回去,把 Add Java projects to tomcat classpath 勾掉。 如 果上面的方法都不行,那就只好出一个必杀招了 —— 卸载安装好的 jdk 、 tomcat 和 eclipse ,并清除 jdk 和 tomcat 的环境变量,然后重新安 装一遍 jdk 、 tomcat 和 eclipse ,并设置 jdk 和 tomcat 的环境变量。可能是我这个人比较搓,我每次将我在公司做好的项目拷回来研究时, 总是会出现这样的错误,并且每次无论怎样搞, tomcat 依然会报 “ java.lang.NoClassDefFoundError: javax/el/ELResolver ” 的错误,最后终于恨下心来,专门花了一个星期的时间来研究解决之道,最后才想出了这个 “ 先毁灭再重建 ” 的不是办法的办法,并且每一次都屡试不爽!
这是另一个高手写的,可这并不是我的问题,我原来投票系统致命的问题是,不能唤醒和调用httpservice服务,所以我就在tomcat环境下,配合jdk1.5,看这个javax.servlet.ServletException是否运作,可是问题却僵持在了永久的http404 ***.jsp不是可调用的问题上,服务器找不到文件!!这么简单,可是就是没调出来。
----------------害的我差点冲动要重装所有软件,还好,我挺住了所有冲动\!!!!----------
5
第四步——建立自己的
Servlet
紧接上面第三节中的第三步“建立自己的
jsp app
目录
”,接下来写入你的第一个
Servlet:
在你新建的
Application
myapp/WEB-INF/classes
/test
目录下新建
HelloWorld.java
package test;
import
java
.
io
.*;
|
然后照样用
javac HelloWorld.java
来编译这个文件,如果出现无法
import javax.servlet.*
那么就是应该把
C:\Tomcat\common\lib
里面的
servlet-api.jar
文件拷贝到
C:\JDK\jre\lib\ext
中,再次编译,就没有问题了!
然后在
Tomcat
目录里面的
C:\Tomcat\webapps\myapp
里面按如下的文件结构:
myapp\index.jsp
myapp\WEB-INF\classes\
test
\HelloWorld.class(
把上面生成的
HelloWorld.class
文件放在这个里面
)
Servlet
必须使用
C:\Tomcat\webapps\myapp\WEB-INF
这个目录下面的
web.xml
文件进行注册,
用
EditPlus
打开这个
web.xml
文件,
在
<web-app></web-app>
添加下面这段程序
:
<
servlet
>
|
为什么呢? 因为这样的结构
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>
test
.HelloWorld</servlet-class>//
类的路径
</servlet>
表示指定包含的 servlet 类,而以下的结构
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
表示指定 HelloServlet 应当映射到哪一种 URL 模式。在修改 web.xml 完毕过后,重新启动 Server ,然后再输入 http://localhost:8080/myapp/HelloWorld , ,那么偌大一个 Hello,World! 等着你呢,恭喜你 !
第五步 :建立自己 java Bean
1. 在你新建的 Application myapp/WEB-INF/classes /test 目录下新建 TestBean.java
package
test
;
|
然后照样用 javac TestBean.java 来编译这个文件。
2. 然后在你新建的应用程序目录 myapp 下新建一个新的 jsp 文件: testBean.jsp
<%@
page
import
=
"test.TestBean"
%>
|
好了,确定各个文件的位置:
myapp\index
.
jsp
|
3. 重启 Tomcat 如果需要的话,在浏览器输入 : http://localhost:8080/myapp/testBean.jsp 幸运的话就会看到 :
Java Bean Test: The author's blog address isHttp://yexin218.cublog.cn
这样就完成了整个 Tomcat 下的 jsp 、 servlet 和 javabean 的配置。
如果路径没有问题的话你看下你的目录下是不是有这个文件:/WEB-INF/web.xml
如果没有的话去到别的目录中拷一个过来,比如webdav目录下就有一个。
这时重新起动TOMCAT,就OK了。我也是在网上搞了半天,说这说那个都没不实用,我就发这个最有用。你试试看。我懒人只会懒方法!
我看了这句,于是,在web.xml里附加了这句话
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>My Web Application</display-name> <description> A application for test. </description> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>test.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
重新启动了一下服务器,然后,不可思议的是,全好了!!!!!!!!!!!!!!!!!!!!
要servlet有servlet的反应,要目标地址**.jsp有那个文件的反应。
---------------------------------我问题最终解决的方法居然是-------------------------------------------------------
我组长从隔壁拉来一个高手,启动服务器又关闭服务器,,若干类似,程序级错误,其实是后来又导进去的el-api.jar包放在tomcat/common/lib下即可,而我又再次附加在了eclipse/windows/properties/installed jres/,我这样一来,就给程序duplicate,多重载了一次。然后就删掉了,删掉以后,就好了。。。
很不服气啊。原本差不多了已经。
但是高手也教给我一点东西:编译JSP,java的包,放在tomcat下的包中。因为这个时候,才能编译通过,而不是放在eclipse下面的包。eclipse下面,又服务器servers这一个关键的项目,就放的是你要用来编译的服务器tomcat!!!!
而弄好的原因,我琢磨:
少放了el-api.jar,servlet-api.jar包在服务器上,所以,它当然没法调用httpservice喽。。
所以高手一进门就预言的的确是对的:
这个错误,就是httpservice错误,应该是配置错误,缺少相应的jar 包!!
唉,我服了,心服口服。
---------------------------------------------------问题远远没有结束-----------------------------------------------------------
最后提交,寥寥几个字,我的心:提交错误,一遍又一遍的提交错误!!
折腾了一天没找到错误,还去琢磨断点怎么设置,后来的后来的后来,我无意中发现了,在run on server的时候,下面有输出的所有信息,原来,作者就怕像我这样的 小辈弄不懂,所以,故意,搞了一系列最关键的类似于:
System.out.println(strSql);
的检查语句,可以检测程序的运行程度。我的菜真让自己见笑,昨个还忙活着要去弄什么断点,全都写好了已经。
拿到NAVICAT上直接调试,发现,在插入时候,问题四的字段varchar(11),白天(上午9:00至下午16:00),根本不止。我猜测应该是提取什么吧,否则,怎么会这么点长度,接着研究,反正我改成50就好了,可是插进去的全是??(??18:30???21:00),乱码。。但最起码,图形已经弄出来了,看着自动生成的所有饼状图,心里还是着实安慰了不少。。
解决方法:
url = "jdbc:mysql://localhost/flexvote?autoReconnect=true&UseUnicode=true&characterEncoding=UTF-8";
在数据库连接的时候采用的这个utf-8方法
插入数据的时候:
<%@ page contentType="text/html; charset=utf-8" import="java.sql.*"%>
contronldb.SetVote_Question4(new String(request.getParameter("Question4").getBytes("ISO8859-1"), "UTF-8"));
这是我随便换着调试做出来的正确结果。仔细一看,是这样的:
四、数据库连接方式使用UTF-8编码
JSP中要把网页输入的中文存入数据库,通常有一个提交(Submit)的过程,是用str=request.getParameter("username"),然后执行update或者insert语句来存入数据库。如何赋值给str很重要,而且这里中文输入与网页所使用的字体编码有关。
1、 网页使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),都可以使得存到数据库里的数据是UTF-8编码。
2. 网页使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那么存入数据库的是UTF-8编码。
3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。
相关:
一、数据库连接方式使用UTF-8
在连接数据库的驱动后面加上这句参数useUnicode=true&characterEncoding=
UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=
true&characterEncoding=UTF-8,从数据库里读出中文显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")来显示正确的中文。值得注意的是如果页面使用UTF-8,数据库里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正确显示中文。如果网页是UTF-8,而数据库里存放的是GBK,无法直接显示中文,需要2步转换, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正确显示中文。