葵花宝典之jsp
一、Servlet的生命周期 Servlet的生命周期就是Servlet从创建出实例对象到其销毁的过程。 Servlet是一个容器,它负责创建实例来接受客户端的请求,并且以多线程的方式响应给客户。 Servlet生命周期之中一共经历了5各阶段: 1 类的加载 2 实例化(创建servlet实例对象) 3 初始化(调用init()方法) 4服务(调用service()方法,根据客户请求方式选择用doGet()或doPost()方法) 5 Servlet销毁(调用destroy()方法) 注意: Servlet在其整个生命周期中只创建了一个对象!!!
二、Servlet和JSP的区别: ①JSP是 Servlet的扩展 ②由于JSP转译之后才变成Servlet,所以Servlet的速度比JSP快 ③JSP的本质还是Servlet 三、HTTP协议: 1.HTTP协议(Hypertext Transfer Protocol)超级文本传输协议; 2.HTTP的请求格式: 总共分为三部分: 请求方法,URL,HTTP协议的版本 请求头(request Header) 请求正文(request Content) 3.HTTP的请求方式 1)get: 2)post: 四:JavaBean的标准动作 jsp:usebean创建JavaBean的对象 jsp:setProperty设置对象的属性 jsp:getProperty获得对象的属性的值 jsp:include把另一个jsp页面嵌入到本页面 jsp:forward把用户请求转发到其它页面
五:静态包含<%@ include>与动态包含jsp:include的区别 <%@ include file=”date.jsp” %> include编译指令是在jsp程序的转换时候将file属性所指定的内容嵌入,然后再编译 只生成一个class文件 Include不能带参数 同一个request对象 <jsp:include page=”date.jsp” flush=”true”> include指令在转换时候不会被编译,只有在客户端请求时才会被动态的编译载入 jsp:include可带参数 不同的request对象,可以取得包含它的页面的参数并添加了自己的参数
六:JavaBean的优点 可被多个页面重用 可以在多个应用程序中使用 可以跨平台
七:JavaBean的范围 JavaBean的scope属性,scope属性决定了JavaBean对象存在的范围 page:表示页面的范围;它是scope属性的默认值 request:表示请求范围:(服务器端响应一次客户请求的过程,从servlet容器接受一个客户请求开始,到返回响应结果结束) session:表示会话范围(session的生命的周期及会话范围) application:表示在web应用范围
八:web.xml顺序 :web应用的根元素 :web应用的名字 :对web应用的描述 :定义过滤器 为过滤器指定URL映射 定义servlet 为servlet指定URL映射 配置http会话 设置web应用的welcome文件清单 声明引用标签 声明引用的jndi资源 配置安全约束 配置安全验证登陆 配置安全角色
九:EL表达式 1)EL表达式语言中隐含的对象 applicationScope:把web应用范围内的属性名和属性值进行映射 cookie:把客户请求中的cookie名和cookie对象进行映射 header:HTTP请求头部的项目名和项目值进行映射 headerValues:把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射 initparam:把web应用的初始化参数名和参数值进行映射 pageContext:表示javax.servlet .jsp.PageContext对象 pageScope:把页面范围内的属性名和属性值进行映射 param:把客户请求中的请求参数名和参数值进行映射 paramValues:把客户请求中的请求参数名和所匹配的参数值数组进行映射 requestScope:把请求范围的属性名和属性值进行映射 sessionScope:把会话范围内的属性名和属性值进行映射 2)EL中的表示特定范围 pageScope,requestScope,sessionScope,applicationScope 3)表示HTTP请求中的特定数据 Header,headerValues,param,paramValues 表示pageContext对象 ${pageContext.servletContext} ${pageContext.request} ${pagecontext.response} ${pagecontext.session} 表示web应用的初始化参数的集合
i
n
i
t
P
a
r
a
m
.
d
r
i
v
e
r
在
E
L
表
达
式
里
面
无
法
直
接
访
问
j
s
p
文
件
中
的
隐
含
对
象
必
须
例
如
{initParam.driver} 在EL表达式里面无法直接访问jsp文件中的隐含对象必须例如
initParam.driver在EL表达式里面无法直接访问jsp文件中的隐含对象必须例如{pageContext.request.requestURL}
十:自定义jsp标签 1.Servlet容器得到了Tag对象后会通过下面的步骤 Servlet容器调用Tag对象的setPageContext()和setParent()方法,把当前jsp页面的PageContext对象及父标签处理对象传给当前Tag。如果不存在父标签,把父标签处理对象设为null Servlet容器调用Tag对象的一系列set方法,设置Tag对象的属性。如果标签没有属性,则不需要这个步骤 Servlet容器调用Tag对象的doStartTag()方法 如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内容 Servlet容器调用Tag对象的doEndTag()方法 如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE 2.Servlet容器得到IterationTag对象后,会调用下面的方法 1)Servlet容器调用IterationTag对象的setPageContext()和setParent()方法,把当前的jsp页面的PageContext对象及父标签处理对象传给当前IterationTag对象,如果不存在父标签,则把父标签处理对象设为NULL 2)servlet容器调用IterationTag对象一系列的set方法,设置IterationTag对象的属性。如果没有标签,则没有这个步骤 3)Servlet容器调用IterationTag对象的doStartTag方法; 4)如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内 5)如果执行了标签主体的内容,那么就调用doAfterBody方法 6)如果doAfterBody放回Tag.SKIP_BODY,就不再执行标签的主体内容如果返回Tag.EVAL_BODY_AGAIN,就继续重复执行标签的主体的内容 7)Servlet容器调用IterationTag对象的doEndTag()方法 8) 如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE
十一:JSTL Core标签库 1.一般用途的标签 <c:out>:把一个表达式的结果打印到网页上 <c:set>:设置命名变量的值。如果命名变量为JavaBean,还可以设置JavaBean的属性的值;如果命名变量为map类型,还可以设置与其中的key对应的值 <c:remove>:删除一个命名变量 <c:catch>:用于捕获异常,并把异常对象放在指定的命名变量中 2.条件标签 <c:if>:相当于java中的if语句 <c:choose>,<c:when>和<c:otherwise>相当于java中的if-alse语句 <c:choose> <c:when>IF </c:when> <c:when>ELSE IF </c:when> <c:otherwise>ALSE </c:otherwise> </c:choose> 3.迭代标签 <c:foreach>:用于遍历集合对象,并且能重复执行标签主体 <c:forTokens>:用于遍历字符串中用特定分隔符分割的子字符串,并且能重复执行标签主体 4.URL相关标签 <c:import>包含其他web资源相当于jsp:include指令的作用 <c:url>按照特定的重写规则重新构造url <c:redirect>:负责重定向 5.JSTL 国际化标签 fmt:setLocale设置locale,把locale保存到特定的范围内 fmt:setBundle设置ResourceBundle,把ResourceBundle保存到特定范围内 fmt:bundle设置标签主体使用的ResourceBundle; fmt:message根据属性key返回ResourceBundle中匹配的消息文本 fmt:param为消息文本中的消息参数设置值 fmt:requestEncoding:设置Http请求正文使用的字符编码 6.JSTL 格式化标签 fmt:setTimeZone:设置时区,把时区保存到特定的范围 fmt:timeZone:设置标签主体使用的时区 fmt:formartNumber:格式化数字 fmt:parseNumber解析被格式化的字符串类型的数字 fmt:formartDate格式化日期和时间 fmt:parseDate解析被格式化的字符串类型的日期和时间 7.SQL标签库 sql:setDateSource设置数据源 sql:query执行SQL select语句 sql:param为SQL语句中的?表示的参数赋值 sql:dateparam为SQL语句中的?表示的日期或时间类型参数赋值 sql:update执行SQL insert,update,delete语句,以及执行SQL DDL sql:transaction:声名数据库事务 会话跟踪机制
十二:会话跟踪技术主要包括:Cooike、session、影藏表单域、重写url。 Cookie会话: 创建Cookie: Cookie cookie = new Cookie(“name”,”Tom”); 将Cookie对象添加到HTTP响应中: Response.addCookie(cookie); 读取客户端Cookie: Cookie[] cookies = request.getCookie(); 例子: Cookie cookie = new Cookie(“name”,“value”); response.addCookie(cookie); Cookie cookie = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { out.println(“
找到的每个 cookie 的名称和值");
for (int i = 0; i < cookies.length; i++)
{
cookie = cookies[i];
cookie.getName();
cookie.getValue();
}
}
Session会话:
获取session:
HttpSession session = request.getSession();
添加:
Session.setAttribute(“name”,”tom”);
RequestDispatcher rd= request.getRequestDispatcher(“/跳转的路径”);
rd.forword(request,response);
然后在跳转的页面上通过:
session.getAttribute(“name”);来获得值。
十三:隐藏表单域 将会话跟踪字段的隐藏表单域添加到 HTML 页面,但是不会 显示在客户端浏览器中。如:
十四:请求转发和重定向 请求转发:request.getRequestDispatcher(“/xx.jsp”).forward(request,response);其特点是:地址栏无变化,始终是一个请求,转发的对象可以使本工程内的任何页面。 重定向:就相当于客户端向服务器请求时,服务器响应给客户端一个新的URL浏览器就把请求传递个一个新的页面 特点是:地址发生了变化,重定向的范围没有限制。 十五:JDBC 1.JDBC编程涉及的三个部分 (1)应用程序: 开发人员编写的客户端程序。在应用程序中调用JDBC API,将SQL语句发送到数据库并检索结果。 (2)驱动程序管理器 :JDBC将驱动程序管理器负责使用正确的JDBC驱动程序和连接信息访问数据库,在Java应用程序和数据库系统之间建立连接。 (3)驱动程序:驱动程序由数据库厂商提供,实现数据库驱动接口,能够把SQL指令正确的发送的数据库服务器。
十六.JDBC的使用步骤 注册:DriverManager.registerDriver(driver);一般不使用。 加载:Class.forName(driver); driver:有效JDBC驱动程序名称。 连接:Connection con = DriverManager.getConnection(URL,login_name, login_password); url:连接路径,login_name:数据库登陆账户名,login_passwoer:登陆密码。
十七.关于JDBC编程的重要类和接口 DriverManager类,Connection接口,Statement接口,PreparedStatement接口,ResultSet接口,SQLException类 ①DriverManager类 管理一组 JDBC 驱动程序的基本服务。 最常用的方法 getConnection(String url,String user,String password) 试图建立到给定数据库 URL 的连接。 ②Connection 接口 与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。 Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。 常用的方法 (1)createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。 (2)prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 (3)close() 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。 ③Statement接口定义了一组数据库操作的方法,可以通过这个接口的实现类对象执行指定的SQL命令,Connection.createStatement()方法可以得到Statement类型的对象。 Statement方法常用的方法有: (1)executeUpdate(sql) 返回Int类型,执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句。 (2)executeQuery(sql) 返回单个 ResultSet 对象,执行给定的 SQL 语句,通常为静态 SQL SELECT 语句。 例如ResultSet rs = DriverManager.getConnection(url,name,pwd).createStatemet.executeQuery(sql); (3)execute();执行SQL语句,返回Boolean类型,可能返回多个结果。execute 方法执行 SQL 语句并指示第一个结果的形式。然后,必须使用方法 getResultSet 或 getUpdateCount 来获取结果,使用 getMoreResults 来移动后续结果。 (4)close() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 ④PreparedStatement接口是Statement的子接口,扩展了Statement的功能,通过Connection.preparedStatament()方法获得PreparedStatement对象。 PreparedStatement接口使我们可以使用占位符(?)作为参数定义一条SQL语句,占位符是在SQL语句中出现的标记符,在SQL语句执行之前会被替换成实际的值。 常用方法: (1) int executeUpdate(sql) 执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句。 (2) ResultSet executeQuery()并返回该查询生成的 ResultSet 对象 (3) boolean execute()在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。(4) setString(int parameterIndex, String x) 将指定参数设置为给定 Java String 值。 (5) setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值。 ⑤ResultSet接口 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 ResultSet接口的常用方法: (1) close()立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 (2) next()将光标从当前位置向前移一行。 (3) first()将光标移动到此 ResultSet 对象的第一行。 (4)last()将光标移动到此 ResultSet 对象的最后一行。 (5)getMetaData()获取此 ResultSet 对象的列的编号、类型和属性。 (6)getMetaData().getColumnCount()得到元素个数 (7)getMetaData().getColumnName(i)得到元素名称 (8)getString(int columnIndex) 以Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。 (9)getInt(int columnIndex) 以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。 ……….等等。 ⑥SQLException类 如果发生数据库访问错误,或者是已经关闭的对象上使用一些方法就会产生异常,此时需要使用try/catch进行处理或者是将其thow掉。 4.DriverManager,Connection,Statement,PreparedStatement,ResultSet之间的关系??? DriverManeger类通过getConnection()方法获得Connection对象, Connecton接口通过CreateStatement()方法获得Statement对象, 通过preparedStatement()方法获得PreparedStatement对象, Statement和PreparedStatement接口通过executeQuery()方法获得ResultSet对象。 5,JDBC调用数据库的基本步骤 导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象
十八:Servlet接口中的方法 (1)public void init(ServletConfig config) throws ServletException; Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。 (2)public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException; Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。 (3)public void destroy();当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。 (4)public ServletConfig getServletConfig() 返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。为了你的便利,GenericServlet在执行这个接口时,已经这样做了。 (5)public String getServletInfo(); 允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTML,XML等)。 十九:Servlet与CGI的区别? 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。 Servlet具有平台无关性。
二十:Servlet与applets不同的地方是 它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。
二十一:如何现实servlet的单线程模式 <%@ page isThreadSafe=”false”%>
二十二:JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
二十三:servlet的init()方法和service()方法的区别 初始化时调用init()方法有请求到达时调用service()方法,service()根据请求的类型,调用doget()或depost()等方法。
二十四:什么情况下调用doGet()和doPost()? Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。 二十五:servlet的配置 This is the description of my J2EE component//描述 This is the display name of my J2EE component Aa Aa Aa /servlet/Aa index.jsp//默认页
二十六:JSP中动态INCLUDE与静态INCLUDE的区别? 答:动态INCLUDE用jsp:include动作实现 <jsp:include page=“included.jsp” flush=“true” />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面 <%@ include file=“included.htm” %>
二十七:jsp指令有哪些? 答:jsp指令分为两大类型,page指令和动作指令 动作指令通常有: useBean,setProperty,getProperty,forward,plugin,include。
二十八: &和&&的区别 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与。
二十九:描述JSP和Servlet的区别、共同点、各自应用的范围 尽管JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成擅长于流程控制和事务处理而通过Servlet来生成动态网页很不直观;JSP由HTML代码和JSP标签构成可以方便地编写动态网页因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层。
三十:Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用还是equals()? 它们有何区别? Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 equals()和方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话, 返回真值。
三十一:一个Bean由三部分组成: 实现java.io.serializable接口; 提供无参数的构造方法; 提供getter()和setter()方法访问它的属性。
三十二:JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
三十三: 如果jsp页面执行时遇到自定义标签,遇到结束标签时将调用doEndTag 方法以执行处理。三十三:两种跳转方式分别是什么?有什么区别? 有两种,分别为: <jsp:include page=“included.jsp” flush=“true”> <jsp:forward page= “nextpage.jsp”/> 前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。
三十四:如何防止在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 %>
三十五:在JSP中如何设置COOKIE? COOKIE是作为HTTP HEADER的一部分被发送的,如下方法即可设置: <% Cookie mycookie = new Cookie(“aName”,“aValue”); response.addCookie(mycookie); %>
三十六:在JSP中如何删除一个COOKIE? <% Cookie killMyCookie = new Cookie(“mycookie”, null); killMyCookie.setMaxAge(0); killMyCookie.setPath("/"); response.addCookie(killMyCookie); %>
三十七:在一个JSP的请求处理中如何停止JSP的执行 如下例: <% if (request.getParameter(“wen”) != null) { // do something } else { return; } %>
三十八:使用useBean标志初始化BEAN时如何接受初始化参数 使用如下两标签即可: <jsp:getProperty name=“wenBean” property=“someProperty”/> <jsp:setProperty name=“wenBean” property=“someProperty” value=“someValue”/>
三十九:使用JSP如何获得客户浏览器的信息? 使用request.getHeader(String)即可 。
四十:在servlets和JSP之间能共享session对象吗? 当然可以, HttpSession session = request.getSession(true); session.putValue(“variable”,“value”);
四十一:如何获得当前的sessions数? 可以使用HttpSessionBindingListeners来跟踪 。
四十二:如何设置cookie在某一时间后过期? 用Cookie.setMaxAge(int)
四十三:Jsp页面构成元素 静态模板 由HTML、css、JavaScript等元素构成 指令 设定网页元素的属性,用于提供整个jsp网页的相关信息 <%@ 指令名称 属性1=”属性值” 属性2=”属性值” …%> 语法1:<%@ page contentype=”text/html”;charset=”utf-8”language=”java” import=”com.text.”%>中的内容就是JSP指令; 语法2:<%@ incluede file=”文件名” %> 用于在运行时将HTML文件或JSP页面嵌入到另一个JSP页面中,如:<%@ include file=”index.jsp”%> 表达式在脚本语言中定义,运行后自动转化为字符串,运用于jsp页面,<% =Java 表达式%>中的内容就是JSP指令 Java脚本<%…%>中的内容就是Java的标本scriptlet,在脚本中可以声明变量、书写表达式、使用存在的对象,书写任何合法语句 声明在JSP中可以声明函数或者方法,如:<%! String hello(){….}%> 动作利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码,利用XML语法格式的标记来控制web服务器引擎的行为 注释:JSP页面中的Java代码中遵循Java的注释规则: 如单行注释:// 多行注释:/………*/ 在非script区域中,HTML注释:<!-- – > 服务端注释:<%-- – > 四十四:内置对象 JSP内置对象是web容器加载的一组类,是可以在JSP页面中直接使用的对象,JSP使用Java定义的内置对象来访问网页的动态内容 内置对象的分类: 输入/出对象 request,response、out 作用域通信对象:request、session、application、pagecontext Servlet对象:page、config 错误对象:exception 具体内容: Request:表示客户端对网页的请求 Response:用于处理JSP 生成的响应,使用 HTTP 协议将响应发送给客户端 Session对象常用的方法: void setAttribute(String name,Object value) 以键/值的方式,将一个对象的值存放到session 中 void getAttribute(String name) 根据名称去获取session中存放对象的值 Application对象常用的方法同session Pagecontext对象常用的方法同上 内置对象的作用域:page、request、session 和 application
|