java基础面试题 背过1
web.xml文件中可以配置哪些内容?
答:web.xml用于配置Web应用的相关信息,如:监听器(listener)
ContextLoaderListener
、过滤器(filter)
StrutsPrepareAndExecuteFilter
、 Servlet初始时机<load-startup>、相关参数、会话超时时间<session-timeout>、安全验证方式、错误页面<Error-page>等,下面是一些开发中常见的配置:
①配置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会话关闭的矛盾:Nosession问题
<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指令 属性为file引入 包含文件. 静态包含是在编译期进行包含, 如果包含的页面不存在择会编译不通过. 最终产生一个class文件.
动态包含 是jsp的动作 是jsp标签. 通过page属性包含文件 . 动态包含是两个独立的文件, 会编译出两个class文件.
答:静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作<jsp:forward>包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。代码如下所示:
<%-- 静态包含 --%>
<%@ include file="..." %>
<%-- 动态包含 --%>
<jsp:include page="...">
<jsp:param name="..." value="..." />
</jsp:include>
解释一下网络应用的模式及其特点。
B/s 是浏览器和服务器的的模式 更新和维护更方便,
c/s 客户端和服务器的模式 界面更炫. 数据更安全. 缺点:更新一个要全部更新.
答:典型的网络应用模式大致有三类: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因为保存在客户端,可以长期保存
自动登录:
先去cook.如果没有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)代表用户交互界面,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请 求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界 面的输入数据和请求传递给控制和模型。
模型
模型(Model):,模型接受视图请求的数据,并返 回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。
业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。
控制
控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个 模型。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图 都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。
MVC是model-view-controler的简称。也就是模型-视图-控制器。mvc是一种设计模式,他强制性的把应用程序的输入、处理和输出分开。
比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界 面的输入数据和请求传递给控制和模型
mvc中的模型、视图、控制器分别担任着不同的任务。
视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型:模型表示业务数据和业务处理。相当于javaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性。
比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。
控制器:当用户单击web页面中的提交按钮时,控制器接收请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结构。
用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户
MVC的处理过程:首先控制器接收用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结构。并通过视图呈现给用户。
如在项目中要对应MVC的话;View对应项目中的jsp,controler对应action,model对应service+dao层的业务逻辑和持久层的操作。
一、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在元素填满容器时会自动扩充 初始10 满后1.5倍扩容
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时序图。
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语句上, 使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对象完成数据库的增删改查操作。
关闭事务
释放资源
瞬时态 数据库中没有记录 不在session缓存中
持久态数据库中有记录 在session缓存中
游离态 数据库中有记录 但不在session缓存中
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()方法,从缓存中删除一个对象。
具体如下图所示:
14. 项目开发经历了哪几个阶段? 需求分析, 设计,编码, 测试,部署
需求分析,设计(找用例,写用例文本,找实体,编写数据字典,画数据流图),编码,测试,部署;
17. TCP/IP通讯和UDP通迅的区别?
UDP 发送数据需要打包, 发送数据大小限制64k 不区分 客户端和服务端 只有发送端和接收端
TCP 发送数据需要建立链接(三次握手), 服务端需要等待客户端的链接. TCP没有限制, 区分客户端和服务端
TCP的三次握手: 客户端发送 --整理
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
1).第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态, 等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
2).第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
45. 项目中用到了session对象吗,在哪里用到的?
登陆时,使用session保持用户信息。购物车制作时,使用session保持用户的购物信息
9、过滤器和拦截器的区别
拦截器的基于java反射机制的. 过滤器是基于函数回调的
拦截器是处理action 的 请求 过滤器处理所有请求
过滤器处理servlet 的
拦截器可以操作值栈,上下文.
拦截器执行多次,过滤器执行一次
拦截器是在方法前后执行一些操作. 过滤器是你传入的request,response提前过滤掉一些信息,或者提前设置一些参数
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前统一设置字符集,或者去除掉一些非法字符.
二、sql优化:(索引、范式)
范式:
第一范式(确保每列保持原子性)最基本范式。数据库表中所有字段值都是不可分解的原子值,就满足了第一范式。
第二范式(确保表中的每列都和主键相关)在第一范式上更近一层。确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关,也就是说一个表中只能保存一种数据,不可以吧多种数据保存在一张表中。
第三范式:确保每列都和主键列直接相关,不是间接相关。
索引:
避免对索引字段进行计算、避免索引在字段上使用not、<>、!=、避免在索引上使用IS NULL和NOT NULL、避免在索引列上出现数据类型转换、避免索引字段使用函数、避免建立索引的列出现空值