zoukankan      html  css  js  c++  java
  • 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避免在索引列上出现数据类型转换、避免索引字段使用函数、避免建立索引的列出现空值

  • 相关阅读:
    苹果信息推送服务(Apple Push Notification Service)使用总结
    Xcode 相关路径总结
    微信红包随机算法 OC
    Xcode真机测试could not find developer disk image解决方法
    字典转模型 重写初始化方法
    Xcode 写代码没有补全提示解决:删缓存及显示隐藏文件命令
    按位与、或、异或等运算方法
    OC语言@property @synthesize和id
    iOS开发—Quartz2D简单介绍
    iOS开发—CoreLocation定位服务
  • 原文地址:https://www.cnblogs.com/shan1393/p/8984579.html
Copyright © 2011-2022 走看看