Java web
web编程基础
1、启动项目时如何实现不在链接里输入项目名就能启动?
可在 taomcat 配置虚拟目录。
2、1 分钟之内只能处理 1000 个请求,你怎么实现,手撕代码?
限流的几种方法:计数器,滑动窗口、漏桶法、令牌桶
3、什么时候用 assert
assertion (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的值为 true;如果该值为 false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion 用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion 检查通常是关闭的。
4、JAVA 应用服务器有那些?
- Apache Tomcat
Tomcat由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
优点:
- 免费的开源代码
- 轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用
- 占用的系统资源小,启动快
- 扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能
Jetty
Jetty 是一个开源的WEB容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行的Java应用提供网络和web连接。
JBoss
JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。因为JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用它,而不用支付费用。JBoss 是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
1、JSP 的内置对象及方法。
- request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取 cookie, header, 和 session 数据的有用的方法。
- response 表示 HttpServletResponse 对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
- out 对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
- pageContext 表示一个 javax.servlet.jsp.PageContext 对象。它是用于方便存取各种范围的名字空间、- - servlet 相关的对象的 API,并且包装了通用的 servlet 相关功能的方法。
- session 表示一个请求的 javax.servlet.http.HttpSession 对象。Session 可以存贮用户的状态信息
- applicaton 表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和servlet 环境的信息
- config 表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参数。
- page 表示从该页面产生的一个 servlet 实例
2、JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?
JSP(Java Server Pages)是Sun 公司指定的一种服务器端动态页面技术的组件规范,Jsp是以“.jsp”为后缀的文件,在该文件中主要是html 和少量的java 代码。jsp 文件在容器中会转换成Servlet中执行。
Servlet (Server Applet)是Sun公司指定的一种用来扩展Web服务器功能的组件规范,属于服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
借用知乎上java老师的一句话:jsp就是在html里面写java代码,servlet就是在java里面写html代码
4、讲讲 Request 对象的主要方法
setAttribute(String name,Object):设置名字为 name 的 request 的参数值
getAttribute(String name):返回由 name 指定的属性值
getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的 Body 的长度
getHeader(String name):获得 HTTP 协议定义的文件头信息
getHeaders(String name):返回指定名字的 request Header 的所有值,结果是一个枚举的实例
getHeaderNames():返回所以 request Header 的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有 name 指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name):获得有 name 指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的 IP 地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关 Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性
6、jsp 有哪些动作?作用分别是什么?
JSP 共有以下 6 种基本动作
- jsp:include:在页面被请求的时候引入一个文件。
- jsp:useBean:寻找或者实例化一个 JavaBean。
- jsp:setProperty:设置 JavaBean 的属性。
- jsp:getProperty:输出某个 JavaBean 的属性。
- jsp:forward:把请求转到一个新的页面。
- jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记。
7、请谈谈 JSP 有哪些内置对象?作用分别是什么?
JSP 有 9 个内置对象:
- request:封装客户端的请求,其中包含来自 GET 或 POST 请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web 应用的配置对象;
- page:JSP 页面本身(相当于 Java 程序中的 this);
- exception:封装页面抛出异常的对象。
8、说一下表达式语言(EL)的隐式对象及其作用
EL 的隐式对象包括:pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问 cookie)、applicationScope(访问 application 作用域)、sessionScope(访问 session 作用域)、requestScope(访问 request作用域)、pageScope(访问 page 作用域)。
9、JSP 中的静态包含和动态包含有什么区别?
静态包含是通过 JSP 的 include指令包含页面,动态包含是通过 JSP 标准动作<jsp:forward>包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为两个页面会合二为一,只产生一个 class 文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个 class 文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。
例如:
<%-- 静态包含 --%>
<jsp include file="..." >
<%-- 动态包含 --%>
<jsp:include page="...">
<jsp:param name="..." value="..." />
</jsp:include>
1、过滤器有哪些作用和用法?
对 Web 应用来说,过滤器是一个驻留在服务器端的 Web 组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。当 Web 容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括:
- 对用户请求进行统一认证
- 对用户的访问请求进行记录和审核
- 对用户发送的数据进行过滤或替换
- 转换图象格式
- 对响应内容进行压缩以减少传输量
- 对请求或响应进行加解密处理
- 触发资源访问事件
- 对 XML 的输出应用 XSLT
2、请谈谈你对 Javaweb 开发中的监听器的理解?
Java Web 开发中的监听器(listener)就是 application、session、request 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件,如下所示:
- ServletContextListener:对 Servlet 上下文的创建和销毁进行监听。
- ServletContextAttributeListener:监听 Servlet 上下文属性的添加、删除和替换。
- HttpSessionListener:对 Session 的创建和销毁进行监听。
session 的销毁有两种情况:
1). session 超时(可以在 web.xml 中通过/标签配置超时时间);
2). 通过调用 session 对象的invalidate()方法使 session 失效。 - HttpSessionAttributeListener:对 Session 对象中属性的添加、删除和替换进行监听。
- ServletRequestListener:对请求对象的初始化和销毁进行监听。
- ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
3、说说 web.xml 文件中可以配置哪些内容?
web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、Servlet、相关参数、会话超时时间、安全验证方式、错误页面等
Web 编程进阶
1、forward 与 redirect 区别,说一下你知道的状态码,redirect 的状态码是多少?
- 从地址栏显示来说
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL. - 从数据共享来说
forward:转发页面和转发到的页面可以共享 request 里面的数据.
redirect:不能共享数据. - 从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. - 从效率来说
forward:高.
redirect:低.
redirect 的状态码是 302
2、servlet 生命周期,是否单例,为什么是单例。
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其 destroy 方法。最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
Servlet 单实例,减少了产生 servlet 的开销;
5、阐述一下阐述 Servlet 和 CGI 的区别?
Servlet与 CGI 的区别在于 Servlet 处于服务器进程中,它通过多线程方式运行其 service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 Servlet。
6、说说 Servlet 接口中有哪些方法?
Servlet 接口定义了 5 个方法,其中前三个方法与 Servlet 生命周期相关:
- void init(ServletConfig config)
- void service(ServletRequest req, ServletResponse resp)
- void destory()
- java.lang.String getServletInfo()
- ServletConfig getServletConfig()
init ()方法在 servlet 的生命周期中仅执行一次,在服务器装载 servlet 时执行。缺省的 init()方法通常是符合要求的,不过也可以根据需要进行 override,比如管理服务器端资源,一次性装入 GIF 图像,初始化数据库连接等,缺省的 inti()方法设置了 servlet 的初始化参数,并用它的 ServeltConfig 对象参数来启动配置,所以覆盖 init()方法时,应调用 super.init()以确保仍然执行这些任务。service ()方法是 servlet 的核心,在调用 service()方法之前,应确保已完成 init()方法。对于 HttpServlet,每当客户请求一个 HttpServlet 对象,该对象的 service()方法就要被调用,HttpServlet 缺省的 service()方法的服务功能就是调用与 HTTP 请求的方法相应的 do 功能,doPost()和 doGet(),所以对于 HttpServlet,一般都是重写 doPost()和 doGet()方法。destroy()方法在 servlet 的生命周期中也仅执行一次,即在服务器停止卸载 servlet 时执行,把 servlet 作为服务器进程的一部分关闭。缺省的 destroy()方法通常是符合要求的,但也可以 override,比如在卸载 servlet 时将统计数字保存在文件中,或是关闭数据库连接getServletConfig()方法返回一个 servletConfig 对象,该对象用来返回初始化参servletContext。servletContext 接口提供有关 servlet 的环境信息。getServletInfo()方法提供有关 servlet 的信息,如作者,版本,版权。