【石家庄校区】WEB部分面试题、页面乱码解决方案、JSP
1. 面试题:Request何时创建何时销毁:从客户端向服务器发送请求.那么服务器创建一个request对象.服务器为这次请求作出了响应之后,服务器就会销毁request对象.Request作用范围:一次请求. 2. 面试题:重定向和转发的区别(redirect和forward的区别):1)转发地址栏不会变,重定向地址栏会变.2)转发是一次请求,重定向是多次请求.3)转发只能到服务器内部,重定向可以到任何地方.4)转发的路径不需要工程名,重定向不能加工程名(重定向只能重定向到本工程内的页面或者Servlet,自身包含了项目名称,因此不能加上项目名称). 3. 接收参数的中文乱码的处理:GET方式提交数据的处理方法:new String(“参数名称”.getBytes(“ISO-8859-1”),”UTF-8”);POST方式提交数据的处理方法,设置缓冲区的编码格式:request.setCharacterEncoding(“UTF-8”);因为request是获取前台的数据交给后台,不显示到前台页面,所以只要设置缓冲区编码格式就能得到想要的数据.结论:从前台获取中文数据,获取到之前总会被编码,所以总会获取到乱码,解决的方式根据数据的提交的不同方式进行不同的处理,1)如果是get提交的中文数据,那么会被请求行转码,这种方式只能是获取到数据后进行转码处理,根据默认的码表将该参数转换成字节,再将字节按照想要的码表或得到中文.2)如果是post方式提交的数据,这些数据会经过请求体,请求体有自己的缓冲区,只要在拿参数之前(如果有多个参数,当已经拿过数据以后,再进行缓冲区编码的设置将不会生效)将缓冲区设置成想要的编码格式就能拿到想要的中文数据. 4. 向页面输出数据中文乱码问题:因为向页面输出数据时会经过response的缓冲区,所以要设置response缓冲区的编码格式response.setCharacterEncoding(“UTF-8”);如果设置了缓冲区格式后页面还是乱码,那就不再是缓冲区的问题,是浏览器的问题,这时可以设置浏览器的字符集编码格式response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);这两句代码有个简写格式:response.setContentType("text/html;charset=utf-8"); 5. 什么是Servlet:Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。 针对客户端的多次Servlet请求,通常情况下(Servlet存在线程安全的问题,当多个线程同时访问实例变量时会出现问题,当然可以使用加锁的方式解决问题,但是加锁会导致多个线程的串行执行,不服个线程的并发执行思想,不可取.当servlet实现了SingleThreadModel(标记接口)这个接口后Servlet引擎仍然支持对该Servlet的多线程并发访问,但这时其采用的方式是创建多个Servlet实例对象,并发的每个线程分别去调用一个独立的servlet对象),服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 6. 下载文件时有三个操作:1)设置文件类型:response.setHeader("Content-Type", type);这里的type是文件的mime类型,这个类型可通过ServletContext对象的getMimeType(String filename)获得,方法中传进去一个文件名就能返回该文件的mime类型.2)设置文件的打开方式:Content-Disposition;response.setHeader("Content-Disposition","attachment;filename="+filename);3)设置流. 7. 字符串比较时使用是方法,而不是”==”,”==”这个是相等符号,比较的是地址. 8. Cookie存储中文的问题:使用URLEncoder里面的encode()方法进行编码,然后存进Cookie里面;接收cookie时对cookie进行解码,使用URLDecoder里面的decoder()方法进行解码. 9. 在JSP中如果使用java代码把一段html给包含了,那么如果这段java代码出错了,html代码也不会执行. 10. Session和cookie的区别:1)存放地点不一样;2)数据大小的限制. 11. Session什么时候销毁:1)session过期了,默认是30分钟.2)非正常关闭服务器(直接关电源),session会直接消失,如果正常关闭服务器session会存到硬盘,再次启动硬盘后恢复session;3)手动调用session.invalidate()进行销毁, 12. Session的生命周期: 13. 面试题:三个域对象的作用范围:Session的作用范围:多次请求(一次会话)(因为Cookie的声明周期是一次会话),不管是转发还是重定向都能获取到session,request的作用范围是一次请求响应(转发能获取到,重定向获取不到),ServletContext的作用范围是整个项目. 14. 配置session的过期时间.在tomcat的web.xml中配置session-timeout中的标签,单位是分钟.浏览器关闭导致cookie存储的session丢失,此时session并没有销毁. 15. JSP指令语法:<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%>;2)有三个指令:page指令(用于设置jsp的一些属性,掌握全局错误页面的配置)有三个需要掌握:①contentType:设置浏览器打开这个JSP的时候默认的字符集编码②pageEncoding:设置文件保存到硬盘,生成servlet后,以及servlet在硬盘保存时的编码格式.③import:用于在JSP中引入类对象,这个属性可以多次出现,并且可以单独出现在一个标签中;include指令(静态包含);taglib指令. 16. 面试题:JSP内置对象:(每个对象要记住几个方法) 1) :request--HttpServletRequest 2) :response--HttpServletResponse 3) :session--HttpSession 4) :application--ServletContext 5) :page--Object 6) :pageContext--PageContext 7) :out--JspWriter 8) :exception--Throwable 9) Config--ServletConfig 17. 面试题:JSP的四个域范围: 1) PageScope:仅在当前页面有效,转发也不行,转发后也是出了当前页面了. 2) RequestScope:在一次请求的范围有效. 3) SessionScope:在当前会话中有效(能根据cookie找到session才行). 4) ApplicationScope:整个应用的范围. 18. 面试题(能列出来6个):动作标签: 1) :<jsp:forward page=””></jsp:forward>:用于页面转发. 2) <jsp:include page=””></jsp:include>:用于动态包含页面. 3) <jsp:param />:用于带有路径的标签下,传递参数. 4) <jsp:useBean />:用于使用JavaBean. 5) <jsp:getProperty>:用于获取JavaBean的属性. 6) <jsp:setProperty>:用于设置JavaBean的属性. 19. 面试题:动态包含和静态包含的区别:静态包含相当于源码的拷贝,只会翻译成一个JAVA类,只有一个执行结果.动态包含是各自分别去翻译,各自分别执行,最后包含的是执行结果 20. EL表达式获取域中的数据,如果没有找到那么会返回一个空字符串,传统的java获取的方式,当没找到时返回的是null.其中简写形式${name}(没有指定域,而直接写名字),会从小范围开始寻找,寻找到后会返回该值.EL表达式获取map中的数据,如果map中的key存在关键字,例如”.”、“-”,要使用[]括起来,如果使用EL表达式获取数组或者集合中的数据要使用下标. 21. 面试题:jsp的三种注释: 1) HTML注释:<!-- -->:生成的页面源码中也存在着这个注释. 2) Java 注释(三种:单行注释,多行注释,文档注释):生成的servlet中也存在,但是页面源码中没有这个注释. 3) Jsp特有注释:<%-- --%>:生成的servlet中没有. 22. 获取传来的参数,如果参数中有中文要在获取前进行转码,如果获取了一个参数,然后在进行转码,此时转码操作不会生效.后面拿到的数据依然是乱码. 23. 当访问共有资源时会出现线程安全问题.线程安全问题只存在多个线程并发操作同一个资源的情况下. 24. Servlet的service方法接收了一个ServletRequest对象,和一个ServletResponse对象,这两个对象,其中ServletRequest对象中有浏览器的请求数据,而ServletResponse是一个空的对象,等着Servlet给其中传值,而后服务器会从这个ServletResponse取值,向页面输出. 25. 为什么要在web-xml中配置Servlet?服务器启动的时候会加载web-xml这个文件,会先生成所有的Servlet的映射关系(访问路径和该Servlet的准确路径),当页面或者Servlet需要访问其他的Servlet时只需要根据设置的路径去访问,首次访问会根据真实路径生成该Servlet的实例,并执行init方法,然后执行service方法,根据不同的请求方式执行不同的doXXX()方法. 26. 面试题:JSP的嵌入Java代码:JSP的脚本元素: <%! %> :翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!! <% %> :翻译成类的service方法内部的内容. 定义变量,定义类,直接写代码块. <%= %> :翻译成service方法内部的out.print(); 27. 面试题:out和response.getWriter是不是同一个对象?区别是什么?这两个不是同一个对象,out真实对象JspWriter ,response获得Writer是PrintWriter.
|