面试笔记

1.使用Ajax的好处:
    可以通过JavaScript发送请求到服务器,并或得返回的结果,在必要的时候需要更新页面的一部分,而不要整个页面都刷新,也称为:“无刷新”技术  提供连续的用户体验,而不被刷新中断

2.什么是Ajax
  它是Asynchronous(异步的),JavaScript And Xml的简写;

3.Ajax的工作原理:
        1. 首先向服务器发送一个异步请求(在Action中创建相应的方法---)
       2. 创建 实例,设置回调函数
       3. 初始化XmlHttpRequest实例,发送请求 
        4. XmlHttpRequest实例.send(null)
       5. 对状态进行判段
       6. 读取xml文件获取文本值

4. hibernate实现的原理?(Hibernate的目标:是用来保存数据(持久化数据))
 1,读取并解析配置文件;
 2, 读取并解析映射信息,创建sessionFactory;
 3,打开session;
 4, 创建事务transation;
 5, 持久化操作;
 6. 提交事物commit;
 7, 操作失败rollback;
 8,关闭session;
 
5. hibernate 的优点和缺点?
  1.    对JDBC访问数据库的代码做了封装,大大简化     了数据访问层繁琐的重复性代码。

 2.    Hibernate是一个基于JDBC的主流持久化框架 ,是一个优秀的ORM实现。他很大程度的简化DAO 层的编码 工作

 3.    hibernate使用Java反射机制,而不是字节码  增强程序来实现透明性。

 4.    hibernate的性能非常好,因为它是个轻量级  框架。映射的灵活性很出色。它支持各  种关系数据库,从一对一到多对多的各  种复杂关系。
       缺点:限制了实体对象,一个实体对象不能映射成 多个表
 2.    不能对数据库操作进行优化
 3.    不适用于对数据的批量操作
 4.    不适用于对象关系不明确的操作

6. Struts工作机制?为什么要使用Struts?
 工作机制:
     在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象,当 ActionServlet接收到一个客户请求时,
         将执行如下流程.
     -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
     -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
      -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
     -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
      -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实 例,然后调用Action的execute()方法;
      -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给 ActionForward对象指向的JSP组件;
     -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

8.为什么要用:
    JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
  基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

6.Spring的部署环境?(目标:与业务相关(处理业务数据))
  1、spring依赖库
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
     --->拷贝spring,log4j配置文件到src下
    --> 在业务层的实现类中提供构造函数或setter方法,spring将实例化好的持久层实现注入给我们
     让spring管理我们的对象创建和依赖,必须在spring配置中进行定义 --->编写客户端
    

7.什么是框架?
      框架是提供可重用的公共结构的一个半成品,它集成了优秀的程序架构和前人的经验总结,使用框架可以帮助我们更快写出优秀,结构统一的程序;

8.struts中的标签:
     1.使用html标签"绑定"数据;
        使用过html标签进行页面编码;
     2.使用logic标签实现判断逻辑
         使用logic:notEmpty判断Bean值是否存在或非空
          使用logic:equal判断Bean值是否相等
         使用logic:iterate显示列表数据(负责集合数据的循环处理)
      3.使用bean对Bean值进行相关处理
           使用bean:write格式化输出(支持对数字和日期格式化)
           使用bean:define定义页面变量 可以简化取出Bean再定义为脚本 变量的过程和新的Bean
           使用bean:size得到集合数据记录数,它不会输出任何内容,只是取得值,并重新定义,方便其他标签或EL表达式应用,最终采用bean:write标签或EL表达式输出


9.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现 同时是一个“对象-关系映射”框架,它能很大
      程度地简化DAO层编码工作


10.为什么使用HQL?
      HQL是Hibernate提供的一种面向对象的查询语言,支持:属性查询、参数查询、关联查询、分页查询、统计函数      使用它避免使用JDBC查询的一些弊端,不要再些繁琐的SQl语句
      我们只要针对实体类及其属性进行查询,查询的结果直接放到List中的对象,不需要再次封装,对不同的数据库根        据方言自动生成不同的SQl语句
      步骤:得到Session,  编写HQL语句  ,创建Query对象(封装了设置参数,执行查询,设置返回数据的开始位置和      总的返回条数 ),  执行查询,得到结果
    

11.为什么使用Criteria查询?
     Criteria查处(又称为对象查询) 采用面向对象的方式(主要是Criteria对象)封装查询条件,并提供Restrictions等类别    做辅助,可以是编写查询代码更方便
     步骤 :得到Session,  创建Criteria对象(需要传入对应实体类的类型对象)  ,使用Restrictions对象的静态方法构造查询条件并添加进Criteria对象中;


12. 使用Spring好处?
      充当了粘合剂和润滑剂的角色,它对Struts,Hibernate等技术都提供了良好的支持,能够把现有的java系统柔顺的
       整合起来,同时自身还提供了声明式事物等企业开发不可或缺的功能


13.什么是依赖注入?
      就是明确的定义组建接口,独立开发各个组建,然后根据组件间的依赖关系组装运行的设计开发模式


14.什么是AOP
        从系统中分离出方面,然后集中实现,从而可以编写业务逻辑代码和方面代码,在系统运行的时候再将方面代码       “织入”到系统中

15.  Hibernate工作原理及为什么要用?
   原理:
   1.读取并解析配置文件
   2.读取并解析映射信息,创建SessionFactory
   3.打开Sesssion
   4.创建事务Transation
   5.持久化操作
   6.提交事务
   7.关闭Session
   8.关闭SesstionFactory

16.为什么要用:
   1.    对JDBC访问数据库的代码做了封装,大大简 化了数据访问层繁琐的重复性代码。
   2.    Hibernate是一个基于JDBC的主流持久化框架 ,是一个优秀的ORM实现。他很大程度的简化DAO 层的编码工作
   3.    hibernate使用Java反射机制,而不是字节码 增强程序来实现透明性。
   4.    hibernate的性能非常好,因为它是个轻量级 框架。映射的灵活性很出色。它支持各种关系数据 库,从一对一到多对 多的各种复杂关系。

17. Hibernate是如何延迟加载?
   1.  Hibernate2延迟加载实现:a)实体对象 b)集合 (Collection)
   2. Hibernate3 提供了属性的延迟加载功能
   当Hibernate在查询数据的时候,数据并没有存在 与内存中,当程序真正对数据的操作时,对象才存 在与内存中,就实现 了延迟加载,他节省了服务器 的内存开销,从而提高了服务器的性能。

18.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
   类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,  它们通过配 置文件中的many-to-one、one-to-many、many-to-many、


   优缺点: 1.    对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
    2.    Hibernate是一个基于JDBC的主流 持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 V
    3.    hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
    4.    hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复  杂关系。
   缺点:
    一个实体不能映射成多个表
    不能对数据库操作进行优化
    不适用于对数据进行批量操作
4. 说下Hibernate的缓存机制
    1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
    2. 二级缓存:
    a) 应用及缓存
    b) 分布式缓存
    条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
    c) 第三方缓存的实现

5. Hibernate的查询方式
    Sql、Criteria,object comptosition
    Hql:
    1、 属性查询
    2、 参数查询、命名参数查询
    3、 关联查询
    4、 分页查询
    5、 统计函数
 
6. 如何优化Hibernate?
    1.使用双向一对多关联,不使用单向一对多
    2.灵活使用单向一对多关联
    3.不用一对一,用多对一取代
    4.配置对象缓存,不使用集合缓存
    5.一对多集合使用Bag,多对多集合使用Set
    6. 继承类使用显式多态
    7. 表字段要少,表关联不要怕多,有二级缓存撑腰


7. Struts工作机制?为什么要使用Struts?
    工作机制:
    Struts的工作流程:
    在web应用启动时就会加载初始化ActionServlet,ActionServlet从
    struts-config.xml文件中读取配置信息,把它们存放到各种配置对象
    当ActionServlet接收到一个客户请求时,将执行如下流程.
        -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
        -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
        -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
        -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
        -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的                    Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
        -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
        -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;


为什么要用:
   JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

   基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件


   8. Struts的validate框架是如何验证的?
   在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。


9. 说下Struts的设计模式
   MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

10. spring工作机制及为什么要用?
    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
    2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
    3.DispatcherServlet请请求提交到目标Controller
    4.Controller进行业务逻辑处理后,会返回一个ModelAndView
    5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
    6.视图对象负责渲染返回给客户端。

11.为什么用:
    {AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务  (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。
        IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。
    Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。}


ssh----------->

11.  常用的Struts标签.迭代是用什么标签
    <logic:iterate>

1.方法中定义的变量?
    *不能有访问修饰符;
    *必须赋初始值;
    *修饰符为final的表示变量的生命
            周期与实例一样,且在方法体中不能改变它的值,
            否则方法调用完就就销毁;

2.final?
    *final修饰的类不能有子类;
    *final修饰的方法在子类中不能重写;
    *类中的成员属性用final修饰必须赋初始值;

3.方法的说明符
    *方法的访问说明符:
       public
       protected(不加访问说明符时)
       default
       private
   
     *方法的其它修饰符
       static
       final
       abstract
       native
       synchronized

4.内部类(当一个类继承的父类,与实现的接口中有相同的方法和成员属性时)
        *可以定义在方法中,语句中,类中;
        *static内部类只能访问外部类中的static成员属性,成员方法;
        *内部类访问外部类中的成员属性,要加: 外部类的名称 + this + 成员属性;
        *内部类要能访问方法中定义的变量(注意方法中定义的变量一定要赋初始值),
          则方法中定义的变量前要加final(final,为常量定义,改变了变量的生命周期);
        *内部类中有一个默认的成员属性,
             名称为:外部类的名称.this,引用外部类的实例;
          获得内部类的实例:
             1.在外部类中定义方法,该方法的返回值类型内部类;
             2.通过外部类的实例.new 内部类(),就可以得到内部类的实例;

5.集合:
        List,set,Map;
        set中的数据不能重复,list中装的数据可以重复;
        集合中装的数据只能为对象类型,
        且在集合中的值为对象的引用;
        List,set的父类是Collection;
        Collection与Collections区别;
           Collections该类中有很多的静态方法,用来操作集合;
             例子:
                List<Integer> ll = new ArrayList<Integer>();
  ll.add(5);
  ll.add(4);
  ll.add(3);
  System.out.println(ll.get(0));//5
  
  Collections.sort(ll);
  System.out.println(ll.get(0));//3
               
           Collection 是list,set的父类;
        集合的长度是size();
        字符串的长度:length();
        数组的长度为length;
        NodeList的长度为getLength();
        如何把数据增加到集合中去:
          list.add();
          set.add();
          map.put(键,值);
        如何把值从list,set,map中取出来:
           1.list可以用get(),也可以把其转化为iterator,再取值;
           2.set可以Iterator;
           3.map先把它的键转化为set,
             再itertor遍历set,得到键,由map.get()可以得到值;

6.线程的程序:
                 *运行main方法,jre开启一个后台线程;
                    a.Thread.currentThread().getName()
                      获得的当前运行该程序的线程的名称;
                    b.单线程的程序:第一条语句执行完后,
                                    再执行第二条语句;
                                    ............等
                    c.
                 *线程的定义:
                             第一种方式:
                                a.类名 extends Thread
                                重写run()方法;
                 *如何开启线程
                          Thread的实例.start();
                          一个Thread的实例对应一个线程;
                          不是调用Thread的实例的一次start()方法,
                          就开启一个线程;
                 *后台线程:
                           Thread的实例.start()是前台线程;
                           前台变为后台:
                                Thread tt =new TestThread();
                  tt.setDaemon(true);
                  如果所有线程都为后台,则程序会自动退出;   
                                如果后台线程已运行完,前台线程还会继续执行;
                 *线程的优先级:
                 *线程同步(synchronized):
                            同步代码块:
                                       重新在类中定义一个成员属性,
                                       用来做线程同步的监视器变量;
                                             
                            同步方法:
                                    监视器变量为(this):
                                       当线程执行到同步方法时,
                                       jre虚拟机马上在this所对应的方法上锁定,
                                       其他线程不能调用该同步方法;


7.servlet的生命周期:
       每调用一次servlet的url,
       是不是产生一个新的servlet实例?
      
       servlet的生命周期:
                  实例化:
                  init:
                  service:
                  destory:
                 
        servlet的实例化的方式:
            1.调用的时候,如表单,RequestDispatcher.forword();
            2.在web容器启动的时候:
                在<servlet>元素中增加一个子元素:
                <load-on-startup>1</load-on-startup>
                 load-on-startup的文本节点的值大于等于零,
                 则在web容器启动的时候,实例化servlet的实例;
                 小于零,则不实例化;
                 若有多个servlet,配置了<load-on-startup>
                 且他们的值不一样,值越小,容器先实例化;
                 他们的值一样,则在web.xml文件中,越在后面的先实例化
             3. init只执行一次;

8.servlet的路劲问题:
   ./   : 表示当前的路径;
   ../  :表示回到上一级路径;
  
   以上路径以当前页面为基准点,再定义到其它页面;
   request.getScheme()的值为:http
   request.getServerName()的值为:主机的ip地址或主机机器的名称;
   request.getServerPort()的值为:端口号;
   request.getContextPath()的值为:/ + 站点名;
  
   另一种方式:
         以站点名为统一的基准点,
         使用该种方式:必须在head中增加以下:
        
            <base href="<%=basePath%>">
             basePath:
             <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
      + request.getServerName() + ":" + request.getServerPort()
      + path + "/";
            %>   
  
 页面转化:
        RequestDispatcher disaptcher =request.getRequestDispatcher("ServletTest2");
      //disaptcher.include(request, response);该为页面包含;
       disaptcher.forward(request, response);
       url的地址不变,同用同一个request对象;
      
  页面重定向:
        response.sendRedirect("ServletTest2");
         url的地址变,不同用同一个request对象;

9.cookie:
       *服务器可以向客户端写内容;
       *只能是文本内容;
       *客户端可以阻止服务器写入;
       *只能拿自己的webapp写入的东西;
       *以‘名--值’对的形式出现;
       *.Cookie分为两种
            属于窗口/子窗口
            属于文本
       *一个servlet/jsp设置的Cookie能够被
         同一个路径下面或者子路径下面的servlet/jsp读到 
         (路径=url,路径!=真实的路径)   
       *可以使用Cookie的setXXX()方法来设定一些相应的值
              a.setName(String name) /getName();
              b.setValue(String value)/getValue();
              c.setMaxAge(int age)/getMaxAge();
              d.利用HttpServletResponse的addCookie(Cookie cookie)方法将它设置到客户端,
              e.利用HttpServletRequest的getCookie()方法来读取客户端的所有Cookie,返回一个Cookie数组;
       *设置cookie:
            见程序:SetCookies.java
       *读取Cookie
            见程序:ShowCookies.java
       * 设置了生命周期的cookie才能写入浏览器的cookie中;


10.Session的实现机制:
      *通过Cookie实现;
           如果浏览器支持Cookie,创建Session的时候会把SessionId保存在Cookie中;
           向服务器发送第一次请求的时候,
                 a.服务器马上产生一个Session,放在在服务器中;
                 b.把session的sessionId放在brower的cookie中;
                 c.之后在调用jsp或servlet的doGet()或doPost()方法,
                   同时把表单中的值及sessionId一起传给服务器;
                  
                  
      *通过url实现;
           如果不支持Cookie,必须自己编程使用URL重写的方式实现Session,
             Jsp中: response.encodeURL("url");
              servlet中:response.sendRedirect(
        response.encodeRedirectURL("uri"));
                  转码;
                  URL后面加入SessionId;
                 
                 
      *Session不象Cookie拥有路径访问的问题
          同一个application下的servlet/jsp可以共享同一个Session,前提是同一个客户端窗口
      *Session在用户第一向服务器产生的 ,
        为了跟踪当前用户;
        每打开一个浏览器客户端窗口,输入url,发送请求,
        就会产生一个Session实例;

11. 如何把map中装的值转化为成员属性所对应的数据类型;
                        a.通过获得成员属性的数据类型,
                          用相应的if语句进行转换:
                        b.转化器:
                            参数说明:
                                1. Class class1:要转化到数据类型
                                2. Object obj:要转化其他数据类型的值
                             
                            public abstract Object convert(Class class1, Object obj)

12.怎样创建监听器:(监听器类在容器一启动的时候就进行实例化)
 import javax.servlet.http.HttpSessionListener;
 public SessionListener(){
 System.out.println("---> session is constr");
 }
   public class SessionListener implements HttpSessionListener{
     public void sessionCreate(){
      htrtpsessionevet.getSession();
      System.out.println("---> session is Create");
     }
  
   }

13.怎样实现线程安全?
      *<第一种方案>
      用监听器

      *<第二种方案>
       把applicationContext作为类的成员属性要注意线程安全问题
       struts 的action的成员属性则必须有
       spring容器来钞,且 <bean>的属性必须为name ,且要把scope="prototype"  ,所请求必须有代理类来抄

      *<第三种方案>
      自己做回调类,从上下文取得ioc容器实列

14.类的说明符:
     类的访问说明符
       public
       default(不加访问说明符时):
              a.类的名称可以与类的文件名称不一样;
              b.java 加类名;
              c.类名第一字母要打写;
              d.public 类型的类必须与文件名一样;
             
     类的其它修饰符
       final
       abstract

15.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实例

16.el表达式 隐式对象:  获取getAttribute(String name)属性的值
    a. pageContext 
  可以访问ServletContext, Request, Response 和 Session 等对象
  ${pageContext.ServletContext.serverInfo}
  ${pageContext. Request.requestURL}
  ${pageContext.Response.characterEncoding}
  ${pageContext.session.creationTime}
 b. pageScope:
         类型是java.util.Map , 将页面范围内的属性名和它的值进行映射.主要用于获取页面范围内的属性的值. ${pageScope.user}
       c. requestScope:  ---  HttpServletRequest
        类型是java.util.Map , 将请求范围内的属性名和它的值进行映射.主要用于获
   请求范围内的属性值.  ${requestScope.user.age}
       d. sessionScope  --- HttpSession
    类型是java.util.Map , 将会话范围内的属性名和它的值进行映射.主要用于获
           会话范围内的属性的值. ${sessionScope.user.education}
       e. applicationScope:  --- ServletContext
      类型是java.util.Map , 将应用程序范围内的属性名和它的值进行映射.主要用于获取应用程序范围内的属性的值. ${applicationScope.user.education}
f. param  ----  getParameter( String name)
     类型是java.util.Map , 将请求中的参数的名字和单个参数值进行映射.主要用于获取请求的参数值(表单中的值和请求地址的值). ${ param.name }
g. paramValues  ---- getParameterValues(String name)
     类型是java.util.Map , 将请求中的参数的名字和该参数所有对应的值进行映射.主要用于获取请求的参数值.(表单中同名元素的值: 单选按纽, 复选按纽的值) ${ paramValues.sex } 等同于 ServletRequest.getParameterValues(String name);
h. header:     ---  ServletRequest.getHeader(String  name)
    类型是java.util.Map, 主要用于请求报头的值 ServletRequest.getHeader(String name)
    ${header[“User-Agent”]}  这里只能用”[]” 不能用 “.”
i. headerValues  ---  ServletRequests(String name)
   类型是java.util.Map, 主要用于请求报头的值ServletRequest.getHeaders(String name)  ${header[“User-Agent”]}  这里只能用”[]” 不能用 “.”
j. cookie
    类型是java.util.Map, 主要用于获取Cookie对象, 等同HttpServletRequest.getCookie() 从返回的Cookie数组中找到匹配名字的第一
          个Cookie对象 ${cookie.userinfo.name}
k. initParam.
   类型是 java.util.Map 主要用于获取Web应用程序初始化参数的值,等价于
   ServletContext.getInitParameter(String name), 在web.xml 文件中, 使用 <context-param>元素配置了一个driver参数


12.  Struts是否线程安全的,不是怎么处理使它安全.
不安全.
解决方法:
1.      采用单线程方式
在JSP文件中加上,使它以单线程方式执行,这时仍然只有一个实例,所有客户端的请求以串行方式执行.这样会降低系统的性能.
2.      对函数加synchronized进行线程同步,JSP仍然以多线程方式执行,但是也会降低系统性能.
3.      采用局部变量代替实例变量


13.  Struts中文乱码怎么处理
1、  所有HTML/JSP页面全部采用UTF-8编码
2、  客户端浏览器完全支持UTF-8编码


14.  Hibernate最常遇到一种异常
是空指针(ObjectNotFoundException).


15.  Hibernate session 的 get()和load()有什么区别
1. 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException
2. Load方法可返回实体的代理类实例,而get方法永远直接返回实体类.
3. load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。


16.  Hibernate延长加载
1. 实体对象的延迟加载
在set中指定lazy=true
这样只有实际加载与对象相关联的集合对象的时候,再通过session从数据库中加载实际的数据集
2. 属性延迟加载
在property节点中声明lazy=true,而且还需要借助Hibernate类增强器对POJO类的二进制Class文件进行强化处理.


17.  Hibernate中事务怎么处理
Hibernate有三种事务
1. JDBC 2. JTA事务 3. CMT事务
在这三种事务中,JDBC事务是默认的。这就意味着如果未设置hibernate.properties文件中的hibernate.transaction_factory的键值,beginTransaction将返回一个JDBC事务。
    虽然一个会话中可以包含多个事务,但并不需要人为地对这些事务进行分割,而是由会话中的一些方法对多个事务进行管理的。下面将详细描述这些方法:
commit()方法是结束事务的两个方法。在这方法在内部调用了会话对象的save()方法。当调用这个方法时,如果这个事务已经被初始化,那么这个事务将成功提交。


18.  说说Spring AOP和IOC
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程,面向切面编程(事物和权限管理形成一个切面,相当于一个过滤器(把共有的信息放到里面来)调用方法时就要先经过这个切面,什么是切点,什么时切面?) AOP非常适合开发J2EE容器服务器.
IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转. 管理对象依赖注入

19.struts和Spring是怎么的继承
   每个控制那一个IOC实例
   每个表对应一控制
   方法:自己重写ContextLoaderLIstener方法,在Web容器中配置,一开启的时候就调用方法
   重写XMlWebApplicationContext将配置文件放到上下文中;
20.注入SessionFactory的时候?
    注入的是:LocalSessionFactoryBean类型的,而我们需要的是SessionFactory类型的(成员属性或子类不同)
              解决的原因:因为实现了FacotryBean接口
              要实现接口中山个方法:
              在spring配置文件中配置
              <bean class="包名+类名" id="localsessionfactorybean" >
              </bean>
              通过ApplicationContext  app= new ClassPathxmlApplicationcontext("配置文件的Id值");
        FactoryBean放回的类型要看getObject()此方法是重写父类中的)放回的值
            
  IOC造对象的范围:
     有五种:Request,session,prototype,singleon,globalsession
 
struts1.x的缺陷?
   1.它是一个轻量级的框架
   2.值提供整个表单提交,不能当数据提交
   3.页面是能是jsp页面
hibernate是怎么实现延时加载的?
   在web容器中配置一个过滤器org.springframewrok.orm.hibernate3.support.OpenSessionInViewFilter
   <filter>
    <filter-name>opensession</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   </filter>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一些 Spring Boot 面试时可能会涉及的重要知识点和面试建议: 1. 什么是 Spring Boot? Spring Boot 是 Spring 框架的一个子项目,它基于 Spring 框架,简化了 Spring 应用的配置和开发过程,使得开发者可以更加便捷地创建独立、生产级别的 Spring 应用。Spring Boot 提供了自动化配置、开箱即用的组件和快速启动的能力,使得开发者可以更加专注于业务逻辑的实现。 2. Spring Boot 有哪些优点? - 简化了 Spring 应用的配置和开发过程。 - 集成了众多常用的第三方库,可以快速地搭建项目。 - 提供了自动化配置和开箱即用的组件,使得开发者可以更加专注于业务逻辑的实现。 - 与 Spring Framework 完美集成,可以很方便地使用 Spring 的各种功能。 - 支持多种开发方式,包括传统的 WAR 包部署、嵌入式服务器部署、Docker 容器化部署等。 3. Spring Boot 的核心注解有哪些? - @SpringBootApplication:用于标记 Spring Boot 应用的主类,它包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解,可以简化应用的配置和启动过程。 - @Controller、@Service、@Repository、@Component:用于标记 Spring Bean,可以自动扫描并注册到 Spring 容器中。 - @Autowired、@Resource、@Inject:用于依赖注入,可以自动装配 Spring Bean。 4. Spring Boot 的配置文件有哪些? Spring Boot 支持多种配置文件格式,包括 properties、yml、json 等。其中,application.properties 或 application.yml 是 Spring Boot 默认的配置文件,它可以放在项目的 classpath 下,也可以通过指定 spring.config.location 属性来指定配置文件的路径。 5. Spring Boot 的自动配置原理是什么? Spring Boot 的自动配置基于条件注解和条件判断,它会根据应用的上下文环境和 classpath 中的依赖库来自动配置 Spring Bean。例如,当 classpath 中存在 HikariCP 库时,Spring Boot 会自动配置一个 HikariCP 数据源,而不需要手动配置。 6. Spring Boot 如何处理异常? Spring Boot 提供了统一的异常处理机制,可以通过 @ControllerAdvice 和 @ExceptionHandler 注解来处理应用中的异常。在异常处理类中,可以通过 @ExceptionHandler 注解和方法参数来定义需要处理的异常类型和异常处理逻辑。 7. Spring Boot 如何实现 AOP? Spring Boot 集成了 Spring Framework 的 AOP 功能,可以通过 @Aspect 和 @Around 注解来实现切面编程。在切面类中,可以定义需要拦截的方法和拦截逻辑,以实现日志记录、权限控制等功能。 8. Spring Boot 如何实现事务管理? Spring Boot 集成了 Spring Framework 的事务管理功能,可以通过 @Transactional 注解来实现事务控制。在需要进行事务控制的方法上添加 @Transactional 注解,即可开启事务。 9. Spring Boot 如何集成数据库? Spring Boot 支持多种数据库,包括 MySQL、Oracle、MongoDB 等,可以通过在 pom.xml 中添加相应的依赖库来实现数据库的集成。同时,Spring Boot 也提供了多种数据库访问方式,包括 JDBC、JPA、MyBatis 等,可以根据实际需求选择合适的方式。 10. Spring Boot 如何实现缓存? Spring Boot 集成了多种缓存框架,包括 Ehcache、Redis、Caffeine 等,可以通过在 pom.xml 中添加相应的依赖库来实现缓存功能。同时,Spring Boot 也提供了多种缓存注解,包括 @Cacheable、@CachePut、@CacheEvict 等,可以方便地实现缓存功能。 面试建议: - 对于 Spring Boot 的基本原理和使用方法要有深入了解,并能够熟练使用 Spring Boot 搭建项目。 - 对于 Spring Boot 中常用的注解和配置文件要熟练掌握。 - 对于 Spring Boot 中的高级功能(如自动配置、AOP、事务管理、缓存等)要有一定的了解,并能够根据实际需求进行应用。 - 在面试中要注意表达清楚自己的观点和思路,可以通过实际项目经验来证明自己的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值