周一
接着半拉子半死不活的投票系统,继续孤军奋战于无人境界。我的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"),才可以正确显示中文。