JSP面试:forward与sendRedirect深度解析

需积分: 12 3 下载量 155 浏览量 更新于2024-10-24 1 收藏 4KB TXT 举报
"JSP面试常问问题,包括forward与sendRedirect的区别以及include的使用" 在JSP开发中,面试官经常关注开发者对于页面跳转和包含的理解,特别是forward和sendRedirect这两个关键方法的区别。理解它们的工作原理对于优化应用程序的性能和用户体验至关重要。 一、forward与sendRedirect的区别 1. forward(转发): - forward是一种服务器内部的跳转,它不会向客户端浏览器发送新的HTTP请求,而是将请求和响应对象传递给指定的URL。因此,forward操作是透明的,用户感知不到页面已经发生跳转。 - 在JSP页面中,我们可以使用`<jsp:forward>`标签进行转发,如`<jsp:forward page="userlist.jsp"/>`。 - 在Servlet中,我们可以通过`RequestDispatcher`的`forward()`方法来转发,例如:`RequestDispatcher rd = request.getRequestDispatcher("userlist.jsp"); rd.forward(request, response);` - forward过程中,request和response对象保持不变,这意味着在原始页面中设置的任何属性或状态(如session信息)都可以在被转发的页面中访问。 2. sendRedirect(重定向): - sendRedirect是客户端的跳转,它会向浏览器发送一个HTTP状态码302,指示浏览器发起一个新的HTTP请求到指定的URL。 - 在Servlet中,我们使用`response.sendRedirect("userlist.jsp")`来实现重定向。 - sendRedirect会导致浏览器发起一个新的请求,所以请求和响应对象是新的,之前页面的状态(如session信息)无法直接获取,除非通过查询参数或cookie重新传递。 - 由于是新请求,sendRedirect可以跳转到外部网站或者执行其他HTTP方法,而forward只能在同一个应用内进行。 二、include的使用: - JSP的`<jsp:include>`标签用于动态地包含一个页面。这不同于forward,因为它会在最终的HTML输出中插入包含页面的内容。 - `<jsp:include page="includedPage.jsp" flush="true">`将`includedPage.jsp`的内容插入到当前JSP页面的当前位置。 - include支持动态包含,也就是说,被包含的页面内容可以根据请求参数或其他条件有所不同。 - 与forward不同,include不会改变请求处理的流程,而是将被包含页面的内容合并到主页面的输出中。 在选择使用forward还是sendRedirect时,需要考虑以下因素: - 如果需要保持请求的状态(比如session信息),并且页面都在同一个应用内,通常选择forward。 - 如果希望用户在浏览器地址栏看到新的URL,或者跳转到外部站点,应使用sendRedirect。 - 对于页面内容的动态组合,使用include可以提高效率,因为它不需要像sendRedirect那样发起新的HTTP请求。 理解和掌握这些核心概念对于构建高效、灵活的JSP应用至关重要。在面试中能够清晰地解释它们的差异和用法,将展示出开发者扎实的JSP基础知识。
2018-01-04 上传
常考面试题 1.讲下servlet的执行流程。 Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》 方法初始化servlet,再根据不同请求调用doGet或doPost方法,最后再通过destroy()方法进行销毁。 2.Get和Post的区别 在页面提交数据时,get的数据大小有限制4k,post没有限制,get请求提交的数据会在地址栏显示,post不显示,所以post比get安全. 3.有三台服务器,如果在一台服务器上登陆了这个用户,其他两台就不能再登陆这个用户,使用session共享,你是怎么做的。 把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。 4.写一个自定义标签要继承什么类 SimpleTagSupport,一般调用doTag方法 或者实现SimpleTag接口 5.Jsp如何处理json 在 jsp 中处理 JSON,通常需要配套使用 JQuery 控件,并且导入一些 Common jar 包。 使用 JQuery 控件是因为它能有效的解析并且展示 JSON 数据, 导入Common 则是因为 Java 中的对象并不是纯粹的数据,需要通过这些 Jar 包的处理使之转化成真实数据。 6.如何处理Servlet的线程不安全问题 1.最简单的就是不使用字段变量, 2.使用final修饰变量, 3.线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全, 所以可以在Servlet的线程里面加上同步方法或同步块。 (Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能变差,最好不去使用实例变量) 7.Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向会导致request对象信息丢失。转发则不会 转发的url不会变,request.getRequestDispatch().forward() 重定向的url会改变,response.getRedirect().sendRedirect();