2017 厦门初级Java开发工程师面试题集锦

Java基础

基本数据类型有哪些 包装类有哪些

基本数据类型

包装类

大小

范围

默认值

byte

Byte

8

-128 ~ 127

0

boolean

Boolean

1

True/false

False

short

Short

16

-32768 ~ 32基础768

0

char

Character

16

‘\u0000 - u\ffff ‘

‘\u0000 ’

int

Integer

32

 

0

long

Long

64

 

0

float

Float

32

 

0.0f

double

Double

64

 

0.0d

 












包装类均位于java.lang包, 对于包装类说,这些类的用途主要包含两种:

        a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。

        b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

字符,字符串,数字之间的转换

1.string和int之间的转换

    string转换成int  

       Integer.valueOf(str)返回的是Integer对象,

       Integer.paseInt(str)返回的是int

    int转换成string:         String.valueOf(12)

2.char转换成string:       String str=String.valueOf('2')

String , StringBuffer和StringBuilder的区别?

       String类表示内容不可改变的字符串。而StringBuffer和StringBuilder类表示内容可以被修改的字符串。

       StringBuilder是线程不安全的,运行效率高,如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer;

字符串的常用方法

1.       获取长度*.length();

2.       比较字符串

(1) equals()   //判断内容是否相同

(2)compareTo()   //判断字符串的大小关系

(3)compareToIgnoreCase(String int)     //在比较时忽略字母大小写

(4)==     //判断内容与地址是否相同

(5)equalsIgnoreCase()       //忽略大小写的情况下判断内容是否相同

3.       查找字符串中某个位置的字符

public char charAt(int index);   //返回指定位置上的字符,索引index范围从0开始

4.       查找指定字符串在字符串中第一次或最后一词出现的位置

查找指定位置的字符串第一次出现的位置的方法:

(1)indexOf(String str);//从字符串开始检索str,并返回第一次出现的位置,未出现返回-1 

(2indexOf(String str,int fromIndex);//从字符串的fromIndex个字符开始检索str 

       查找最后一次出现的位置有两种方法

(1)public int lastIndexOf(String str); 

(2)public int lastIndexOf(String str,int fromIndex); 

       如果不关心字符串的确切位置则可使用: public boolean contains(CharSequence s);

5.       检查字符串的起始字符和结束字符

开始的字符串两种方法

(1)public boolean starWith(String prefix,int toffset);//如果参数prefix表示的字符串序列是该对象从索引toffset处开始的子字符串,则返回true 

(2)public boolean starWith(String prefix); 

结束的字符串方法

(3)public boolean endsWith(String suffix);

6.       截取子串

(1)public String subString(int beginIndex); 

(2)public String subString(int beginIndex,int endIndex);//返回的字符串是从beginIndex开始到endIndex-1的串

例:要返回后4位可以这样写

Syetem.out.println(*.subString()(*.length()-4));

7.       字符串的替换两种方法

(1)public String replace(char oldChar,char newChar); 

(2)public String replace(CharSequence target,CharSequence replacement);//把原来的etarget子序列替换为replacement序列,返回新串

(3)public String replaceAll(String regex,String replacement);//用正则表达式实现对字符串的匹配

8.       字符串的大小写替转换

(1)public String toLowerCase(Locale locale); //大转小

(2)public String toLowerCase(); 

(3)public String toupperCase(Locale locale);       //小转大

(4)public String toUpperCase()

9.       去除字符串中空格

首尾空格       *.trim();

去掉所有空格,包括首尾、中间      str.replace("", "");
              例:Stringstr = " hell o "; 
              String str2 =str.replaceAll(" ", ""); 

10.    字符串转换

将字符串转换成字符数组  public char[] toCharArray(); 

将字符串转换成字符串数组public String[] split(String regex);//regex 是给定的匹配

将其它数据类型转化为字符串

(1)public static String valueOf(boolean b); 

(2)public static String valueOf(char c); 

(3)public static String valueOf(int i); 

(4)public static String valueOf(long i); 

(5)public static String valueOf(float f); 

(6)public static String valueOf(double d); 

(7)public static String valueOf(char[] data); 

(8)public static String valueOf(Object obj); 

数组冒泡排序

n个数字来比较,两层循环来嵌套, 外层循环N-1,内层循环N-1-i,两两相比小靠前

List,Map,set的区别是什么?

List:

(1)可以允许重复的对象

(2)可以插入null元素

(3)是一个有序的容器,保持了每个元素的插入顺序,输出顺序就是插入的顺序

(4)常用的实现类有,ArrayList,LinkedList和Vector。

ArrayList随机访问速度快

LinkedList插入和删除的速度比较快

Set:

(1)不允许重复的对象

(2)无序的容器,你无法保证每个元素的存储顺序,TreeSet通过Comparator或Comparable维护了一个排序的顺序。

(3)只允许一个null元素

(4)set接口最流行的几个实现类是:HashSet,LinkedHashSet以及TreeSet。最流行的是基于HashMap的实现HashSet;还实现了SortedSet接口

因此TreeSet是一个根据其compare()和compareTo()的定义进行排序的有序容器。

Map:

(1)Map的每条数据都持有两个对象,也就是一个键一个值,Map可能会持有相同的值对象但键对象必须为唯一的。

(2)Map不是collection的子接口或者实现类,Map是一个接口。

(3)TreeMap也是通过Comparator或者Comparable维护了一个排序顺序。

(4)Map里可以拥有随意个null值,但是最多只能有一个null键。

(5)Map接口最流行的几个实现类HashMap,LinkedHashMap,HashTable

C/S B/S 优缺点

C/S是Client/Server(客户端/服务器)的缩写。客户端需要安装专用的客户端软件。

优点:   C/S架构的界面和操作可以很丰富。

安全性能可以很容易保证,实现多层认证也不难。

由于只有一层交互,因此响应速度较快。

缺点:   适用面窄,通常用于局域网中。

用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。

维护成本高,发生一次升级,则所有客户端的程序都需要改变。

B/S是Brower/Server(浏览器/服务器)的缩写,客户机上只要安装一个浏览器(Browser)

优点:   客户端无需安装,有Web浏览器即可。
              BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
              BS架构无需升级多个客户端,升级服务器即可。

缺点:   在跨浏览器上,BS架构不尽如人意。
                     表现要达到CS程序的程度需要花费不少精力。
                     在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题。

反射是什么?(注意,不是映射)

反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)开放性和原因连接是反射系统的两大基本要素。

优点:

1、反射提高了程序的灵活性和扩展性。

2、降低耦合性,提高自适应能力。

3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

 

前端

get跟post的区别

get是从服务器上获取数据,安全性非常低,get传输数据小;

post是向服务器传送数据,post安全性较高。,post可以传输数据量大.

forward和redirect的区别

(1)重地址栏来说

forward是服务器请求资源,服务器直接访问目标地址的URL,吧那个url的响应内容读取出来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来,所以他的地址栏还是原来的地址。

redirect是服务端根据逻辑,发送的一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是最新的URL.

(2)从数据共享来说

forwad:转发页面和转发到页面可以共享request里面的数据

redirect:不能共享数据

(3)重运用的地方来说

forward:一般用于用户登录的时候,根据角色转发到响应的模块

redirect:一般用于用户注销登录,返回主页面和跳转到其他的网站等。

(4)从效率来说

forward:高

redirect:低

JSP九大内置对象

1:Request对象: 客户端的请求被分装在request对象中,通过他才了解用户的需求,然后做出响应。

2:response对象:包含了响应客户请求的有关信息,但是在JSP中很少用到它。

3:session对象:指的是客户端和服务端的一次回话,从客户连到服务器的一个文本Application开始,直到客户端与服务器断开连接为止。

4:out对象:out对象是JSPWriter类的实例,是向客户端输出内容常用的对象。

5:page对象:就是指当前jsp页面本身,有点象类中的this指针。

6:application对象:实现了用户间数据共享,可存放全局变量,它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在。

7:exception对象:是一个例外对象,当一个页面在运行时过程中发生了例外,就产生这个对象。

8:pageContext对象:提供了对jsp页面内所在的对象及名字空间的访问,也就是说他可以访问到本页所在的session,

也可以取本页所在的application的某一属性的值,他相当于页面中所有功能的集大成者。

9:config对象:是在一个Servlet初始化,JSp引擎向他传递信息用的,

此信息包括Servlet初始化所要用到了参数以及服务器的有关信息(通过传递一个ServletContext对象)。

使用jquery如何获取复选框的值

$("document").ready(function(){

$("#btn1").click(function(){

$("[name='checkbox']").attr("checked",'true');//全选

$("[name='checkbox']").removeAttr("checked");//取消全选

$("[name='checkbox']:even").attr("checked",'true');//选中所有奇数

$("[name='checkbox']").each(function(){//反选

var str="";  //输出选中的值

$("[name='checkbox'][checked]").each(function(){

str+=$(this).val()+"/r/n";

alert(str);

});

});

});

})

如何获取Select下拉框的值和文本用JS或者jquery写出来

一:javascript原生的方法

1:拿到select对象:var  myselect=document.getElementById("test");

2:拿到选中项的索引:varindex=myselect.selectedIndex ;

3:拿到选中项options的value: myselect.options[index].value;

4:拿到选中项options的text: myselect.options[index].text;

二:jquery方法(前提是已经加载了jquery库)

1:var options=$("#testoption:selected");  //获取选中的项

2:alert(options.val());   //拿到选中项的值

3:alert(options.text());  //拿到选中项的文本

Jquery有哪些选择器

一、基本选择器
1. id选择器(指定id元素)
       将id="one"的元素背景色设置为黑色。(id选择器返单个元素)
       $(document).ready(function () {
              $('#one').css('background', '#000');
       });
2. class选择器(遍历css类元素)
       将class="cube"的元素背景色设为黑色
       $(document).ready(function () {
              $('.cube').css('background', '#000');
       });
3. element选择器(遍历html元素)
       将p元素的文字大小设置为12px
       $(document).ready(function () {
              $('p').css('font-size', '12px');
       });
4. * 选择器(遍历所有元素)
       $(document).ready(function () {
               // 遍历form下的所有元素,将字体颜色设置为红色
              $('form *').css('color', '#FF0000');
       });
5. 并列选择器
       $(document).ready(function () {
              // 将p元素和div元素的margin设为0
              $('p, div').css('margin', '0');
       });
二、 层次选择器
       1. parent > child(直系子元素)
              $(document).ready(function () {
              // 选取div下的第一代span元素,将字体颜色设为红色
              $('div > span').css('color', '#FF0000');
       });
2. prev + next(下一个兄弟元素,等同于next()方法)
       $(document).ready(function () {
              // 选取class为item的下一个div兄弟元素
              $('.item + div').css('color', '#FF0000');
              // 等价代码
              //$('.item').next('div').css('color', '#FF0000');
       });
3. prev ~ siblings(prev元素的所有兄弟元素,等同于nextAll()方法)
       $(document).ready(function () {
              // 选取class为inside之后的所有div兄弟元素
              $('.inside ~ div').css('color', '#FF0000');
              // 等价代码
              //$('.inside').nextAll('div').css('color', '#FF0000');
       });
三、 过滤选择器
1. 基本过滤选择器
       ——1.1 :first和:last(取第一个元素或最后一个元素)
       $(document).ready(function () {
              $('span:first').css('color', '#FF0000');
              $('span:last').css('color', '#FF0000');
       });
       ——1.2 :not(取非元素)
       $(document).ready(function () {
              $('div:not(.wrap)').css('color', '#FF0000');
       });
       ——1.3 :even和:odd(取偶数索引或奇数索引元素,索引从0开始,even表示偶数,odd表示奇数)
       $(document).ready(function () {
              $('tr:even').css('background', '#EEE'); // 偶数行颜色
              $('tr:odd').css('background', '#DADADA'); // 奇数行颜色
       });
       ——1.4 :eq(x) (取指定索引的元素)
       $(document).ready(function () {
              $('tr:eq(2)').css('background', '#FF0000');
       });
       ——1.5 :gt(x)和:lt(x)(取大于x索引或小于x索引的元素)
       $(document).ready(function () {
              $('ul li:gt(2)').css('color', '#FF0000');
              $('ul li:lt(2)').css('color', '#0000FF');
       });
       ——1.6 :header(取H1~H6标题元素)
       $(document).ready(function () {
              $(':header').css('background', '#EFEFEF');
       });
2. 内容过滤选择器
       ——2.1 :contains(text)(取包含text文本的元素)
       $(document).ready(function () {
              // dd元素中包含"jQuery"文本的会变色
              $('dd:contains("jQuery")').css('color', '#FF0000');
       });
       ——2.2 :empty(取不包含子元素或文本为空的元素)
       $(document).ready(function () {
              $('dd:empty').html('没有内容');
       });
       ——2.3 :has(selector)(取选择器匹配的元素)
       $(document).ready(function () {
              // 为包含span元素的div添加边框
              $('div:has(span)').css('border', '1px solid #000');
       });
       ——2.4 :parent(取包含子元素或文本的元素)
       $(document).ready(function () {
              $('ol li:parent').css('border', '1px solid #000');
       });
3. 可见性过滤选择器
       ——3.1 :hidden(取不可见的元素)
    
        $(document).ready(function() {
            $('div:hidden').show(500);
            alert($('input:hidden').val());
        });
    
       ——3.2 :visible(取可见的元素)
      
              $(document).ready(function() {
                     $('div:visible').css('background', '#EEADBB');
              });
      
4. 属性过滤选择器
       ——4.1 [attribute](取拥有attribute属性的元素)
       下面的代码,最后一个a标签没有title属性,所以它仍然会带下划线
      
              $(document).ready(function() {
              $('a[title]').css('text-decoration', 'none');
              });
              
       ——4.2 [attribute = value]和[attribute != value](取attribute属性值等于value或不等于value的元素)分别为class="item"和class!=item的a标签指定文字颜色

Ajax默认是异步还是同步

Jquery中的ajax在默认不写async情况下,请求为异步请求,如果项目中在做一项操作之前要进行ajax的验证,无论同步或者异步,都必须在验证通过后,方才进行其他操作,项目前端做验证,后端也做相应的验证;前端做验证是为了减少服务器压力和增加用户体验,后端做验证才是为了安全.

Ajax如何把异步改成同步

在全局设置Ajax属性  $.ajaxSetup({ async: false });  再用post,get就是同步的了

Ajax必须用到的参数有哪些

必要参数:      url: url,
                         success:function(data) { //对data值进行判断   }

Ajax有哪些参数

1.url:  要求为String类型的参数,(默认为当前页地址)发送请求的地址。

2.type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。

3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。

4.async: 要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。

5.dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:
         xml:返回XML文档,可用JQuery处理。
         html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
         script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
         json:返回JSON数据。
         jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
         text:返回纯文本字符串。

6.success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
              (1)由服务器返回,并根据dataType参数进行处理后的数据。
              (2)描述状态的字符串。
                    function(data,textStatus){
                          //data可能是xmlDoc、jsonObj、html、text等等
                          this;  //调用本次ajax请求时传递的options参数
                    }

7.error: 要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:
              function(XMLHttpRequest, textStatus,errorThrown){
                    //通常情况下textStatus和errorThrown只有其中一个包含信息
                     this;   //调用本次ajax请求时传递的options参数
             }

c:forEach varStatus属性有哪些方法:

current当前这次迭代的(集合中的)项

index当前这次迭代从 0 开始的迭代索引

count当前这次迭代从 1 开始的迭代计数

first用来表明当前这轮迭代是否为第一次迭代的标志

last用来表明当前这轮迭代是否为最后一次迭代的标志

begin属性值

end属性值

step属性值

c:forEach如何判断是最后一次循环

 

数据库

SQL分页语句

适用于 SQLServer

SELECT TOP 页大小 * FROM table1 WHERE id NOT IN(

SELECT TOP 页大小*(页数-1)id FROM table1 ORDER BY id )
ORDER BY id

适用于MySql

select * from table limit (页码-1)*页面大小, 页面大小

适用于oracle(根据ROWID来分)

select * from t_xiaoxiwhere rowid in(

select rid from (

select rownum rn,rid from(

select rowid rid,cid from  t_xiaoxi  order by cid desc)

where rownum<10000)

where rn>9980)

order by cid desc

Sql中什么时候使用in

Where之后条件有多个值时使用

MySQL左连接语句,左连接与右连接的区别

左外连接:

select a.a, a.b, b.c, b.d, b.f from a LEFT(OUT )JOIN b ON a.a = b.c

left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录.

右外连接:

SELECT * FROM A RIGHT JOIN B ONA.aID = B.bID

Right join是以右表(B)为基础的,A表不足的地方用NULL填充.

数据库如何优化

1.      分散数据文件,可以提高读写效率:建立多个数据文件,把索引放到独立的文件中等。

2.      及时转储历史数据,提高写性能。

3.      优化程序的SQL语句

 

事务/多线程

事务是什么

事务是指访问并可能更新数据库中各种数据项的一个程序执行单元。

事务的注解:@Transactional;当标于类前时, 标示类中所有方法都进行事物处理,当类中某些方法不需要事物时在方法上添加@Transactional(propagation=Propagation.NOT_SUPPORTED)容器不为这个方法开启事务.

什么时候用到事务

当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。

创建多线程的方式有几种

1.      通过继承Thread类创建线程:

(1)    首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

(2)    直接创建一个ThreadTest类的对象,也可以利用多态性,变量声明为父类的类型。调用start方法,线程启动,隐含的调用run()方法。

2.      通过实现Runnable接口

(1)    创建线程定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

(2)    创建Runnable接口实现类的对象。创建一个ThreadTest类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)调用Thread对象的start()方法,启动线程

用什么方法让线程停止?线程停止后用什么方法开始继续运行

答:Wait(等待执行)、sleep(延时效果)、interrupt(终止线程)、唤醒wait用notify定时器待做;

 

虚拟机

什么是JVM?JVM的工作原理?

JVM:Java虚拟机,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是

通过在实际的计算机上仿真模拟各种计算机功能来实现的。

虚拟机可以单独的运行,可以一台电脑都是开多个程序。

Java平台的无关性,就是使用Java虚拟机是实现这一特点的关键。

JVM的工作原理:

(1)java源代码 

(2)Java编译器

(3)Java字节码(.clas文件)

(4)字节码本地或网络

(5)类装载器字节码的验证(Java的类库)

(6)(Java虚拟机)Java解释器,即编译器,运行期系统。

(7)操作系统。

(8)硬件

jdk和jre的区别

JDK开发工具包

JRE运行时的类库

JVM(Java虚拟机)

JDK包含JRE包含JVM

 

后台框架

spring框架配置文件中有哪些东西

1:配置数据源 (driverClassName, url , username , password)
2:配置bean(sessionFactoryBean)
3:配置事务(transactionManager)

Spring和springmvc的区别 

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;

Spring mvc是一个MVC开源框架,属于spring,spring需要有spring的架包作为支撑才能跑起来.

Aop和ioc的工作原理

aop是面向切面编程,语言、框架的发展都是一步步的分离、解耦的过程,来降低程序之间的依赖性和耦合性,使其达到标准、易维护、易理解、易复用等目的。java中一般会说这样的一句话:“一个方法只做一件事情”。这样易复用、易理解、易维护。但是现在很多方法无法做到只做一件事情,我们的方法除了包含业务逻辑代码外还需要加例如日志、事务等相关操作的代码或代码引用。这样我们一个方法就不是做一件事情,而是做了业务逻辑、日志、事务三件事情。于是我们想办法把日志、事务定义成一个切面,这样可以在代码需要日志和事务的时候切入程序。来达到一个方法只做一件事情的目的。

mvc是什么

MVC(模型Model-视图View-控制器Controller)是一种设计模式,当用户发出请求的时候,控制器根据请求来选择要处理的业务逻辑和要选择的数据,再返回去把结果输出到视图层,这里可能是进行重定向或转发等.

模型:模型是应用程序的主题部分,模型表示业务数据或者业务逻辑

视图:视图是应用程序中用户界面相关部分,是用户看到并交互的界面

控制器:控制器工作就是根据用户输入,控制器用户界面数据显示和更新model对象状态。

Springmvc的注解有哪些,请讲几个常用的出来

1).@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名,名称开头字母小写,你也可以自己指定

2). @RequestMapping用来定义访问的URL,你可以为整个类定义一个@RequestMapping,或者为每个方法指定一个。 把@RequestMapping放在类级别上,这可令它与方法级别上的@RequestMapping注解协同工作,取得缩小选择范围的效果。@RequestMapping用于整个类不是必须的,如果没有配置,所有的方法的访问路径配置将是完全独立的,没有任何关联。

3).@PathVariable用于方法中的参数,表示方法参数绑定到地址URL的模板

4).@ModelAttribute 应用于方法参数,参数可以在页面直接获取,相当于request.setAttribute(,) ,应用于方法,将任何一个拥有返回值的方法标注上 @ModelAttribute,使其返回值将会进入到模型对象的属性列表中. 应用于方法参数时@ModelAttribute("xx"),须关联到Object的数据类型,基本数据类型 如:int,String不起作用 
       5).@ResponseBody 直接放在方法上,表示返回类型将会直接作为HTTP响应字节
流输出(不被放置在Model,也不被拦截为视图页面名称)。可以用于ajax。

6).@RequestParam是一个可选参数,例如:@RequestParam("id") 注解,所以它将和URL所带参数 id进行绑定 ;

 

拦截器里面的三个方法名称叫什么

SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。

struts框架运行流程

1.用户的发出请求,(比如http:localhost:8080/Struts2/helloworld/helloworldAction.action)请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。

2.Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,由struts2这个过滤器来进行处理(也就是StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)

3.然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理( FilterDispatcher是任何一个Struts2应用都需要配置的,通常情况下,web.xml文件中还有其他过滤器时,FilterDispatcher是放在滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器)这时FilterDispatcher会将请求转发给ActionMapper.

4.如果需要Struts2处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。然后建立一个ActionProxy实例,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。

5.ActionProxy对象在被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。而真正知道要运行哪个Action的是ConfigurationManager。因为只有它才能读取我们的strtus.xml

6.ActionProxy知道自己该干什么事之后(运行哪个Action、相关的拦截器以及所有可能使用的result信息),然后马上建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。

7.在execute方法之前,好像URL请求中的参数已经赋值到了Action的属性上,然后执行Action的execute方法,然后根据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面,根据结果(Result)找到页面后,在页面上(有很多Struts2提供的模板),可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面.

Mybatis中sql语句的#跟$的区别

使用#{}意味着使用的预编译的语句,可以防止sql注入,在组成sql语句的时候把参数默认为字符串;

使用${}时的sql不会当做字符串处理,是什么就是什么;

mybitis insert语句如何返回主键

在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能

 

 

Hibernate

答:是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将Pojo与数据库表建立映射关系,是一个全自动的ORM框架,

hibernate可以自动生成sql语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

 

项目经验

权限功能如何实现

根据用户角色取出该角色所有权限,并对用户进行权限分配;

1. 新增用户时,是要根据用户角色进行分配权限的 一定记得批量添加;

2. 修改用户角色也要记得重新分配用户权限;

3. 最后要优化的就是根据用户查询权限,查询角色权限,用户权限,返回到前端,前端进行处理;首先根据 角色ID查询出权限,然后子查询用户是否有该权限,有返回1 没有返回 0;

报表如何实现

finereport报表软件的导入报表过程:
读取某一路径下的模板cpt文件,并将其转为WorkBook对象,有两种读取报表的方法:
1.1 绝对路径读取模板
       // 读取模板
       File cptfile = newFile("C:\\FineReport6.5\\WebReport\WEB-INF\\reportlets\\gettingstarted.cpt");
       TemplateImporter tplimp = newTemplateImporter();
       WorkBook workbook =tplimp.generateTemplate(cptfile);
1.2 读取报表运行环境下的模板
       //定义报表运行环境,读取环境下的报表
       String envPath = "C:\\FineReport6.5\\WebReport \\WEB-INF";
       FRContext.setCurrentEnv(newLocalEnv(envPath));
       TemplateWorkBook workbook =FRContext.getCurrentEnv().readTemplate("gettingstarted.cpt");

你可能感兴趣的:(面试题集锦)