1. HTML简介 HTML(HyperText Mark-up Language)即超文本标记语言 1.什么是xml? 可扩展标记语言
JSP(JavaServer Pages> 2.JSP中如何设置COOKIE? <%
Cookie mycookie = new Cookie(”aName”,”aValue”); response.addCookie(mycookie); %> 3.Request对象的主要方法 setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name):获得有name指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性 4.Servlet的生命周期? Servlet的生命 周期可以分为加载、实例化、初始化、处理客户请求和卸载
五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。 生命周期的具体说明如下:
Servlet容器完成加载Servlet类和实例化一个Servlet对象 init()方法完成初始化工作,该方法由Servlet容器调用完成 service()方法处理客户端请求,并返回响应结果
destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源 public ServletConfig getServletConfig() public String getServletInfo()
public void init(ServletConfig config)
public void service(ServletRequest request,ServletResponse response) public void destroy()
5.在JSP中如何执行浏览重定向?
response.sendRedirect(”http://ybwen.home.chinaren.com/index.html”); 也能物理地改变HTTP HEADER属性,如下: <%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); String newLocn=\ response.setHeader(\ %>
如何中SERVLET或JSP下载一个文件(如:binarytextexecutable)? 现提供两个解决方案:A:使用HTTP,
B:在Servlet中,通过设置ContentType和使用java.io包的Stream等类可作到.例如: response.setContentType(”application/x-msword”); JSP如何获得客户浏览器的信息? 使用request.getHeader(String)即可
6.在JSP中如何写文本文件?使用PrintWriter对象, 7.pageEncoding和charset有什么区别 pageEncoding是jsp文件本身的编码
contentType的charset是指服务器发送给客户端时的内容编码 8.如何避免JSP页面自动生成session对象?为什么要这么做? <%@ page session=”false”> 9.如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 把如下脚本加入到JSP文件的开始即可: <%
response.setHeader(”Cache-Control”,”no-store”); //HTTP 1.1 response.setHeader(”Pragma”,”no-cache”); //HTTP 1.0
response.setDateHeader (”Expires”, 0); //prevents caching at the proxy server %> 10如何现实servlet的单线程模式 <%@ page isThreadSafe=”false”%> 11.在JSP中如何删除一个COOKIE? <%
Cookie killMyCookie = new Cookie(”mycookie”, null); killMyCookie.setMaxAge(0); killMyCookie.setPath(”/”);
response.addCookie(killMyCookie); %> 12.在JSP中如何写文本文件? 使用PrintWriter对象,如:
<%@ page import=”java.io.*” %> <%
String str = “print me”;
String nameOfTextFile = “/usr/anil/imp.txt”; try {
PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile)); pw.println(str); pw.close();
} catch(IOException e) { out.println(e.getMessage()); } %>
13.在servlets和JSP之间能共享session对象吗? HttpSession session = request.getSession(true); session.putValue(”variable”,”value”); 14.在一个JSP的请求处理中如何停止JSP的执行 <%
if (request.getParameter(”wen”) != null) { // do something } else { return; } %>
15.有一个jsp页面,假设名字叫list.jsp,部署在tomcat下,客户端通过浏览器访问这个页面. 当客户在浏览器中输入http://www......list.jsp ,进行访问这个jsp页面,这个过程中浏览器是怎样和tomcat进行通信的?
1. 首先要知道jsp在Tomcat的加载机制怎么回事, 一个jsp页面,当web服务器启动后,web容器都会将jsp转化成Servlet再转化成 纯文本的html/htm文件,当浏览器访问,会直接从服务器找到 jsp映射的纯文本文件
15.如果这个jsp页面改动了,为什么刷新浏览器就可以重新得到改变后的页面?
这个东西是可以设置的,Tomcat也好,Weblogic也好 默认就是将最新的jsp转成纯文本文件.只要一刷新就是最新的了.但如果为了保证服务器的性能,通常会设置成不刷新. 这样只有重新启动服务器才可以将这个jsp转成纯文本文件.
16.有一张表,只有两个字段,比如id,name这个表中如果存有100条数据,1万条数据,100万条数据,怎么样进行数据库访问才能速度更快,比如分页?
这要看数据的多少,如果数据少直接用Statement对象就可以了,如果数据很大并且频繁操作的话就应该使用PreparedStatement对象,因为如果查询被访问过一次,后台的数据库就会记录下来,下次访问就会很快!
17.有两个页面a.jsp和b.jsp,要从a.jsp传值到b.jsp有几种方法?分别是什么?
a:最常用的方法是用form中的text,,然后在b.jsp页面中这样获取
String username=request.getParameter(\
b:直接在Url地址栏里面输入第一个页面的地址,在后加问号,然后把要传的参数及值写在
后面,如有多个用&隔开,然后在下一页面用
request.getParameter(\参数名\来获取,例如: 在b.jsp中可用这样获取:String
username=request.getParameter(\ c:在form中放hidden,如:,获取方法同上 说明:传值的方法有很多种,以上是最常用最简单的几种方式,当然,如果传的值有中文的话,需另做处理
18.有三个页面,a.jsp,b.jsp和c.jsp,流程是:a.jsp->b.jsp->c.jsp,其中a.jsp中提交的数据要在c.jsp中访问,用最简单的方法 怎么做?注意不能放在session里
用隐藏表单域,即在b.jsp页面中用N个hidden把上一页面提交过来的信息保存下来,然后和当前一起提交,再到c.jsp里面获取 19. 事务特性与acid? 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性 20. page/request/session/application理解? page范围
具有page范围的对象被绑定到javax.servlet.jsp.PageContext对象中。在这个范围内的对象,只能在创建对象的页面中访问。可以调用pageContext这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象(pageContext对象还提供了访问其他范围对象的getAttribute方法),pageContext对象本身也属于page范围。当Servlet类的_jspService()方法执行完毕,属于page范围的对象的引用将被丢弃。page范围内的对象,在客户端每次请求JSP页面时创建,在页面向客户端发送回响应或请求被转发(forward)到其他的资源后被删除。 ·request范围
具有request范围的对象被绑定到javax.servlet.ServletRequest对象中,可以调用request这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。在调用forward()方法转向的页面或者调用include()方法包含的页面中,都可以访问这个范围内的对象。要注意的是,因为请求对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象 session范围
具有session范围的对象被绑定到javax.servlet.http.HttpSession对象中,可以调用session这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。JSP容器为每一次会话,创建一个HttpSession对象,在会话期间,可以访问session范围内的对象。 ·application范围
具有application范围的对象被绑定到javax.servlet.ServletContext中,可以调用application这个隐含对象的getAttribute()方法来访问具有这种范围类型的对象。在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象 21. 了解Threadlocal?
ThreadLocal是什么呢?它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离
机制。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
22.事务的边界!要么全成功,要么全失败。
事务的作用是确保一个或多个操作是以最小工作单位的形式执行的。如果事务中的其中一个操作失败,则所有操作都将回退,以使应用程序恢复执行操作前的状态。视将业务流程逻辑设计为无状态还是有状态(请参阅生成无状态和有状态业务流程),特定业务流程上下文中相应会有一个或多个事务 23.悲观锁与乐观锁?
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。
度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做 先从悲观锁开始说。在SqlServer等其余很多数据库中,数据的锁定通常采用页级锁的方式,也就是说对一张表内的数据是一种串行化的更新插入机制,在任何时间同一张表只会插1条数据,别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低,在多用户并发访问的时候,当对一张表进行频繁操作时,会发现响应效率很低,数据库经常处于一种假死状态。而Oracle用的是行级锁,只是对想锁定的数据才进行锁定,其余的数据不相干,所以在对Oracle表中并发插数据的时候,基本上不会有任何影响。 select * from test where id = 10 for update
通过这条检索语句锁定以后,再开另外一个sql*plus窗口进行操作,再把上面这条sql语句执行一便,你会发现sqlplus好像死在那里了,好像检索不到数据的样子,但是也不返回任何结果,就属于卡在那里的感觉。这个时候是什么原因呢,就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait那就是wait),所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后,第二个session中的检索结果就是自动跳出来,并且也把数据锁定住。
第二种乐观锁的做法就是采用版本戳,这个在Hibernate中得到了使用。采用版本戳的话,首先需要在你有乐观锁的数据库table上建立一个新的column,比如为number型,当你数据每更新一次的时候,版本数就会往上增加1。比如同样有2个session同样对某条数据进行操作。两者都取到当前的数据的版本号为1,当第一个session进行数据更新后,在提交的时候查看到当前数据的版本还为1,和自己一开始取到的版本相同。就正式提交,然后把版本号增加1,这个时候当前数据的版本为2。当第二个session也更新了数据提交的时候,发现数据库中版本为2,和一开始这个session取到的版本号不一致,就知道别人更新过此条数据,这个时候再进行业务处理,比如整个Transaction都Rollback等等操作。在用版本戳的时候,可以在应用程序侧使用版本戳的验证,也可以在数据库侧采用Trigger(触发器)来进行验证。不过数据库的Trigger的性能开销还是比较的大,所以能在应用侧进行验证的话还是推荐不用Trigger。
24.了解servletcontextlistener (httpsessionlistener)(访问静态页面不会创那建session)?