`
Josh_Persistence
  • 浏览: 1632096 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Java, Jquery, Html, 框架面试题目

阅读更多

1. 用Spring实现一个功能:记录应用对每个Web请求的处理时间,并将这个视图最终显示到这个页面上。

考察知识点

1)Spring的核心模块之一:MVC接收请求 :包括MVC模式及其好处,@Controller, @RequestMapping的用处。

2)Spring MVC中怎样实现类似Sevlet过滤器的功能。

1种是实现HandlerInterceptor接口,并复写preHandle(), postHandle(), afterCompletion()3个方法。

2种是继承HandlerInterceptorAdapter()抽象类并复写感兴趣的方法(上面3个方法中的任何方法)。

此处可延伸到设计模式的考察Adapter模式 - Java IO中大量使用了Adapter和Decorator模式。

3)处理程序的注册。

    A: 注册到DefaultAnnotationHandlerMapping中

这个bean的作用是将拦截器应用到所有以@Controller注解标注的类,意思是说所有的控制器都要受到拦截器的控制。(可以在数组类型的interceptors属性中指定多个拦截器)

    B:注册到SelectedAnnotaionHandlerMapping中

延伸到两种的优缺点,以及如果maven的官方repository中没有想要的jar包怎么办?

B1)写信到maven官方客服 B2)放到WEB-INF/lib 3)加到maven的repository中。

 参见更为详尽的博客:http://josh-persistence.iteye.com/admin/blogs/1880324

 

4)视图解析器:为什么在URL请求中没有显示指定.jsp等后缀,Spring是怎样处理的。

       如今,应用常常要以不同的格式(如XML,JSON,PDF或者XLS(Excel))提供相同的内容。检查请求中提供的扩展名(如果有)以及确定使用的视图技术应该留给视图解析器完成。

 

参见更为详尽的博客: http://josh-persistence.iteye.com/admin/blogs/1880324

 

2. 将一个文件内容复制到另一个文件中

考察知识点

1) Java中流的分类:字符流,字节流

2) 流的嵌套使用。

3) 为什么用BufferedReader 和 BufferedWriter

4)  Java中怎样获取项目的路径

5) java中流的关闭(异常,顺序)

package com.ebay.cms.cms.test;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

 

import org.junit.Test;

 

public class CMSDnsFileSyncTest extends CMSBaseTest {

    

    // change to the real file path

    private final static String PRO_FILE = "C:/cloudvipzonefile.txt";

    

    private final static String LOCAL_FILE = "\\src\\test\\resources\\dnsfiles\\testzonefile.txt";

 

    @Test

    public void copyContents() {

        try {

            String projectPath = System.getProperty("user.dir");

 

            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(PRO_FILE)));

            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(projectPath + LOCAL_FILE)));

            

            String currentLineData = null;

            while ((currentLineData = br.readLine()) != null) {

                bw.write(currentLineData);

                bw.newLine(); // line feed

            }

            bw.close();

            br.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException ioe) {

            ioe.printStackTrace();

        }

        

    }

}

注: String projectPath = System.getProperty("user.dir");

        java项目中的路径是相对于项目的根目录
   web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录\bin)

 

3. Java中正则表达式的使用 

怎样从字符串:{"_type":"FQDN","_oid":"51a867e4773da1128b1422ad"} 中取出这段数

1) String的indexOf和String类的subString()方法

2) 正则表达式的方法: [0-9A-Za-z]{24,}

3) java.util.regex.Pattern   模式类:用来表示一个编译过的正则表达式。

      java.util.regex.Matcher   匹配类:用模式匹配一个字符串所表达的抽象结果。
 

4. Spring中怎样实现页面国际化

考察点:

1) 国际化概念:同样的页面内容根据用户所在的区域显示出对应的信息。

2) 不需要为相同的页面内容开发不同版本的页面文件。

3) Spring中的LocalReslover解析器

AcceptHeaderLocalReslover, SessionLocaleResolver, CookieLocaleReslover.自定义Locale(实现LocaleResolver接口)并使用LocaleChangeInterceptor.

4)   使用外部的message信息。message.properties, message_de.properties, message_zh.propertises.

5)   使用外部的message信息需要实现MessageResource信息源接口。

 

参见更为详尽的博客: http://josh-persistence.iteye.com/admin/blogs/1881831

 

5. 为什么要使用Spring 3.X中内容协商处理器。

考察点:

1) Spring MVC  -  View: 视图解析器

2) 内容协商视图解析器的好处:

ContentNegotiatingViewResolver可以允许你拥有多个同名的逻辑视图,每个视图支持一种不同的媒体类型(例如HTML,PDF,XLS),然后由ContentNegotiatingViewResolver来解析最佳匹配。 它会使控制器的设计进一步简化了,因为再也没有必要用硬编码为某个媒体类型创建特定的逻辑视图(例如pdfReservation, xlsReservation, htmlReservation),而代之以单一的视图(reservation),让ContentNegotiatingViewResolver解析器确定最佳匹配。要么匹配reservation.pdf, reservation.html,reservation.xls,reservation.json,reserveration.jsp等。

3) 视图协商处理器的优先级应该比其它的视图解析器的优先级更高,这样当控制器处理结束后,返回逻辑视图,那么此时进行处理的就是内容协商处理解析器,该解析器可能会将视图解析分配给其它的解析器。

参见更为详尽的博客:http://josh-persistence.iteye.com/admin/blogs/1884206

 

6. Spring中怎样创建Excel和PDF视图

考察点

1) 将Excel和PDF看作Spring MVC中的特殊视图。

2) 处理Excel和PDF的常见程序库。

Spring将Excel和PDF文件的生成集成到MVC框架中。你可以将Excel和PDF文件看作特殊类型的视图,因此你就可以在控制器中一致性地处理web请求,并将数据添加到一个传递给Excel和PDF视图的模式中。这样,你就没有必要再去考虑处理复杂的HTTP响应头标和输出流了。

     Spring MVC支持使用Apache POI程序库(http://poi.apache.org)或者JExcel API程序库(http://jexcelapi.sourceforge.net)生成Excel文件。对应的视图类分别是AbstractExceView和AbstractJExcelView。PDF文件由IText程序库(http://www.lowagie.com/iText/)生成,对应的视图类是AbstractPdfView类。

参见更为详尽的博客:http://josh-persistence.iteye.com/admin/blogs/1885286

 

7. Java获取ip地址:

考查点:网络知识: 用户使用代理的情况

public static String getUserRealIP(HttpServletRequest request) throws UnknownHostException {

        

        String ip = "";

        

        // 有的user可能使用代理,为处理用户使用代理的情况,使用x-forwarded-for

        if  (request.getHeader("x-forwarded-for") == null)  {

            ip = request.getRemoteAddr();

        }  else  {

            ip = request.getHeader("x-forwarded-for");

        }

        

        if  ("127.0.0.1".equals(ip))  {

            // 获取本机真正的ip地址

            ip = InetAddress.getLocalHost().getHostAddress();

        }

        

        return ip;

    } 

详见博客:http://josh-persistence.iteye.com/admin/blogs/1886456

 

8. Java中可用于switch子句的类型:

byte, char, short, int及其封装类,enum类。

注:不能用于swtich子句的类型: 除byte, char, short,int之外的所有的封装类型,long, float, double,boolean及其封装类型。

详解博客:http://josh-persistence.iteye.com/admin/blogs/1886894

 

9. java中变量及其生命周期。

     1) java变量分为成员变量和局部变量。

     2) java类的成员变量有两种: (静态变量,实例变量)

           1.被static关键字修饰的变量,叫类变量或者静态变量。

           2.另一种没有static修饰,为实例变量 

           3. 静态变量生命周期就是类的开始和销毁,实例变量生命周期就是对象的开始和销毁.

    3) 初始化

1:局部变量在使用前必须被程序员主动的初始化,

2:成员变量则会被系统提供一个默认的初始值。

所以在语法上,类的成员变量能够定义后直接使用,而局部变量在定义后先要赋初值,然后才能使用。

 

     4)  引用:所有类的成员变量可以通过this来引用。

详见博客:http://josh-persistence.iteye.com/admin/blogs/1886949

 

10)Rest中哪种资源(Representation)操作方法不具有幂等性:

GET方法具有幂等性[指多个相同请求返回相同的结果] ——如果你发送了一个GET请求没有得到结果,你可能不知道原因是请求未能到达目的地,还是响应在反馈的途中丢失了。幂等性保证了你可以简单地再发送一次请求解决问题。幂等性同样适用于PUT(基本的含义是“更新资源数据,如果资源不存在的话,则根据此URI创建一个新的资源”)和DELETE(你完全可 以一遍又一遍地操作它,直到得出结论——删除不存在的东西没有任何问题)方法。POST方法,通常表示“创建一个新资源”,也能被用于调用任意过程,因而 它既不安全也不具有幂等性。

详见博客:http://josh-persistence.iteye.com/admin/blogs/1887382

 

11) 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    答:是值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
 10.   Jquery面试相关:
1) Jquery的核心语法: $(selector).action()  : http://josh-persistence.iteye.com/admin/blogs/1900882
 2)   Jquery中的文档就绪函数: http://josh-persistence.iteye.com/admin/blogs/1900882
3)   Jquery常见的两种版本:http://josh-persistence.iteye.com/admin/blogs/1900881
4)    Jquery 选择器:
$("[href$='.jpg']") 所有带有以 ".jpg" 结尾的属性值的 href 属性
$("div#intro .head") id="intro" 的 <div> 元素中的所有 class="head" 的元素
5) jQuery 名称冲突:

jQuery 使用 $ 符号作为 jQuery 的简介方式。

某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号。

jQuery 使用名为 noConflict() 的方法来解决该问题。

var jq=jQuery.noConflict(),帮助您使用自己的名称(比如 jq)来代替 $ 符号。

6) JQuery的四大原则:

由于 jQuery 是为处理 HTML 事件而特别设计的,那么当您遵循以下原则时,您的代码会更恰当且更易维护:

  • 把所有 jQuery 代码置于事件处理函数中
  • 把所有事件处理函数置于文档就绪事件处理器中
  • 把 jQuery 代码置于单独的 .js 文件中
  • 如果存在名称冲突,则重命名 jQuery 库

7)JQuery效果中的显示与隐藏的切换函数是:toggle(hide 和show)

8)   JQuery效果中的淡入与淡出的切换函数是:fade

    jQuery 拥有下面四种 fade 方法:

  • fadeIn(): 用于淡入已隐藏的元素
  • fadeOut(): 用于淡出可见元素
  • fadeToggle():
  • jQuery fadeToggle() 方法可以在 fadeIn() 与 fadeOut() 方法之间进行切换。

    如果元素已淡出,则 fadeToggle() 会向元素添加淡入效果。

    如果元素已淡入,则 fadeToggle() 会向元素添加淡出效果
  • fadeTo():jQuery fadeTo() 方法允许渐变为给定的不透明度(值介于 0 与 1 之间)

9) 可以用 animate() 方法来操作所有 CSS 属性吗?

是的,几乎可以!不过,需要记住一件重要的事情:当使用 animate() 时,必须使用 Camel 标记法书写所有的属性名,比如,必须使用 paddingLeft 而不是 padding-left,使用 marginRight 而不是 margin-right,等等。

同时,色彩动画并不包含在核心 jQuery 库中。

如果需要生成颜色动画,您需要从 jQuery.com 下载 Color Animations 插件。

 

10) jQuery 提供针对动画的队列功能。

如果您在彼此之后编写多个 animate() 调用,jQuery 会创建包含这些方法调用的“内部”队列。然后逐一运行这些 animate 调用。

$("button").click(function(){
  var div=$("div");
  div.animate({height:'300px',opacity:'0.4'},"slow");
  div.animate({width:'300px',opacity:'0.8'},"slow");
  div.animate({height:'100px',opacity:'0.4'},"slow");
  div.animate({width:'100px',opacity:'0.8'},"slow");
});

11)三个简单实用的用于 DOM 操作的 jQuery 方法:

  • text() - 设置或返回所选元素的文本内容
  • html() - 设置或返回所选元素的内容(包括 HTML 标记)
  • val() - 设置或返回表单字段的值
  • 获取属性 - attr()

    jQuery attr() 方法用于获取属性值

$("#btn1").click(function(){
  $("#test1").text("Hello world!");
});
$("#btn2").click(function(){
  $("#test2").html("<b>Hello world!</b>");
});
$("#btn3").click(function(){
  $("#test3").val("Dolly Duck");
});

 

12) Jquery中的Ajax方法:

A:jQuery load() 方法是简单但强大的 AJAX 方法。

load() 方法从服务器加载数据,并把返回的数据放入被选元素中。

语法:

$(selector).load(URL,data,callback);

必需的 URL 参数规定您希望加载的 URL。

可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。

可选的 callback 参数是 load() 方法完成后所执行的函数名称。

 

B:jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。

HTTP 请求:GET vs. POST

两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。

  • GET - 从指定的资源请求数据
  • POST - 向指定的资源提交要处理的数据

GET 基本上用于从服务器获得(取回)数据。注释:GET 方法可能返回缓存数据。

 

POST 也可用于从服务器获取数据。不过,POST 方法不会缓存数据,并且常用于连同请求一起发送数据。

 

13) 怎样将一个典型的HTML文件成为一个Bootstrap模板? 需要包含相应的CSS和JS文件。

<linkhref="css/bootstrap.min.css"rel="stylesheet"media="screen">
<scriptsrc="http://code.jquery.com/jquery.js"></script>
<scriptsrc="js/bootstrap.min.js"></script>

 

 

 

11. Spring中<url-pattern></url-pattern> / 和/*的区别?Spring中3种访问静态资源的方法?各种Java容器中默认的Servlet的名字?

参照博客:http://josh-persistence.iteye.com/admin/blogs/1922311

 

12. java线程安全问题:下面有两个类,一个是现场不安全的Count类,一个是ThreadTest类,输出结果是?为什么有这样的输出结果?如果想要每个线程都输出55,有什么解决方案?哪个解决方案更好?Struts1和Struts2在线程解决方案方面有什么不同?参加博客:

http://josh-persistence.iteye.com/admin/blogs/1923191

 

  1. public class Count {  
  2.   
  3.     private int num;  
  4.       
  5.     // 我们想查看Count类的对象在内存中有几个, 以判断是否有资源共享和竞争  
  6.     private int objectNum;  
  7.       
  8.     public Count(int objectNum) {  
  9.         this.objectNum = objectNum;  
  10.     }  
  11.       
  12.     public void count() {  
  13.         for (int i = 1; i <= 10; i++) {  
  14.             num += i;  
  15.         }  
  16.  // Object Number一值都是1,说明只有一个Count对象,保证多个线程共享一个Count对象。  
  17.         System.out.println(Thread.currentThread().getName() + " : " + num + " Object Number: "  + objectNum);  
  18.           
  19.     }  
  20.   
  21. }

 

  1. /** 
  2.  *  
  3.  */  
  4. package com.wsheng.thread.simlesafe;  
  5.   
  6. /** 
  7.  * @author Wang Sheng(Josh) 
  8.  * 
  9.  */  
  10. public class ThreadTest {  
  11.   
  12.     public static void main(String[] args) {  
  13.         Runnable run = new Runnable() {  
  14.             int i = 1, j = 1;  
  15.               
  16.             // 只会new一次,即10个线程共享1个对象  
  17.             Count count = new Count(i++);  
  18.             public void run() {  
  19.                 System.out.println(" ----- Thread running " + j++ + " times");  
  20.                 count.count();  
  21.             }  
  22.         };  
  23.           
  24.         for (int i = 0; i < 10; i++) {  
  25.             new Thread(run).start();  
  26.         }  
  27.     }  
  28.   
  29. }  

 

线程执行的随机性例子:

/**
 * 
 */
package com.wsheng.thread.synchronize;

/**
 * @author Wang Sheng(Josh)
 *
 */
public class ThreadSynchronized {

	
	public static void main(String[] args) {
		final Outputer output = new Outputer();
		new Thread() {
			public void run() {
				// output.output("lisi");
				output.output("lisilisilisilisilisilisilisilisilisilisi");
			};
		}.start();
		
		new Thread(){
			public void run() {
				output.output("zhangshan");
			};
		}.start();

	}

}

class Outputer {
	public void output(String name) {
		
		// 为了保证对name的输出不是一个原子操作,这里逐个的输出的name的每个字符
		for (int i = 0; i < name.length(); i++) {
			System.out.print(name.charAt(i));
		}
	}
}

 

 

子线程循环10次,主线程循环100次,如此循环100次

/**
 * 
 */
package com.wsheng.thread.synchronize;

/**
 * @author Wang Sheng(Josh)
 *
 */
public class LoopThreadTest {
	
	public static void main(String[] args) {
		final Loop loopObj = new Loop();
		
		new Thread(new Runnable() {
			
			public void run() {
				execute(loopObj, "sub");
			}
		}).start();
		
		execute(loopObj, "main");

	}
	
	public static void execute(Loop loop, String threadType) {
		for (int i = 0; i < 100; i++) {
			try {
				if ("main".equals(threadType)) {
					loop.mainThread(i);
				} else {
					loop.subThread(i);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
class Loop {
	private boolean isSubThread = true;
	
	public synchronized void mainThread(int loop) throws InterruptedException {
		while (isSubThread) {
			this.wait();
		}
		
		for (int i = 0; i < 100; i++) {
			System.out.println("main thread sequence of " + i + ", loop of " + loop);
		}
		
		isSubThread = true; // 主线程执行完毕,由子线程来执行
		this.notify(); // 唤醒阻塞队列中的子线程到就绪队列
	}
	
	
	public synchronized void subThread(int loop) throws InterruptedException {
		while (!isSubThread) {
			this.wait();
		}
		
		for (int i = 0; i < 10; i++) {
			System.out.println("sub thread sequence of " + i + ", loop of " + loop);
		}
		
		isSubThread = false; //  子线程执行完毕,由主线程来执行
		this.notify(); // 唤醒阻塞队列中的主线程到就绪队列
	}
}

 

 

 

. JavaScript相关:看zxx例子:

 

 

   
   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics