接着琢磨之前的投票

系统 1347 0

周一

接着半拉子半死不活的投票系统,继续孤军奋战于无人境界。我的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"? >

< !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 >

</ 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 >
    Now time is: <%= new java . util . Date ()%>
</ 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 .*;
  import javax . servlet .*;
  import javax . servlet . http .*;
  public class HelloWorld extends HttpServlet
   {
     public void doGet ( HttpServletRequest request , HttpServletResponse response ) th
rows ServletException , IOException
    {
    response . setContentType ( "text/html" );
     PrintWriter out = response . getWriter ();
    out . println ( "<html><head><title>" );
    out . println ( "This is my first Servlet" );
    out . println ( "</title></head><body>" );
    out . println ( "<h1>Hello,World!</h1>" );
    out . println ( "</body></html>" );
   
    }
    }

   然后照样用 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 - 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 >

      为什么呢? 因为这样的结构

   <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 ;
public class TestBean
{
     private String name = null ;
     public TestBean ( String nameInit ){
         this . name = nameInit ;
     }
     public void setName ( String newName ){
         this . name = newName ;
     }
     public String getName (){
         return this . name ;
     }
}

     然后照样用 javac TestBean.java 来编译这个文件。

    2. 然后在你新建的应用程序目录 myapp 下新建一个新的 jsp 文件: testBean.jsp

 

<%@ page import = "test.TestBean" %>
< html >
< head >
< title > Test Bean </ title >
</ head >
< body >
< center >
<%
   TestBean testBean = new TestBean ( "Http://yexin218.cublog.cn" );
  %>
Java Bean Test:
    The author's blog address is <%=testBean.getName()%>
</center>
</body>
</html>

     好了,确定各个文件的位置:

 

myapp\index . jsp
myapp\testBean . jsp
myapp\WEB - INF\web . xml
myapp\WEB - INF\classes\test\HelloWorld . class
myapp\WEB - INF\classes\test\TestBean . class

    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"),才可以正确显示中文。

 

 

 

接着琢磨之前的投票


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论