1、北 京 林 业 大 学Java 高级应用 实验常见问题及解决课程名称: Java 高级应用技术 任课教师: 田萱 实验题目: 基于 Servlet 的动态 Web 网站的开发和运行 实验环境:Eclipse 3.5 For Java EE, Tomcat6.0, JRE 6.0,Java EE 5 目录目录 1致谢: 1问题 1:导入 ServletTest.war 等包时项目左侧出现一系列红叉叉错误 2问题 2:启动 Eclipse 时,弹出“JVM terminated Exit code=-1”等提示的窗口 .2问题 3:用 forward 函数实现页面跳转时出现乱码页面 .3问题 4:
2、无法获取提交表单上传文件的文件名和文件内容 .3问题 5:通过 MultipartRequest 对象读取表单元素顺序混乱 .4问题 6:通过 MultipartRequest 对象不能获取 radio 或 checkbox 表单元素 4问题 7:cookie 内容为中文的情况下添加和读取 cookie 出现错误 .4问题 8:读取客户端 cookie 时出现 NonePointerException 错误 5问题 9:通过 MultipartRequest 对象读取上传的较大文件时出现 IOException 错误 .5问题 10:Eclipse 中启动 Tomcat 服务时出现 “8080
3、 等端口号已被占用” 的错误提示 .5问题 11:浏览器中运行 http:/localhost:2008/ServletTest/项目出错 .6致谢:感谢以下同学发现问题并提供了解决问题的办法。问题 2计算机 07-3 胡伟松问题 6计算机 07-4 张晓武问题 7计算机 07-3 刘彦强问题 3,8,9计算机 07-3 宋天已问题 1:导入 ServletTest.war 等包时项目左侧出现一系列红叉叉错误原因:导入的项目构建路径中缺乏 Tomcat 运行库。解决办法:英文:选中项目右键 Build pathConfigure Build Path选择 library 标签点按“Add Li
4、brary”按钮选择“Server Runtime”选择“Tomcat7.0”完成。中文:选中项目右键 构建路径 库Web 应用程序库选择“添加库”服务器运行时 Tomcat6.0完成。问题 2:启动 Eclipse 时,弹出“JVM terminated Exit code=-1”等提示的窗口原因:计算机内存空间不能够分配足够的空间给 heap(堆:Java 中管理内存的结构称作堆。 )解决办法:打开 eclipse 安装目录下的 eclipse.ini 配置文件,其内容如下,-startupplugins/org.eclipse.equinox.launcher_1.0.200.v2009
5、0520.jar-launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519-productorg.eclipse.epp.package.jee.product-launcher.XXMaxPermSize256M-showsplashorg.eclipse.platform-launcher.XXMaxPermSize256m-vmargs-Dosgi.requiredJavaVersion=1.5-Xms40m-Xmx512m把其中的“Xmx512m” 改成“Xmx256m”
6、问题 3:用 forward 函数实现页面跳转时出现乱码页面原因:在跳转函数 forward 之前有 PrintWriter out = response.getWriter();语句,会使得转发的页面出现乱码解决办法:采用 response.sendRedirect(“.”); 代替掉以下跳转语句RequestDispatcher rs=request.getRequestDispatcher(“);rs.forward(request, response);或者 注意调整程序结构,不要 forward 语句和 response.getWriter()把放置在同一个语句块中。例如:If()
7、PrintWriter out = response.getWriter(); Else RequestDispatcher rd=request.getRequestDispatcher(“login.html“);rd.forward(request, response); 问题 4:无法获取提交表单上传文件的文件名和文件内容原因:当提交表单中含有上传文件元素时,必须指定 form 的 ENCTYPE=“multipart/form-data“,这意味着是以二进制数据流的形式把表单信息上传到 Web 服务器。而 Servlet 文件中的 request 对象是很难分析出二进制数据流。解决办
8、法:使用第三方类库 cos.jar 包中提供的专门处理二进制数据流的 MultpartRequest 对象。它基本可以取代request 对象,分析出上传表单的各个元素,特别是上传文件的基本信息。/指明把文件上传至服务器的 c:下MultipartRequest request1=new MultipartRequest(request, “c:“); /通过以下循环可以获得上传多个文件的文件名 sysname/实验中只有一个一个照片文件,所以可以通过 filelocation=“c:“+sysname;可以获得上传文件的具体位置和名称String filelocation=null;Stri
9、ng sysname=null; Enumeration files = request1.getFileNames();while(files.hasMoreElements()String name = (String)files.nextElement();sysname = request1.getFilesystemName(name); /获得文件名称 filelocation=“c:“+sysname; /获得/ 文件在服务器上的存储地址问题 5:通过 MultipartRequest 对象读取表单元素顺序混乱原因:MultipartRequest request1=new Mu
10、ltipartRequest(request, “c:“);Enumeration paramNames = request1.getParameterNames();while(paramNames.hasMoreElements() 在上述代码中,MultipartRequest 对象分析表单传入的二进制数据流时,分析顺序不固定,针对表单元素名称为中文和英文的情况尤其是不同。这是第三方提供的插件不够标准造成的。解决方法:不再使用上面的循环方式,而是使用 request1.getParameterName()函数依次获得指定名称的表单元素;或者使用 Request 对象可以顺序读出表单元素,
11、但对带有文件上传元素的表单难以处理;或者换用其它的第三方组件。问题 6:通过 MultipartRequest 对象不能获取 radio 或 checkbox表单元素原因:MultipartRequest request1=new MultipartRequest(request, “c:“);Enumeration paramNames = request1.getParameterNames();while(paramNames.hasMoreElements() 在上述代码中,像 radio 或者 checkbox 这种需要用户点选的表单元素,当元素缺失用户点选时(即为 null 的情况
12、,其默认值也为空) ,使用 MultipartRequest 对象的 getParameterNames()方法就不能获取到这两个表单元素的名称和内容(null)。解决方法:需要通过 MultipartRequest 对象的 getParameter()函数对 radio 或者 checkbox 这种需要用户点选的表单元素进行单独获取和处理,例如代码如下:String sex=request1.getParameter(“sex”);nullandblank=JustifyAndFilter.isParameterNull(sex);/判断是否为空或if(nullandblank) *(缺失的
13、处理) 进一步的问题是,即使 radio 或者 checkbox 已有选取项,但可能读出来的仍然是 null。原因在于表单中 radio 或者 checkbox 元素的名称被用中文标示,例如 name=“性别”。这导致 MultipartRequest 对象无法正确获取表单元素的值。因此建议尽量使用通用语言即英语作为传递数值的变量显然要比中文更加方便和安全。问题 7:cookie 内容为中文的情况下添加和读取 cookie 出现错误原因:出现 java.lang.IllegalArgumentException: Control character in cookie value, consi
14、der BASE64 encoding your value 的错误提示,表示不能把中文字符作为 cookie 内容添加到浏览器端。解决方法:为预防可能放入 cookie 的值为中文,在创建 cookie 或设置 cookie 内容时,需要进行编码,即把中文编码为 UTF-8。例如:创建 cookie, Cookie usernameCookie = new Cookie(“c-username“, URLEncoder.encode(request.getParameter(“username“),“utf-8“);设置一个名为 c 的 cookie 内容属性, c.setValue(URL
15、Encoder.encode(cvalue,“utf-8“);同样的,要读取出 Cookie 中的中文含义时,需要先对 cookie 的内容进行解码,例如,读取一个名为 c 的 cookie 内容属性, username=URLDecoder.decode(c.getValue(),“UTF-8“);最后需要注意,在使用 URLEncoder 和 URLDecoder 的静态方法之前要把这两个类引入程序中,即import .URLDecoder;import .URLEncoder;问题 8:读取客户端 cookie 时出现 NonePointerException 错误原因:当客户端没有任何
16、 cookie 时,Cookie co=request.getCookies();的结果就是 co 为 null。所以下面使用co 的长度进行循环读取每个 cookie 时,就会出现 NonePointerException 错误。解决方法:从客户端读取 cookie 时,首先要判断 Cookie co=request.getCookies();的结果是否是 null,若是则说明没有任何 Cookie。这时就需要跳过通过 co 的长度依次读取每个 cookie 的步骤。问题 9:通过 MultipartRequest 对象读取上传的较大文件时出现IOException 错误原因:使用 Mult
17、ipartRequest 的 MultipartRequest(HttpServletRequest request, String saveDirectory) 这个构造方法默认上传文件得最大大小为 1048576,即 1M。所以会产生 java.io.IOException: Posted content length of 2405670 exceeds limit of 1048576 异常,但是当传送较小尺寸的文件时,没有此异常。解决方法:建议使用另一个构造方法 MultipartRequest(HttpServletRequest request, String saveDirec
18、tory, int maxPostSize) ,把参数 int maxPostSize 设置成 10*1024*1024。因为一般上传的图片文件不会超过这个大小,就不会出现 IOException。问题 10:Eclipse 中启动 Tomcat 服务时出现 “8080 等端口号已被占用” 的错误提示原因:Window 中已有其它进程启动占用了 Tomcat 服务需要的端口号。解决方法有 2 种:1. 直接更换 Tomcat 的端口,操作如下修改Tomcat的配置,用记事本工具打开Tomcat配置文件Tomcat7.0根目录下 confserver.xml1)为避免常见的端口冲突问题,修改发布
19、端口号为2008(Tomcat默认为8080)原代码为:修改后:2)在 eclipse 的 server 窗口中删除已有的 tomcat 服务,重新 new 一个新的 Tomcat 服务。2. 或者也可以按以下步骤进行检查:1) 打开 Window 的任务管理器选择进程标签 查看里面有没有运行的 javaw.exe 进程和tomcat6.exe 进程 如果有的话,就选择该进程,右键 选择“结束进程”2) 重新再 Eclipse 中启动 Tomcat 服务。若仍然出现 “8080 等端口号已被占用” 的错误提示,继续下面的第 3)步,进行手工检查。3) 根据提示的端口号(假如我们需要确定谁占用了
20、 8080 端口) ,依次进行下面的检查。a) Window 开始菜单 选择“运行” 输入“cmd”回车,即打开了在 windows 命令行窗口b) 在 windows 命令行窗口的提示符下输入 netstat -aon|findstr “8080“ ,显示TCP 127.0.0.1:80 0.0.0.0:0 LISTENING 2448这意味着端口 8080 被进程号为 2448 的进程占用,继续执行下面命令:c) 在 windows 命令行窗口的提示符下输入 tasklist|findstr “2448“ thread.exe 2016 Console 0 16,064 K这意味着端口 8
21、080 被名为 thread.exe 的进程占用着d) 打开任务管理器,找到 PID 为 2448 的进程或进程名称为“thread.exe”的进程,右键选择“结束进程” 。 (若任务管理器中没有 PID 这一项,可以在任务管理器中选“ 查看“-“选择列“在 PID 选框前打对勾即可)e) 如果需要查看其他端口。把 8080 改掉即可问题 11:浏览器中运行 http:/localhost:2008/ServletTest/项目出错原因:一个项目 http:/localhost:2008/ServletTest/在浏览器中无法打开运行的原因是 URL 中没有指名具体的页面或 Servlet 地
22、址,例如应该是 http:/localhost:2008/ServletTest/index.xml解决方法:1) 在 Web 项目之后加上具体文件的名称2) 有的项目在浏览器中输入 http:/localhost:2008/ServletTest/就可以打开一个页面的原因是在该项目的 web.xml 文件中的 welcome-file-list 中已经加上了一些默认打开的文件,这些默认文件是该项目自动加载的文件,这意味着 http:/localhost:2008/ServletTest/打开时会自动加载这些文件,因此不会报错。但若项目中没有 welcome-file-list 中包含的文件,就会打开http:/localhost:2008/ServletTest/时报错。