此篇用来记录学习servlet时遇到的一些问题,谨防以后再犯。
问题1.导入的web项目,servlet中导入的包名报错。
(1)缺少相关包,推荐一个网站下载jar包很方便http://mvnrepository.com/artifact/javax.inject/javax.inject/1
根据报错的import后面的包名,下载包,然后放进WebRoot——WEB-INF——lib文件夹下
(2)import javax.servlet.ServletException;遇到这种javax……报错,可以右键项目名——Properties——Java Build Path——Libraries标签
——add Library按钮——选择ServerRuntime 应用并关闭,即可解决。
问题2.eclipse中建立的web项目运行后没有部署到tomecat下webapps中。
原因:eclipse中项目被默认部署到工作空间路径下。
解决:先停止正在运行的项目,然后选择Servers,把红圈内项目右键remove掉,然后右键黑圈clean一下。
双击黑圈,按照下图改一下项目默认部署路径
OK
问题3.servlet修改了之后运行,仍然显示修改之前的内容,重启服务器——无效,删除此servlet然后重建——无效,删除部署到服务器的项目重新启动——无效,为此我还发现了上面 的问题2,改了默认部署路径之后还是没用。
这个servlet可以在eclipse内置浏览器中打开,也可以在外部浏览器中打开,可以被跳转打开,但内容就是不变,即使把dopost内容删完了只留下resq.getWriter().println("123");也没用。
这个问题还没有发现是什么原因导致的,出现的原因是因为使用jdbc缺少jar包,然后新建了一个lib文件夹,复制了mysql的驱动包Build Parh。然后发现web项目需要把jar包放到WEB-INF的lib下,然后又build path了一下,就发生了这个问题。 删除所有jar包后没有解决。
最后的解决方法:重新建立web项目,把前一个项目的文件复制过来,删除旧项目。
问题4.jsp中使用相对路径的问题。
问题描述:两个jsp文件都在WEBROOT的files文件夹下,两张jsp文件中都有form且action属性需要跳转到相同的servlet。但是,其中一个jsp的相对路径写"../MyServlet",另外一个jsp的相对路径需要写"MyServlet",两个相对路径的既路径不同,第一个是从当前文件夹开始,第二个jsp是从当前项目根目录开始。
问题排查:第一个jsp是从另外一个jsp文件的<a>标签的href属性跳转过来的,这被当作HTML中的相对路径使用,所以从当前文件夹开始计算。第二张jsp先经过了一个servlet,然后从servlet中使用request的转发跳过来的,这个相对路径使用了servlet中的规则,把当前项目地址作为根路径。
解决方法:在jsp中使用<base/>标签统一基路径。
1 <% 2 String path = request.getContextPath(); 3 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 4 %> 5 6 <base href="<%=basePath%>">
问题延伸:发现ie的某些版本对<base/>标签的支持不是很好,需要把<base/>标签写到</head>标签前,且中间不能有其他HTML标签。
问题5.el表达式的嵌套。
问题描述:从servlet向jsp传递一个学生类型的List和 以班级号为key的班级名。如下:
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 Service service=new ServiceImpl(); 3 List<Student> list=(ArrayList<Student>)service.ShowAllStudentsList(); 4 List<Clazz> list2=service.showAllClazzList(); 5 request.setAttribute("0", "暂无班级"); 6 for(Clazz c:list2) { 7 request.setAttribute(Integer.toString(c.getClazzNo()), c.getcName()); 8 } 9 if(list!=null) { 10 request.setAttribute("sList",list); 11 } 12 request.getRequestDispatcher("/files/studentList.jsp").forward(request, response); 13 }
所以需要在jsp中遍历学生List,得到student类中的班级号,然后以这个班级号为key去request域中查找对应的班级名称。起初使用嵌套的el表达式${requestScope[${stu.clazzNo}]},但是el表达式貌似不支持嵌套使用。
问题解决:使用java脚本和el表达式和jstl标签,先把从list中得到的班级号重新在request域中储存一次,然后再用java脚本获取。
<c:forEach items="${sList}" var="stu" varStatus="vs"> <c:set var="cN" value="${stu.clazzNo}" scope="request"/> <td >
<%=request.getAttribute(String.valueOf(request.getAttribute("cN"))) %>
</td>
</c:forEach>