java基础面试题

时间:2021-10-16 22:16:33

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

②配置Spring的OpenSessionInView过滤器来解决延迟加载和Hibernate会话关闭的矛盾:

  <filter> <filter-name>openSessionInView</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

③配置会话超时时间为10分钟:

  <session-config> <session-timeout>10</session-timeout> </session-config>
  • 1
  • 2
  • 3

④配置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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

⑤配置安全认证方式:

  <security-constraint> <web-resource-collection> <web-resource-name>ProtectedArea</web-resource-name> <url-pattern>/admin/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config> <security-role> <role-name>admin</role-name> </security-role>


、如何在基于Java的Web项目中实现文件上传和下载? 
答:在Sevlet 3 以前,Servlet API中没有支持上传功能的API,因此要实现上传功能需要引入第三方工具从POST请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,我们推荐使用Apache的commons-fileupload。 
从Servlet 3开始,文件上传变得无比简单,相信看看下面的例子一切都清楚了。

上传页面index.jsp:

<%@ page pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Photo Upload</title> </head> <body> <h1>Select your photo and upload</h1> <hr/> <div style="color:red;font-size:14px;">${hint}</div> <form action="UploadServlet" method="post" enctype="multipart/form-data"> Photo file: <input type="file" name="photo" /> <input type="submit" value="Upload" /> </form> </body> </html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

支持上传的Servlet:

package com.jackfrued.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/UploadServlet") @MultipartConfig public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 可以用request.getPart()方法获得名为photo的上传附件 // 也可以用request.getParts()获得所有上传附件(多文件上传) // 然后通过循环分别处理每一个上传的文件 Part part = request.getPart("photo"); if (part != null && part.getSubmittedFileName().length() > 0) { // 用ServletContext对象的getRealPath()方法获得上传文件夹的绝对路径 String savePath = request.getServletContext().getRealPath("/upload"); // Servlet 3.1规范中可以用Part对象的getSubmittedFileName()方法获得上传的文件名 // 更好的做法是为上传的文件进行重命名(避免同名文件的相互覆盖) part.write(savePath + "/" + part.getSubmittedFileName()); request.setAttribute("hint", "Upload Successfully!"); } else { request.setAttribute("hint", "Upload failed!"); } // 跳转回到上传页面 request.getRequestDispatcher("index.jsp").forward(request, response); } }
 

JSP中的静态包含和动态包含有什么区别? 
答:静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作<jsp:forward>包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。代码如下所示:

<%-- 静态包含 --%> <%@ include file="..." %> <%-- 动态包含 --%> <jsp:include page="..."> <jsp:param name="..." value="..." /> </jsp:include>
解释一下网络应用的模式及其特点。 
答:典型的网络应用模式大致有三类:B/S、C/S、P2P。其中B代表浏览器(Browser)、C代表客户端(Client)、S代表服务器(Server),P2P是对等模式,不区分客户端和服务器。
B/S应用模式中可以视为特殊的C/S应用模式,只是将C/S应用模式中的特殊的客户端换成了浏览器,因为几乎所有的系统上都有浏览器,那么只要打开浏览器就可以使用应用,没有安装、配置、升级客户端所带来的各种开销。
P2P应用模式中,成千上万台彼此连接的计算机都处于对等的地位,整个网络一般来说不依赖专用的集中服务器。网络中的每一台计算机既能充当网络服务的请求者,又对其它计算机的请求作出响应,提供资源和服务。
通常这些资源和服务包括:信息的共享和交换、计算资源(如CPU的共享)、存储共享(如缓存和磁盘空间的使用)等,这种应用模式最大的阻力安全性、版本等问题,
目前有很多应用都混合使用了多种应用模型,最常见的网络视频应用,它几乎把三种模式都用上了。


2、session和cookie的区别,如何实现自动登录 
1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。 
2、session中保存的是对象,cookie中保存的是字符串。 
3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。 
4、session需要借助cookie才能正常工作。如果客户端完全禁止cookie,session将失效。(ps:Java可以通过URL,进行sessionId的传递,而不是非得用cookie) 
5、session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存


自动登录: 
如果没有cookie信息,校验后把信息(用户名,密码等)放在cookie里面。 
如果有cookie,则读取cookie里的用户名和密码或者其它信息,然后根据读取的用户名和密码进行校验。


三\JSP程序404错误的解决方法如下: 
1、web应用没有部署成功:从控制台()的deployments下面看,要注意状态。如果没有部署成功,可以到控制台(启动服务器的命令行窗口)查看错误。如果使用了Tomcat,则通过,再选择管理界面。 
2、Web应用的名字(实际上是访问方式,通常是context-root),查看方式:在工程上点右键,选择“Properties”,选择MyEclipseàWeb,界面中的Web Context-root. 
3、资源的名字(JSP和servlet) 
  如果是JSP文件,仔细看文件名字是否写错。(在MyEclipse中开发的时候,JSP文件放在web-root中,不能放错,如果有其他文件夹,访问方式中要写出文件夹)如果没有错误,仔细看文件中是否通过jsp:forward或者jsp:include等访问方式访问了其他文件,看其他文件是否存在。 
  如果是Servlet,查看web.xml文挡: 
﹤servlet-mapping﹥ 
﹤servlet-name﹥LoginServlet﹤/servlet-name﹥ 
﹤url-pattern﹥/login﹤/url-pattern﹥ 
﹤/servlet-mapping﹥ 
  其中url-pattern的内容决定了访问方式。 
  如果这个Servlet的配置没有错误,要查看该Servlet文件中是否访问了其他文件,查看所访问的文件是否存在。 
4、如果上面这些错误都没有,可能是系统的缓存问题,包括客户端浏览器和服务器的临时文件。解决方法:重新启动浏览器,重新编译工程(ProjectàClean),重新部署,关闭应用服务器,重新启动应用服务器,重新访问。


7、简述mvc模式 
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。 
视图 
  视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复 杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请 求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界 面的输入数据和请求传递给控制和模型。

模型 
  模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返 回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的 划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开 发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设 计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可 以用对象编程来做比喻,MVC定义了一个*类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。 
  业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。

控制 
  控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以 完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个 模型。 
  模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图 都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。

 

一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

答:   1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

2、String不可变是因为在JDK中String类被声明为一个final类。

3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。

项目中的常量定义用final Stringbufere用于拼接字符串 和拼接sql语句 


Vector,ArrayList, LinkedList的区别是什么?

答:   1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。

3、Vector线程同步,ArrayList、LinkedList线程不同步。

4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。

5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。



HashTable, HashMap,TreeMap区别?

答:   1、HashTable线程同步,HashMap非线程同步。

2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。

3、HashTable使用Enumeration,HashMap使用Iterator。

4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。

八、Servlet的生命周期

答:   大致分为4部:Servlet类加载-->实例化-->服务-->销毁

        下图是Tomcat中Servlet时序图。

java基础面试题

1、Web Client向Servlet容器(Tomcat)发出Http请求。

2、Servlet容器接收Client端的请求。

3、Servlet容器创建一个HttpRequest对象,将Client的请求信息封装到这个对象中。

4、Servlet创建一个HttpResponse对象。

5、Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象作为参数传递给HttpServlet对象中。

6、HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。

7、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。

8、Servlet容器把HttpServlet的响应结果传回客户端。

        其中的3个方法说明了Servlet的生命周期:

1、init():负责初始化Servlet对象。

2、service():负责响应客户端请求。

3、destroy():当Servlet对象推出时,负责释放占用资源。

Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

答:   1、PreparedStatement支持动态设置参数,Statement不支持。

2、PreparedStatement可避免如类似 单引号 的编码麻烦,Statement不可以。

3、PreparedStatement支持预编译,Statement不支持。

4、在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。

5、PreparedStatement可防止Sql助于,更加安全,而Statement不行。

 详见:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010927222912/

 什么是SQL注入:

 通过sql语句的拼接达到无参数查询数据库数据目的的方法。

 如将要执行的sql语句为 select * from table where name = "+appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1']  传入可在数据库中执行。

 因此可以采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不  行,需要手工检测。

 

 

 

十三、谈谈hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的。

答:   Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。

Hibernate的优点:

1、程序更加面向对象

2、提高了生产率

3、方便移植

4、无入侵性。

缺点:

1、效率比JDBC略差

2、不适合批量操作

3、只能配置一种关联关系

Hibernate有四种查询方式:

1、get、load方法,根据id号查询对象。

2、Hibernate query language

3、标准查询语言

4、通过sql查询

Hibernage工作原理:

1、配置hibernate对象关系映射文件、启动服务器

2、服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。

3、通过实例化的Configuration对象建立SeesionFactory实例,通过SessionFactory实例创建Session对象。

4、通过Seesion对象完成数据库的增删改查操作。

Hibernate中的状态转移

临时状态(transient)

1、不处于session缓存中

2、数据库中没有对象记录

java是如何进入临时状态的:1、通过new语句创建一个对象时。2、刚调用session的delete方法时,从seesion缓存中删除一个对象时。

持久化状态(persisted)

1、处于session缓存中

2、持久化对象数据库中没有对象记录

3、seesion在特定的时刻会保存两者同步

java如何进入持久化状态:1、seesion的save()方法。2、seesion的load().get()方法返回的对象。3、seesion的find()方法返回的list集合中存放的对象。4、Session的update().save()方法。

流离状态(detached)

1、不再位于session缓存中

2、游离对象由持久化状态转变而来,数据库中还没有相应记录。

java如何进入流离状态:1、Session的close()。Session的evict()方法,从缓存中删除一个对象。

具体如下图所示:

java基础面试题

14. 项目开发经历了哪几个阶段? 
需求分析,设计(找用例,写用例文本,找实体,编写数据字典,画数据流图),编码,测试,部署; 

17. TCP/IP通讯和UDP通迅的区别? 
1) TCP/IP面向连接,可靠连接,UDP面向不连接,不可靠连接 
2) 建立连接经历3次握手,udp无需连接,ip和port封装在datagram数据包中,自寻址

45. 项目中用到了session对象吗,在哪里用到的? 
登陆时,使用session保持用户信息。购物车制作时,使用session保持用户的购物信息 

 

 

9、过滤器和拦截器的区别

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只在容器初始化时调用一次

拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.