zoukankan      html  css  js  c++  java
  • 学习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>

         


        

  • 相关阅读:
    大话设计模式笔记(二十)の命令模式
    大话设计模式笔记(十九)の桥接模式
    大话设计模式笔记(十八)の单例模式
    大话设计模式笔记(十七)の迭代器模式
    反射的使用及其使用场景
    linq的简单使用
    XML的简单使用
    log4net的简单使用
    token
    axios在vue中的简单封装及应用
  • 原文地址:https://www.cnblogs.com/liumaowu/p/9069670.html
Copyright © 2011-2022 走看看