《EE实验常见问题分析.doc》由会员分享,可在线阅读,更多相关《EE实验常见问题分析.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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:无法获取提交表单上传文件的文件名和文件内容3问
2、题5:通过MultipartRequest对象读取表单元素顺序混乱4问题6:通过MultipartRequest对象不能获取radio或checkbox表单元素4问题7:cookie内容为中文的情况下添加和读取cookie出现错误4问题8:读取客户端cookie时出现NonePointerException错误5问题9:通过MultipartRequest对象读取上传的较大文件时出现IOException错误5问题10:Eclipse中启动Tomcat服务时出现 “8080等端口号已被占用” 的错误提示5问题11:浏览器中运行http:/localhost:2008/ServletTest/项
3、目出错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 Library”按钮选择“Server Runtime”选择“Tomcat7.0”完成。中文:选中项目右键构建路径库Web应用程序库选择“添加库”服务器运行时 Tomca
4、t6.0完成。问题2:启动Eclipse时,弹出“JVM terminated Exit code=-1”等提示的窗口原因:计算机内存空间不能够分配足够的空间给heap(堆:Java中管理内存的结构称作堆。)解决办法:打开eclipse安装目录下的eclipse.ini配置文件,其内容如下,-startupplugins/org.eclipse.equinox.launcher_1.0.200.v.jar-launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v-productorg.eclip
5、se.epp.package.jee.product-launcher.XXMaxPermSize256M-showsplashorg.eclipse.platform-launcher.XXMaxPermSize256m-vmargs-Dosgi.requiredJavaVersion=1.5-Xms40m-Xmx512m把其中的“Xmx512m” 改成“Xmx256m”问题3:用forward函数实现页面跳转时出现乱码页面原因:在跳转函数forward之前有PrintWriter out = response.getWriter();语句,会使得转发的页面出现乱码解决办法:采用 respo
6、nse.sendRedirect(“.”); 代替掉以下跳转语句RequestDispatcher rs=request.getRequestDispatcher();rs.forward(request, response);或者 注意调整程序结构,不要forward语句和response.getWriter()把放置在同一个语句块中。例如:If() PrintWriter out = response.getWriter(); Else RequestDispatcher rd=request.getRequestDispatcher(login.html);rd.forward(requ
7、est, response); 问题4:无法获取提交表单上传文件的文件名和文件内容原因:当提交表单中含有上传文件元素时,必须指定form的ENCTYPE=multipart/form-data,这意味着是以二进制数据流的形式把表单信息上传到Web服务器。而Servlet文件中的request对象是很难分析出二进制数据流。解决办法:使用第三方类库cos.jar包中提供的专门处理二进制数据流的MultpartRequest对象。它基本可以取代request对象,分析出上传表单的各个元素,特别是上传文件的基本信息。/指明把文件上传至服务器的c:下MultipartRequest request1=n
8、ew MultipartRequest(request, c:); /通过以下循环可以获得上传多个文件的文件名sysname/实验中只有一个一个照片文件,所以可以通过filelocation=c:+sysname;可以获得上传文件的具体位置和名称String filelocation=null;String sysname=null; Enumeration files = request1.getFileNames();while(files.hasMoreElements() String name = (String)files.nextElement(); sysname = requ
9、est1.getFilesystemName(name); /获得文件名称 filelocation=c:+sysname; /获得/文件在服务器上的存储地址问题5:通过MultipartRequest对象读取表单元素顺序混乱原因:MultipartRequest request1=new MultipartRequest(request, c:);Enumeration paramNames = request1.getParameterNames(); while(paramNames.hasMoreElements() .在上述代码中,MultipartRequest对象分析表单传入的二
10、进制数据流时,分析顺序不固定,针对表单元素名称为中文和英文的情况尤其是不同。这是第三方提供的插件不够标准造成的。解决方法:不再使用上面的循环方式,而是使用request1.getParameterName()函数依次获得指定名称的表单元素;或者使用Request对象可以顺序读出表单元素,但对带有文件上传元素的表单难以处理;或者换用其它的第三方组件。问题6:通过MultipartRequest对象不能获取radio或checkbox表单元素原因:MultipartRequest request1=new MultipartRequest(request, c:);Enumeration para
11、mNames = request1.getParameterNames(); while(paramNames.hasMoreElements() .在上述代码中,像radio或者checkbox这种需要用户点选的表单元素,当元素缺失用户点选时(即为null的情况,其默认值也为空),使用MultipartRequest对象的getParameterNames()方法就不能获取到这两个表单元素的名称和内容(null)。解决方法:需要通过MultipartRequest对象的getParameter()函数对radio或者checkbox这种需要用户点选的表单元素进行单独获取和处理,例如代码如下:
12、String sex=request1.getParameter(“sex”);nullandblank=JustifyAndFilter.isParameterNull(sex);/判断是否为空或 if(nullandblank) *(缺失的处理) 进一步的问题是,即使radio或者checkbox已有选取项,但可能读出来的仍然是null。原因在于表单中radio或者checkbox元素的名称被用中文标示,例如name=“性别”。这导致MultipartRequest对象无法正确获取表单元素的值。因此建议尽量使用通用语言即英语作为传递数值的变量显然要比中文更加方便和安全。问题7:cookie
13、内容为中文的情况下添加和读取cookie出现错误原因:出现java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value的错误提示,表示不能把中文字符作为cookie内容添加到浏览器端。解决方法:为预防可能放入cookie的值为中文,在创建cookie或设置cookie内容时,需要进行编码,即把中文编码为UTF-8。例如:创建cookie, Cookie usernameCookie = new Cookie(c-username, URLEnc
14、oder.encode(request.getParameter(username),utf-8);设置一个名为c的cookie内容属性,c.setValue(URLEncoder.encode(cvalue,utf-8);同样的,要读取出Cookie中的中文含义时,需要先对cookie的内容进行解码,例如,读取一个名为c的cookie内容属性,username=URLDecoder.decode(c.getValue(),UTF-8);最后需要注意,在使用URLEncoder和URLDecoder的静态方法之前要把这两个类引入程序中,即import .URLDecoder;import .U
15、RLEncoder;问题8:读取客户端cookie时出现NonePointerException错误原因:当客户端没有任何cookie时,Cookie co=request.getCookies();的结果就是co为null。所以下面使用co的长度进行循环读取每个cookie时,就会出现NonePointerException错误。解决方法:从客户端读取cookie时,首先要判断Cookie co=request.getCookies();的结果是否是null,若是则说明没有任何Cookie。这时就需要跳过通过co的长度依次读取每个cookie的步骤。问题9:通过MultipartReques
16、t对象读取上传的较大文件时出现IOException错误原因:使用MultipartRequest的MultipartRequest(HttpServletRequest request, String saveDirectory) 这个构造方法默认上传文件得最大大小为,即1M。所以会产生java.io.IOException: Posted content length of exceeds limit of 异常,但是当传送较小尺寸的文件时,没有此异常。解决方法:建议使用另一个构造方法MultipartRequest(HttpServletRequest request, String s
17、aveDirectory, int maxPostSize) ,把参数int maxPostSize设置成10*1024*1024。因为一般上传的图片文件不会超过这个大小,就不会出现IOException。问题10:Eclipse中启动Tomcat服务时出现 “8080等端口号已被占用” 的错误提示原因:Window中已有其它进程启动占用了Tomcat服务需要的端口号。解决方法有2种:1. 直接更换Tomcat的端口,操作如下修改Tomcat的配置,用记事本工具打开Tomcat配置文件Tomcat7.0根目录下 confserver.xml1)为避免常见的端口冲突问题,修改发布端口号为2008
18、(Tomcat默认为8080)原代码为: 修改后:2)在eclipse的server窗口中删除已有的tomcat服务,重新new一个新的Tomcat服务。2. 或者也可以按以下步骤进行检查:1) 打开Window的任务管理器选择进程标签查看里面有没有运行的javaw.exe进程和tomcat6.exe进程如果有的话,就选择该进程,右键选择“结束进程”2) 重新再Eclipse中启动Tomcat服务。若仍然出现 “8080等端口号已被占用” 的错误提示,继续下面的第3)步,进行手工检查。3) 根据提示的端口号(假如我们需要确定谁占用了8080端口),依次进行下面的检查。a) Window开始菜单
19、选择“运行”输入“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这意味着端口8080被名为thread.exe的进程占用着d) 打开任务管理器,找到PID为2448的进程或进程名称为
20、“thread.exe”的进程,右键选择“结束进程”。(若任务管理器中没有PID这一项,可以在任务管理器中选查看-选择列在PID选框前打对勾即可)e) 如果需要查看其他端口。把 8080 改掉即可问题11:浏览器中运行http:/localhost:2008/ServletTest/项目出错原因:一个项目http:/localhost:2008/ServletTest/在浏览器中无法打开运行的原因是URL中没有指名具体的页面或Servlet地址,例如应该是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/时报错。