1. 请说明一下JSP中的静态包含和动态包含的有哪些区别?
静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作
<jsp:include>
包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,contentType属性应保持一致,因为两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。
动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。
例如:静态包含
<%@ include file="..." %>
动态包含
<jsp:include page="...">
<jsp:param name="..." value="..." />
</jsp:include>
2. 请说一下表达式语言(EL)的隐式对象以及该对象的作用
EL的隐式对象包括:pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问cookie)、applicationScope(访问application作用域)、sessionScope(访问session作用域)、requestScope(访问request作用域)、pageScope(访问page作用域)。
3. 请谈一谈JSP有哪些内置对象?以及这些对象的作用分别是什么?
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;HttpServletRequest
- response:封装服务器对客户端的响应;HttpServletResponse
- pageContext:通过该对象可获取其他对象;javax.servlet.jsp.PageContext
- session:封装用户回话的对象;javax.servlet.http.HttpSession
- application:封装服务器运行环境的对象;javax.servle.ServletContext
- out:输出服务器响应的输出流对象;javax.jsp.JspWriter
- config:Web应用的配置对象;javax.servlet.ServletConfig
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象;
4. 请说明一下jsp有哪些动作? 这些动作的作用又分别是什么?
JSP共有以下6中基本动作:
- jsp:include:在页面被请求时引入一个文件。
- jsp:useBean:寻找或者实例化一个JavaBean.
- jsp:setProperty:设置JavaBean的属性。
- jsp:getProperty:输出某个JavaBean的属性。
- jsp:forward:把请求转到一个新的页面。
- jsp:plugin:根据浏览器类型为Java插件生成Object或Embed标记。
6. 请简要说明一下四种会话跟踪技术分别是什么?
- page代表与一个页面相关的对象和属性。一个页面由编译好的Java Servlet类表示。这既包括servlet又包括被编译成servlet的JSP页面。
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件(由于forward指令和include动作的关系)。
- session代表用于某个Web客户机的一个用户体验相关的对象和属性。一个Web回话可以也经常会跨越多个客户机请求。
- application代表与整个Web应用程序相关的对象和属性。这实质上时跨越整个Web应用程序,包括多个页面、请求和回话的一个全局作用域。
7. 请说明一下web.xml文件中可以配置哪些内容?
web.xml用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等,下面是一些开发中常见的配置:
- 配置Spring上下文加载监听器加载Spring配置文件并创建IOC容器:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
- 配置会话超时时间为10分钟:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
- 配置404和Exception的错误页面:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
8. 请谈谈你对JavaWeb开发中的监听器的理解?
链接
来源:牛客网
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
java中的事件监听机制可用图来表示:
8.1 JavaWeb开发中常见监听器
Java Web开发中的监听器(listener)就是application、session、request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件,如下所示:
监听域对象的创建和销毁:
- 监听ServletContext创建与销毁 ServletContextListener
- 监听HttpSession创建与销毁 HttpSessionListener
- 监听HttpServletRequest创建与销毁 ServletRequestListener
监听域对象的属性变化:
- 监听ServletContext属性变化 ServletContextAttributeListener
- 监听HttpSession属性变化 HttpSessionAttributeListener
- 监听HttpServletRequest属性变化 ServletRequestAttributeListener
监听session绑定javaBean
- 它是用于监听javaBean对象是否绑定到了session域 HttpSessionBindingListener
- 它是用于监听javaBean对象的活化与钝化 HttpSessionActivationListener
9. 请问过滤器有哪些作用?以及过滤器的用法又是什么呢?
对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain。
10. 说说Servlet接口中有哪些方法?
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
- void destory()
- java.lang.String getServletInfo()
- ServletConfig getServletConfig()
10.1 Servlet的生命周期
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
11. Servlet和CGI的区别
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet
12. 说说你对get和post请求,并且说说它们之间的区别?
- get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
- get将表单中的数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间用“&”连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
- get传输的数据要受URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
- 使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应使用post;
- get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码"%20"
13. 请你说说,cookie 和 session 的区别?
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie