框架面试题(1)· 乱

1、struts2常量配置:        

 <constant name="" value="" />

* struts.i18n.encoding=UTF-8            -- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法

* struts.action.extension=action,,      -- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开

* struts.serve.static.browserCache=true     -- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

* struts.configuration.xml.reload=false     -- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用)

* struts.devMode = false                    -- 开发模式下使用,这样可以打印出更详细的错误信息

2、struts2的默认拦截器:

         logger chain model-driven validation prepare

         百度

3、struts2的核心控制器:

         FilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求;当用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts 2框架处理。

         Web.xml中配置:        

<!-- Struts2的核心过滤器 -->

<filter>

    <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

        

4、hibernate的5个核心接口:

         Configuration接口:配置Hibernate,根据其启动Hibernate,创建SessionFactory对象;

         SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建session对象,SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级二级缓存;

         session接口:负责保存、更新、删除、加载和查询对象,是一个非线程安全的,避免多个线程共享一个session,是轻量级,一级缓存。

         Transaction接口:管理事务。可以对事务进行提交和回滚;

         Query和Criteria接口:执行数据库的查询。

5、hibernate查询数据的方式有:

         HQL、Criteria、SQL

6、Spring的两个核心:

         Ioc  aop

7、SpringMVC的核心入口类:

         DispatcherServlet   

         <servlet> 

        <servlet-name>DispatcherServlet</servlet-name><!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。--> 

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 

        <!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。--> 

        <init-param> 

            <param-name>contextConfigLocation</param-name> 

            <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法--> 

            <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml--> 

            <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>--> 

            <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>--> 

            <!--4、多个值用逗号分隔--> 

            <param-value>classpath:spring/dispatcher-servlet.xml</param-value> 

        </init-param> 

        <load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servletp容器一起启动。--> 

    </servlet> 

    <servlet-mapping> 

        <!--这个Servlet的名字是dispatcher,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中.--> 

        <!--ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出--> 

        <servlet-name>DispatcherServlet</servlet-name> 

        <!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?--> 

        <!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。--> 

        <!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 --> 

        <url-pattern>/</url-pattern> <!--会拦截URL中带“/”的请求。-->  

    </servlet-mapping>

 

8、SpringMVC中的控制器的注释一般使用:

         @Controller 不能用其他注释代替

9、SpringMVC中的函数的返回值一般使用:

         Spring

10、SpringMVC中把视图和数据结合在一起的类是:

         ModelAndView

11、Mybatis的编程步骤

         Step1:创建SQLSessionFactory

         Step2:通过SQLSessionFactory创建SQLSession

         Step3:通过SQLSession执行数据库操作

         Step4:调用session.commit()提交事务

         Step5:调用session.close()关闭会话

12、Spring的ApplicationContext常用的实现有:

         (1)ClassPathXmlApplicationContext

                   ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");

         (2)FileSystemXmlApplicationContext

                   1)ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");//加载单个配置文件

                   2)

                   String[] locations = {"bean1.xml","bean2.xml","bean3.xml"};

                   ApplicationContextctx = new FileSystemXmlApplicationContext(locations?);//加载多个配置文件

         (3)XmlWebApplicationContext

                   ServletContext servletContext=request.getSession().getServletContext();

                   ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

13、Spring中常用的依赖注入方式DI:

         Set注入:指的就是在接受注入的类中定义一个Set方法,并在参数中定义需要注入的元素。

         构造注入:构造注入指的就是接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。

         @Resource和@Autowired的区别。@Resource默认是使用byName进行装配,@Autowired默认使用byType进行装配。

         Spring提供了五种自动装配的类型

no:显式指明不使用Spring的自动装配功能

byName:根据属性和组件的名称匹配关系来实现bean的自动装配

byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败

constructor:与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数

autodetect:利用Spring的自省机制判断使用byType或是constructor装配

 

14、struts2如何完成文件的上传

         前台页面的三大要素             

         1)form表单的提交方式必须是post提交         

         2)form表单的提交类型必须是enctype.必须多段式.enctype="multipart/form-data"           

         3)文件上传使用 <input type="file" name="photo" /> 组件、                  

         后台控制                  

         1)在后台提供一个与前台input type=file组件 name相同的属性 private File photo 并生成get/set方法 struts2会直接帮我们将上传的文件会自动封装到File对象         

         2)在需要的上传文件方法中直接使用 renameTo方法把上传文件保存到指定位置 photo.renameTo(new File("E:/upload/haha.jpg"));                      

         如果需要获得该上传文件的属性(name/type)

         在后台声明一个属性 既在提交键名后加上固定后缀FileName,文件名称会自动封装到属性中 private String photoFileName;

         并生成get/set方法                                                                                                                      

         在后台声明一个属性 既在提交键名后加上固定后缀ContentType,文件MIME类型会自动封装到属性中 private String photoContentType;并生成get/set方法           

15、hibernate的缓存机制

         Hibernate缓存的作用:

         Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据

         Hibernate缓存分类:

         Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存

         Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

         Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。

 

         什么样的数据适合存放到第二级缓存中?   

         1 很少被修改的数据   

         2 不是很重要的数据,允许出现偶尔并发的数据   

         3 不会被并发访问的数据   

         4 常量数据   

         不适合存放到第二级缓存的数据?   

         1经常被修改的数据   

         2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   

         3 与其他应用共享的数据。

 

         Hibernate查找对象如何应用缓存?

         当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存

         删除、更新、增加数据的时候,同时更新缓存

 

         Hibernate管理缓存实例

         无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。

         当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

16、struts2如何重定向和请求转发

         struts2配置文件的result默认使用请求转发方式跳转

         即:<result name="success"  [type="dispatcher"] >/success.jsp</result>

         使用请求转发方式:

         a)<result name="success" type="redirect">User.action?u_id=${loginBean.u_id}</result>

         b)<result name="success" type="redirectAction">User?u_id=${loginBean.u_id}</result>

         type:

                   dispatcher     ——  请求转发到一个页面 (默认),不可以用这种方式转发到一个action

                   chain           ——  一个action请求转发至另一个 action

                   redirect             ——  响应重定向到一个页面

                   redirectAction  —— 一个action响应重定向至另一个 action

                   stream             ——  文件下载

 

17、springMVC如何重定向和请求转发

         (1)在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"

(2)在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.com"

        

18、Hibernate与Mybatis对比

         首先简单介绍下两者的概念

                   Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。

                   Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。

         其次具体从几个方面说一下两者的区别:

         1).两者最大的区别

                   针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。

                   针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映,可以更专注于业务流程。

        

         2).开发难度对比

                   Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。

                   而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。

        

         3).sql书写比较

                   Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。不过没有自己的日志统计,所以要借助log4j来记录日志。

                   Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具有自己的日志统计。

        

         4).数据库扩展性比较

                   Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。

                   Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。

                  

         5).缓存机制比较

                   相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

                   不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

                   MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

         两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

         而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

        

         6).总结

         Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。

         而MyBatis的优势是MyBatis可以进行更为细致的SQL优化,可以减少查询字段,并且容易掌握。

         Hibernate的优势是DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

 

19、springMVC和struts2的区别有哪些?

(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。

(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

 

20、SpringMvc怎么和AJAX相互调用的?

通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :

(1)加入Jackson.jar

(2)在配置文件中配置json的映射

(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。

 

21、SpringMvc拦截器是怎么写的

有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器即可:

         <!-- 只针对部分请求拦截 -->

<mvc:interceptor>

               <mvc:mapping path="/modelMap.do" />

               <bean class="com.et.action.MyHandlerInterceptorAdapter" />

</mvc:interceptor>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值