接着琢磨之前的投票

周一

接着半拉子半死不活的投票系统,继续孤军奋战于无人境界。我的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_homeclasspath是不存在的。
    
首先点新建,然后在变量名写上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目录,可以看到ROOTexamples, 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_HOMEc:\tomcat
  CATALINA_BASEc:\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,又安装 MyEclipseMyEclipse会自动查找jre,他首先检测到的是C:\Program Files\Javajdk安装目录)中的jre,而不是C:\Program Files\Java\jdk1.5.0_06中的jre,原先的Eclipsejre也随之改动(解决方法(Eclipse为例,MyEclipse 类似)window->preferences->Java->Installed JRES->Edit->更改jre homeC:\Program Files\Java\jdk1.5.0_06);如果还不行,就将el-api.jar包也添加到classpath环境变量中去。如 果这样还不行,就再参考一下这一段:原 因:在EclipseWindows -->> Preference  -->>Tomcat 设置Tomcat Home路径后,又在TomcatAdvanced选中设置了相同的Tomcat Base路径,关键一步是Advanced下有项:Add Java projects to tomcat classpath,勾上所选项目之后,才可以正常的引起javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver 

解决办法:从哪里勾上的,就从哪里勾回去,把Add Java projects to tomcat classpath勾掉。 果上面的方法都不行,那就只好出一个必杀招了——卸载安装好的jdktomcateclipse,并清除jdktomcat的环境变量,然后重新安 装一遍jdktomcateclipse,并设置jdktomcat的环境变量。可能是我这个人比较搓,我每次将我在公司做好的项目拷回来研究时, 总是会出现这样的错误,并且每次无论怎样搞,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下的jspservletjavabean的配置。

 

 如果路径没有问题的话你看下你的目录下是不是有这个文件:/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"),才可以正确显示中文。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值