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 模式类:用来表示一个编译过的正则表达式。
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) 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。 详见博客: http://josh-persistence.iteye.com/admin/blogs/1887675 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$("[href$='.jpg']") | 所有带有以 ".jpg" 结尾的属性值的 href 属性 |
$("div#intro .head") | id="intro" 的 <div> 元素中的所有 class="head" 的元素 |
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
- public class Count {
- private int num;
- // 我们想查看Count类的对象在内存中有几个, 以判断是否有资源共享和竞争
- private int objectNum;
- public Count(int objectNum) {
- this.objectNum = objectNum;
- }
- public void count() {
- for (int i = 1; i <= 10; i++) {
- num += i;
- }
- // Object Number一值都是1,说明只有一个Count对象,保证多个线程共享一个Count对象。
- System.out.println(Thread.currentThread().getName() + " : " + num + " Object Number: " + objectNum);
- }
- }
- /**
- *
- */
- package com.wsheng.thread.simlesafe;
- /**
- * @author Wang Sheng(Josh)
- *
- */
- public class ThreadTest {
- public static void main(String[] args) {
- Runnable run = new Runnable() {
- int i = 1, j = 1;
- // 只会new一次,即10个线程共享1个对象
- Count count = new Count(i++);
- public void run() {
- System.out.println(" ----- Thread running " + j++ + " times");
- count.count();
- }
- };
- for (int i = 0; i < 10; i++) {
- new Thread(run).start();
- }
- }
- }
线程执行的随机性例子:
/** * */ 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例子: