A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 WangQiJourney 于 2019-2-27 15:49 编辑

异常一
  创建人
  
  王琦
  
  问题标题
  
  功能无法实现
  
  问题分类
  
  JS中 使用循环来绑定事件并设置处理事件的函数中,this的用法
  
  一级话题
  
  
  
  问题补充
  
  
  
  附件
  
  
     
[AppleScript] 纯文本查看 复制代码
 
//需求:表格共4行,鼠标箭头经过表格中的一行时,本行颜色变为pink
 
var trs = document.getElementsByTagName("tr");  //trs 指的是表格行的元素数组

for (i=0;i<trs.length;i++){
    trs[i].onmouseover=function (ev) {
        trs[i].style.color="pink";        //注意此处要用 this ,用trs[i]是不行的  
    }
}
  
  问题答案
  
  问题分析:
  
  
执行流程为:先循环绑定鼠标箭头事件,完成后i=4,这个过程是在极短时间内就完成了的,然后我们手动触发事件,然而此时i的值为4,trs[]数组中一共4个元素,取不到trs[4],因此这个元素是未定义的undefined。
  
因此这种情况是循环进行事件绑定,触发事件和这个循环无关,因此这个事件的处理函数中不能使用这个循环里的i。若要在处理函数中使用这个和这个事件绑定的元素,可以使用this,this就代表这个触发事件的元素。
   
  
  问题解决方法:
  修改代码第4行:
  trs.style.color="pink";
  修改为
  this.style.color="pink";
  


异常二
  创建人
  
  王琦
  
  问题标题
  
  编译问题
  
  问题分类
  
  HTTP中response对象的获取输出流设置响应体相关异常以及一些需要注意的地方
  
  一级话题
  
  
无法访问此网站
  
网址为 http://localhost:8080/day15/downloadPictures?filename=1.jpg 的网页可能暂时无法连接,或者它已永久性地移动到了新网址
  
  
  问题补充
  
  
  
  附件
  
  
[AppleScript] 纯文本查看 复制代码
@WebServlet("/downloadPictures")
  
public class downloadPictures extends HttpServlet {
  
        protected void  doPost(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
  
                 //1.根据参数获取请求的文件名
  
                 String filename =  request.getParameter("filename");
  
                 //2.根据文件名获取真实路径
  
                 ServletContext  servletContext = this.getServletContext();
  
                 String realPath =  servletContext.getRealPath("/img/" + filename);
  
                 //3.创建字节流并关联文件
  
                 FileInputStream  fis = new FileInputStream(realPath);
  
                 System.out.println(realPath);
  
  
                 //设置响应数据格式,设置打开方式:附件,不写下面这一段则会以图片形式显示在网页上
  
                 //4.设置响应头,本次响应数据的格式的MIME格式,有些浏览器不添加这个响应头也可以解析出来,但大部分还是要加上的
  
                 String mimeType =  servletContext.getMimeType(filename);//获取文件的mime类型
  
                 response.setHeader("content-type",mimeType);
  
  
                 //转换为浏览器的编码的名字(解决文件名乱码问题)
  
                 String agent =  request.getHeader("user-agent");
  
                 filename =  DownLoadUtils.getFileName(agent, filename);
  
  
        response.setHeader("content-disposition","attachment;filename="+filename);    //注意:attachment后面是分号,不是逗号!
  
                 PrintWriter writer  = response.getWriter();    //此处出现错误:和字节流冲突,不可同时使用,只获取不使用也不行
  
                 ServletOutputStream  sos = response.getOutputStream();
  
                 byte[] buff = new  byte[1024*8];
  
                 int len = 0;
  
                 while  ((len=fis.read(buff))!=-1){
  
                         sos.write(buff,0,len);
  
                 }
  
                 sos.close();
  
                 fis.close();
  
        }
  
  
        protected void  doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
  
                 doPost(request,response);       //这里一定不要忘记!
  
        }
  }
  
  问题答案
  
  问题分析:
  Response对象在同一个响应中获取输出流只能要么使用字节输出流,要么使用字符输出流,不可二者同时存在,二者之间有冲突。即便只获取没有使用也不行
  
  
  问题解决方法:
  删除掉PrintWriter writer = response.getWriter();这一行
  
  
  其他需要注意的地方:
  
  1、  响应中分别有处理GET和POST的两个方法,不要忘记两个都要设置好,若是两种处理方法相同,也可以在另一种处理方法中如doGet方法中调用this.doPost(request,response);

  2、  使用注解配置servlet时,@WebServlet(value=”/XXX”)中不要忘记斜杠/

  3、  Content-disposition响应头的值attachment;filename=xxx,和Content-Type响应头的值type/subtype;parameter,中间是分号分隔的,不要写成逗号

4、  servletContext.getRealPath("/")  返回的为真实路径的根目录,也就是Tomcat服务器配置的本module的根目录,因此使用servletContext.getRealPath()来获取真是目录时传入的参数要注意是否位于本mod根目录下
  

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马