Java Web开发笔记 一、常见问题 1.编码问题
1 2 3 4 5 6 7 8 javac -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/demo/Register.java 出现中文乱码。 解决方法: 加 -encoding 编译项,如 -encoding utf8 javac -encoding utf8 -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/demo/Register.java
1 2 3 4 5 6 1.org.gjt.mm.mysql.Driver 连接mysql数据库中文乱码 private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/demodb"; 出现中文乱码,解决方法,添加 ?useUnicode=true&characterEncoding=utf-8,如下: private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/demodb?useUnicode=true&characterEncoding=utf-8";
2.javac编译时提示软件包 xxx 不存在 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1. javac -encoding utf8 -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/dao/IEmpDAO.java 出错提示:./src/cn/stkit/zwy/dao/IEmpDAO.java:6: 软件包 cn.stkit.zwy.vo 不存在 import cn.stkit.zwy.vo.Emp; 解决方法: 编译时加 -classpath 类路径 javac -classpath ./src/ -encoding utf8 -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/dao/IEmpDAO.java 2. javac -classpath "./src/:/Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/lib/commons-io-2.4.jar:/Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/lib/commons-fileupload-1.3.1.jar" -encoding utf8 -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/util/FileUploadTools.java 出错提示: 软件包 javax.servlet.http 不存在 import javax.servlet.http.HttpServletRequest 解决方法: 把tomcat的lib目录下的“servlet-api.jar”加入到classPath中。 javac -classpath "./src/:/usr/local/tomcat/lib/servlet-api.jar:/Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/lib/commons-io-2.4.jar:/Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/lib/commons-fileupload-1.3.1.jar" -encoding utf8 -d ./WebRoot/WEB-INF/classes/ ./src/cn/stkit/zwy/util/FileUploadTools.java
3.java命令运行程序时,提示java.lang.NoClassDefFoundError 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 java cn.stkit.zwy.dao.test.TestDAOInsert 提示:Exception in thread "main" java.lang.NoClassDefFoundError: cn/stkit/zwy/dao/test/TestDAOInsert 解决方案: 方法1、进入 “cn.stkit.zwy.dao.test.TestDAOInsert” 所在目录,cd /Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/classes 再执行:java cn.stkit.zwy.dao.test.TestDAOInsert 方法2: 加 -classpath java -classpath /Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/classes/ cn.stkit.zwy.dao.test.TestDAOInsert 扩展,-classpath (-cp)运行时临时指定多个路径 java -cp ".:/Users/zxsoft/USVN/Java/demo/WebRoot/WEB-INF/lib/mysql-connector-java-5.1.33-bin.jar" cn.stkit.zwy.dao.test.TestDAOInsert 如上解决了:java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver 问题 其他提示: 1. 不含包层次的HelloWorld.java public class HelloWorld { public static void main(String args[]){ System.out.println("Hello World!"); } } 保存在/home/javatest/下,使用javac命令编译: javac HelloWorld.java 过行:java HelloWorld 2.包含包层次的HelloWorld.java package cn.stkit.demo; public class HelloWorld { public static void main(String args[]){ System.out.println("Hello World!"); } } 保存在/home/javatest/下。 编译时有两种方法: 2.1) 直接编译: javac HelloWorld.java 此时在当前目录下输出HelloWorld.class。此时,运行不能使用上面相同的方法,如果使用了:java HelloWorld 运行时,会出现如下错误: Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: cn/stkit/demo/HelloWorld) 从上述错误信息可以看到,系统可以找到HelloWorld类(因为当前路径包含在CLASSPATH中),但这个类属于cn.stkit.demo包。所以,要做的就是按照上述包层次,相应的创建目录层次,把上面生成的HelloWorld.class放到/home/javatest/cn/stkit/demo/目录下。HelloWorld.java在/home/javatest/目录下。运行: java cn.stkit.demo.HelloWorld 注意:这儿要注意的是,不能使用java cn\stkit\demo\HelloWorld来运行,此时同样会出现上面的错误。 2.2) 使用 -d <directory>编译选项 使用-d <directory>编译选项在当前路径(或任意指定的路径)下生成包层次。 javac -d . HelloWorld.java 此时,在当前目录(/home/javatest/)下就生成了一个cn/stkit/demo目录(/home/javatest/cn/stkit/demo),并且输出的.class文件也在里面。运行: java org.myorg.HelloWorld
4.web.xml中,listener, filter, servlet加载顺序
加载配置顺序:listener, filter, servlet
Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContextListener初始化)比Servlet和Filter都优先,而销毁比Servlet和Filter都慢。
web.xml 的加载顺序是:context-param -> listener -> filter -> servlet
加载顺序与它们在 web.xml 文件中的先后顺序无关。
5. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 1 2 3 修改 workspace/.metadata/.plugins/org.eclipse.wst.server.core/servers.xml 把其中的start-timeout="45" 改为 start-timeout="100" 或者更长。 最后重启eclipse就可以了。
二、常用命令 1、jar命令
1 2 3 4 5 jar -cvf wordcount.jar -C WordCount/ . 将当前目录下的 WordCount目录下的所有文件(通常是.class文件)打包生成 wordcount.jar 文件,并放在当前目录下。 jar -cvf classes.jar Foo.class Bar.class 将两个类文件归档到一个名为 classes.jar 的归档文件中。
三、web.xml 配置中classpath: 与classpath*:的区别?
启动tomcat后出现红色警告:[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.js ….’ did not find a matching property 问题?
这是因为我们在eclipse下,通过tomcat部署web工程时,tomcat的配置文件server.xml中会自动生成一个关于该web工程的配置信息,类似于下面的东西:
`<Context docBase="webPoject" path="/stkit" reloadable="true" source="org.eclipse.jst.jee.server:stkit"/>`
而默认情况下,server.xml的 Context元素不支持名称为source的属性,所以会发出警告。
解决办法是:关闭tomcat,双击eclipse下tomcat服务器,在出来的Tomcat server at localhost页面中找到server options选项,选中其中的选项”Publish modual contexts to separat XML files“,ctr+s,启动tomcat。
asm(spring-asm-3.1.4.RELEASE.jar)导致的org.springframework.beans.factory.BeanDefinitionStoreException错误。 五月 21, 2015 7:02:05 下午 org.springframework.web.servlet.DispatcherServlet initServletBean
严重: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/usr/local/tomcat/webapps/STKIT/WEB-INF/classes/cn/stkit/web/cp/LoginController.class]; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
aused by: java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
at java.lang.ClassLoader.defineClass1(Native Method)