学习servlet时出现的一些问题

此篇用来记录学习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>

 

     

 


    

posted @ 2018-05-21 22:18  陆卯伍  阅读(1293)  评论(0编辑  收藏  举报