面试某公司JAVA开发工程师准备试题

(1)有没有进行过HTML编程??

HTML是Hyper Text Markup Language的缩写,意思是“超文本标识语言”,它实际上是专门用来编写网页的一种编程语言。大多数网页的构成基础就是HTML的语句。

HTML文档的基本结构:


(2)平时都用的什么数据库??

1.MySQL

2.SQL SERVER 2008

(3)会不会部署TomCat??

1.静态部署

静态部署指的是我们在服务器启动之前部署我们的程序,只有当服务器启动之后,我们的Web应用程序才能访问。

以下3种方式都可以部署:

1.利用Tomcat自动部署

将PetWeb目录拷贝到$CATALINA_HOME/webapps下,然后启动服务器就可以了,Tomcat启动时将自动加载应用。

访问地址如下:http://localhost:8080/网站目录/

这种方式比较简单,但是web应用程序必须在webapps目录下。Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。

2.修改Server.xml文件部署

这种方式可以不必将Web主目录拷贝到webapps下,直接在F:/部署。方法如下,更改$CATALINA_HOME/conf/server.xml文件,

找到以下内容:

Xml代码:

<Context path ="/Pet" reloadable ="false" docBase ="F:/PetWeb" workDir ="d:/Mywebapps/emp" />
path:是访问时的根地址,表示访问的路径;如上述例子中,访问该应用程序地址如下:http://localhost:8080/Pet/

reloadable:表示可以在运行时在classes与lib文件夹下自动加载类包。其中reloadable="false"表示当应用程序 中的内容发生更改之后服务器不会自动加载,这个属性在开发阶段通常都设为true,方便开发,在发布阶段应该设置为false,提高应用程序的访问速度。

docbase:表示应用程序的路径,注意斜杠的方向“/”。 docBase可以使用绝对路径,也可以使用相对路径,相对路径相对于webapps。

workdir:表示缓存文件的放置地址

3.增加自定义web部署文件(推荐使用,不需要重启Tomcat )

这种方式和方法2差不多,但不是在Server.xml文件中添加Context标签,而是在$CATALINA_HOME/conf /Catalina/localhost中添加一个xml文件,如Pet.xml.在Tomcat安装目录conf/Catalina /localhost下,里面有Tomcat自带的三个应用,随意复制其中的一个XML文件,然后修改docbase指向你自己的应用程序,并把文件名改 名,各参数参见方法2中的<Context>标签的参数,或者你也可以自己新建一个XML文件。(注意此文件名将作为Context中的path属性值,不管文件里的path属性值如何设置也是无效的 ),将以下内容复制过去,修改相应路径即可。

Xml代码:

<Context path ="/Pet" docBase ="F:/PetWeb"
debug ="0" privileged ="true" reloadable ="false" >
</Context>
访问地址如下:http://localhost:8080/Pet/

2.动态部署

动态部署是指可以在服务器启动之后部署web应用程序,而不用重新启动服务器。动态部署要用到服务器提供的manager.war文件,如果 在$CATALINA_HOME/webapps/下没有该文件,你必须去重新下载tomcat,否则不能完成以下的功能。要想使用该管理程序必须首先编 辑$CATALINA_HOME/conf/tomcat-users.xml文件。

(4)有没有写过存储过程??

SQL块主要有两种类型,即命名块和匿名块。匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能再其他的SQL块中调用。存储过程和函数是命名块,他们被编译后保存在数据库中,可以被反复调用,运行速度较快。

存储过程的优点:

存储过程是由SQL语句书写的过程,这个过程经编译后优化后存储在数据库服务器中,因此称他们为存储过程,使用时只要调用即可。、

使用存储过程具有以下优点:

(1)由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因此运行效率高,它提供了在服务器端快速执行SQL语句的有效途径。

(2)存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。

(3)方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,即有利于集中控制,又能够方便地进行维护。当用户规则发生变化时只要修改存储过程,无需修改其他应用程序。

CREATE Procedure 过程名([参数1,参数2,......])     /*存储过程首部*/
AS
<SOL块>;  /*存储过程体,描述该存储过程的操作*/
存储过程包括:过程首部和过程体。

过程名:是数据库服务器合法的对象标识。

参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。存储过程的参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。

过程体:是一个SQL块。包括声明部分和可执行语句部分。

例子:利用存储过程来实现一个应用:从一个账户中转指定数额的款项到另一个账户中。

Create procedure transfer(inAccount INT,outAccount INT,amount FlOAT)
AS DECLARE
   totalDeposit float;
begin                            /*检查转出账户的余额*/
    select total INTO totalDeposit from ACCOUNT WHERE ACCOUNTNUM=outAccount; 
    if totalDeposit is NULL THEN    /*账户不存在或账户中没有存款*/
            ROLLBACK;
            RETURN;
     END IF;
     IF totalDeposit<amount THEN    /*账户存款不足*/
             ROLLBACK;
             RETURN;
     end IF;
     UPDATE account SET total=total-amount WHERE ACCOUNTNUM=outAccount;  /*修改转出账户,减去转出余额*/
     UPDATE account set total=total+amount WHERE ACCOUNTNUM=outAccount;  /*修改转入账户,增加转出额*/
     COMMIT;      /*提交转账事务*/
END;
可以对存储结构重新命名:

可以使用ALTER Procedure 重新命名一个存储过程:

ALTER Procedure 过程名1 RENAME TO 过程名2;

执行存储过程:

CALL/PERFORM Procedure 过程名([参数1,参数2,。。。。])

使用CALL或者PERFORM等方式激活存储过程的执行。在SQL中,数据库服务器支持在过程体中调用其他存储过程。

例子:从账户011003815868转一万元到011003813828账户中。

CALL PROCEDURE transfer(01003815868,01003813828,10000);

删除存储过程:

DROP procedure 过程名();

(5)怎样创建线程??

1.继承Thread类,重载它的run()方法。

2.实现Runnable接口,重载Runnable接口中的run()方法。

(6)Servlet与JSP的区别??

6.1 Servlet

Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

6.1 JSP

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。


JSP是一种脚本语言,包装了Java Servlet系统的界面,简化了Java和Servlet的使用难度,同时通过扩展JSP标签(TAG)提供了网页动态执行的能力。JSP提供了一套简单的标签,和HTML融合的比较好,可以使不了解Servlet的人可以做出动态网页来。对于Java语言不熟悉的人,会觉得JSP开发比较方便。JSP修改后可以立即看到结果,不需要手工编译,JSP引擎会来做这些工作;而Servelt缺需要编译,重新启动Servlet引擎等一系列动作。但是在JSP中,HTML与程序代码混杂在一起,而Servlet却不是这样。下面我们对JSP的运行来做一个简单的介绍,告诉大家怎样来执行一个JSP文件:当Web服务器(或Servlet引擎,应用服务器)支持JSP引擎时,JSP引擎会照着JSP的语法,将JSP文件转换成Servlet代码源文件,接着Servlet会被编译成Java可执行字节码(bytecode),并以一般的Servlet方式载入执行JSP语法简单,可以方便的嵌入HTML之中,很容易加入动态的部分,方便的输出HTML。在Servlet中输出HTML缺需要调用特定的方法,对于引号之类的字符也要做特殊的处理,加在复杂的HTML页面中作为动态部分,比起JSP来说是比较困难的。

二、两者之间的联系和区别
【1】JSP第一次运行的时候会编译成Servlet,驻留在内存中以供调用。
【2】JSP是web开发技术,Servlet是服务器端运用的小程序,我们访问一个JSP页面时,服务器会将这个JSP页面转变成Servlet小程序运行得到结果后,反馈给用户端的浏览器。
【3】Servlet相当于一个控制层再去调用相应的JavaBean处理数据,最后把结果返回给JSP。
【4】Servlet主要用于转向,将请求转向到相应的JSP页面。
【5】JSP更多的是进行页面显示,Servlet更多的是处理业务,即JSP是页面,Servlet是实现JSP的方法。
【6】Servlet可以实现JSP的所有功能,但由于美工使用Servlet做界面非常困难,后来开发了JSP。
【7】JSP技术开发网站的两种模式:JSP + JavaBean;JSP + Servlet + JavaBean(一般在多层应用中, JSP主要用作表现层,而Servlet则用作控制层,因为在JSP中放太多的代码不利于维护,而把这留给Servlet来实现,而大量的重复代码写在JavaBean中)。
【8】二者之间的差别就是,开发界面是JSP直接可以编写。
比如在JSP中写Table标记:<table>[数据]</table>;
Servlet需要加入:out.println(“<table>[数据]</table>”)。
JSP文件在被应用服务器(例如:Tomcat、Resin、Weblogic和Websphere),调用过之后,就被编译成为了Servlet文件。也就是说在网页上显示的其实是Servlet文件。Tomcat下面JSP文件编译之后生成的Servlet文件被放在了work文件夹下,JSP中的HTML代码在Servlet都被out出来,而JSP代码按照标签的不同会放在不同的位置。
【9】JSP中嵌入JAVA代码,而Servlet中嵌入HTML代码。
【10】在一个标准的MVC架构中,Servlet作为Controller接受用户请求并转发给相应的Action处理,JSP作为View主要用来产生动态页面,EJB作为Model实现你的业务代码。

(7)static方法前面加上syhnoized和非static方法前面加syhnoized有什么区别??

synchronized关键字加到static静态方法上是给Class类上锁
而加到非static静态方法是给对象加锁

为了验证不是同一个锁,验证代码如下:

public class Synchronized {
	
	 synchronized public static void printA(){
	        try {
	            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入pringA()");
	            Thread.sleep(3000);
	            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开pringA()");
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	 
	 
	  synchronized public static void printB(){
	        try {
	            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printB()");
	            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printB()");
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	  
	  synchronized public  void printC(){
	      try {
	          System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printC()");
	          
	          System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printC()");
	      } catch (Exception e) {
	          e.printStackTrace();
	      }
	  }

	 
	public static void main(String[] args) {
		    Synchronized s=new Synchronized();
	        ThreadA a=new ThreadA(s);
	        a.setName("A");
	        a.start();

	        ThreadB b=new ThreadB(s);
	        b.setName("B");
	        b.start();
	        
	        
	      ThreadC c=new ThreadC(s);
	      c.setName("C");
	      c.start();
	}
	
}
	class ThreadA extends Thread{
	    private Synchronized s;

	    public ThreadA(Synchronized s) {
	        super();
	        this.s = s;
	    }
	    @Override
	    public void run() {
	        s.printA();
	    }
	}
	
	class ThreadB extends Thread{
	    private Synchronized s;

	    public ThreadB(Synchronized s) {
	        super();
	        this.s = s;
	    }
	    @Override
	    public void run() {
	        s.printB();
	    }
	}
	
	class ThreadC extends Thread{
      private Synchronized s;
  
      public ThreadC(Synchronized s) {
       super();
       this.s = s;
     }
      
     @Override
     public void run() {
      s.printC();
  }
}
	

一、同步效果执行,执行后在执行第二个 如果加到非static方法就不一样了 是异步的效果

二、这里异步的原因是因为持有不同的锁,一个是对象锁 ,一个是class锁 而calss锁可以对类的所有实例起作用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值