from:http://blog.csdn.net/caipeichao2/article/details/38589293

more:http://www.2cto.com/kf/web/jsp/4.html

JSP的全称是Java Server Pages。它的本质其实就是Servlet,在运行的过程中会编译成Servlet代码。在JSP中可以访问数据库,记录用户的选择信息,访问JavaBean组件。



JSP与CGI的差别。一、性能更加优越,JSP可以直接在HTML网页中嵌入动态的元素,而不需要单独引用CGI文件。二、JSP是已经编译好的,持续运行的程序,一次载入可以服务多次请求,而CGI每次都要载入程序再执行,执行完成之后程序就退出了。三、Java是拥有强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等。四、JSP页面可以和servlet一起使用。



JSP处理流程。

  1. 首先是服务器收到一个请求。服务器判断这个请求是JSP请求,因此将JSP传递给JSP引擎。
  2. JSP引擎从磁盘中读取JSP文件并将其转换成Servlet类。这种转换只是简单的把文本替换成println语句,将所有的JSP元素转换成Java代码。
  3. JSP引擎将Servlet类编译成字节码,然后将原始请求传递给Servlet引擎。
  4. Web服务器中的某个组件会调用Servlet引擎,然后载入并执行Servlet类。一个Servlet对象可以服务多次请求。
  5. 在执行的过程中,Servlet产生HTML格式的文本输出并将其存放在HTTP response中上交给服务器。
  6. Web服务器以静态的HTML网页形式将HTTP response返回到浏览器中。

JSP的生命周期和Servlet类似,只不过多了一个编译的过程。分为四个阶段:

  1. 编译阶段。Servlet容器将JSP编译成Servlet代码,再将Servlet编译成字节码。
  2. 初始化阶段。加载对应的Servlet类,调用jspInit()方法。
  3. 执行阶段。调用\_jspService()方法。
  4. 销毁阶段。调用jspDestroy()方法。

基本语法

JSP只是在html的基础上嵌入一些动态的元素。下面是HelloWorld代码:

  1. <html>
  2. <%
  3. out.println("hello world");
  4. %>
  5. </html>

以上代码中的<% %>就是动态元素。JSP中所有的特殊语法如下:

<% %>:用于表示一段Java代码。这段代码在编译之后会放在_jspService()方法中。

<%! %>:多了一个叹号,也用于表示一段Java代码,但是这段代码编译之后会放在JSP生成的Servlet类中,因此可以用它定义方法或者成员变量。

<%@ %>:多了一个@符号,是JSP指令,用于对JSP文件进行设置。

<%= %>:多了一个等号,相当于out.println()。

<%-- --%>:这是注释。不会在返回结果中显示。



JSP指令。可以设置的指令有三种:

  1. <%@ page %>
  2. <%@ include %>
  3. <%@ taglib %>

page指令可以设置的属性如下:

  • buffer 设置out对象缓冲区的大小。
  • autoFlush 控制out对象的缓冲区。
  • contentType 指定当前JSP页面的MIME类型和字符编码
  • errorPage 指定当JSP页面发生异常时要转向的页面
  • isErrorPage 指定当前JSP页面是否可以作为另外页面的错误页面。错误页面中可以直接使用exception隐含变量获取错误信息。
  • extends 指定Servlet从哪个类继承
  • import 导入要使用的包
  • info 定义JSP页面的描述信息
  • isThreadSafe 指定JSP页面是否线程安全
  • language 指定编程语言,默认为Java
  • session 指定JSP页面是否使用session
  • isELIgnored 指定是否指定EL表达式。
  • isScriptingEnabled 指定脚本元素是否能被使用。如果为false,那么JSP中如果出现<% %>就会发生错误。

include指令用于包含一个文件。语法为<%@ include file="xxx"%>。在编译的时候起作用。



taglib指令用于载入一个自定义标签库。语法为<%@ taglib uri="uri" prefix="xx" %>

动作元素

  • <jsp:scriptlet> 和 <% %> 是等价的。
  • <jsp:expression> 和 <%= %> 是等价的。
  • <jsp:include> 包含文件,在执行的过程中起作用。
  • <jsp:useBean> 初始化一个 JavaBean 组件
  • <jsp:setProperty> 给 JavaBean 设置属性
  • <jsp:getProperty>
  • <jsp:forward> 向另外一个 JSP 文件传递请求。
  • <jsp:plugin> 在生成的页面中包含 Applet 和 JavaBean 对象。在执行的过程中会被替换成 embed 或者 object 标签。
  • <jsp:element> 动态创建 XML 元素。
  • <jsp:attribute> 定义动态创建的 XML 元素属性
  • <jsp:body> 动态创建 XML 元素的主体。
  • <jsp:text> 与 CDATA 连用,显示 CDATA 中的内容,但不执行 CDATA中的标签动作。比如以下代码:
  1. <jsp:text><![CDATA[
  2. <hello></hello>
  3. <jsp:world/>
  4. ]]></jsp:text>

最后输出的结果是:

  1. <hello></hello>
  2. <jsp:world/>

里面的 <jsp:world/> 并没有被执行。

所有的动作元素都是在执行 Servlet 代码的过程中被执行。因此需要注意的是 jsp:include 动作,它是在 Servlet 被执行的过程中才引入文件的。这与<%@ include file=""%>不同,后者是在编译的时候引入的。



所有的动作元素都包含id和scope属性。id用于通过PageContext获取动作元素,scope用于定义对象的寿命。



useBean、setProperty、getProperty的用法。useBean的作用是引入一个JavaBean,需要提供id和class两个参数。id就是变量的名称,class就是变量的类型。setProperty可以放在useBean的标签里面,表示初始化的时候调用。如果沿用现有的JavaBean,那么标签里面的语句是不会调用的。

  1. <jsp:useBean id="test" class="test.TestBean">
  2. <jsp:setProperty name="test" property="name" value="Value"/>
  3. </jsp>

动态创建元素的代码如下:

  1. <jsp:element name="employee">
  2. <jsp:attribute name="name">张三</jsp:attribute>
  3. <jsp:body>张三是销售部经理</jsp:body>
  4. </jsp:element>

该代码会产生:

  1. <employee name="张三">张三是销售部经理</employee>

所谓隐含对象就是已经被系统定义好的一些对象,可以直接使用。JSP中有以下几个隐含对象:

  1. request
  2. response
  3. out 可以使用out.flush来将缓冲区中的数据全都发送到客户端。
  4. session
  5. application 与整个应用的上下文有关。
  6. config
  7. pageContext 与JSP页面的上下文有关。
  8. page 在JSP页面中相当于this指针。
  9. exception 这个对象中包含了从先前页面中包含的异常信息。

下面请看一个使用隐含对象的例子:
  1. <%
  2. out.println("Hello world");
  3. session.put("lastTime", System.currentTimeInMillis());
  4. %>

request对象常用的方法如下:



response对象常用的方法如下:

EL表达式语言

EL就是Expression Language,目的是简化JSP的语法。来看几个例子就明白了。

  1. ${test} 会翻译成<%=test%>
  2. ${test.name} 会翻译成 <%=test.getName()%>
  3. ${sessionScope.username}} 会翻译成 <%=session.getAttribute("username")%>

只有sessionScope、requestScope等才会翻译成getAttribute("xxx"),而其他的对象,会翻译成getXXX()。

EL中还支持四则运算、逻辑运算,语法和Java中的一样。EL中有隐含对象:pageContext、pageScope、requestScope、sessionScope、applicationScope、param、paramValues、header、headerValues、cookie、initParam。param等价于request.getParameter,paramValues等价于request.getParameterValues,返回的是字符串数组。

Java Bean

JavaBean只是一种成熟的约定,很多框架依靠这个约定简化了很多数据。JavaBean和普通的类相比没什么特别之处,本质其实就是普通的Java类,也不需要特定的父类。只要符合下列规则的类就是JavaBean:

  • 有默认构造函数
  • 成员变量都是私有的,只能通过getXX和setXX来访问
  • 可序列化(implements Serializable。可选,在分布式系统中才有意义)

Cookie


Cookies就是保存在浏览器上的一小段文本,是一组键值对。Cookies中包含三个属性,过期时间、路径、域名,所以在HTTP应答中Cookie的样子如下:
  1. Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=example.com
当客户端后续发送请求的时候就会加上Cookie: name=xyz。



Servlet中的Cookie类有以下方法:







JSP中可以向应答中添加多个Cookie,每个Cookie对象是一个键值对,可以往HTTP应答中写入多个Cookie。以下是一个示例:

  1. Cookie cookie = new Cookie("key", "value");
  2. cookie.setMaxAge(86400);
  3. response.addCookie(cookie);

读取Cookie可以通过request.getCookies获取一个Cookie数组。由于可能存在多个Cookie名字相同的情况,因此不能直接通过名称直接获得相应的Cookie。



删除Cookie可以将maxAge设为0,然后调用response.addCookie加入到应答中。


Session

会话管理。HTTP是一个无状态的协议,所以服务器和浏览器需要一个方式来区分用户的身份。首先,浏览器向服务器发送一个请求,服务器检测Cookie中是否有会话ID。如果服务器“不认识”这个会话ID(或者找不到会话ID),那么服务器会创建一个新的唯一编号,放在Map中,Key就是这个新的会话ID,Value就是空的Session对象。浏览器记下Cookie,在后续的请求中都使用这个Cookie。如果服务器认识这个会话ID,那么服务器就会从Map中获取相应的Session对象。



sessionid可以放在Cookie中,也可以放在post表单中,也可以放在url中,比如http://example.com/page;JSESSIONID=45678943。



Session对象常用的方法如下:





Session的过期时间可以在web.xml文件中配置,单位为分钟,Tomcat中默认的超时时间是30分钟。

  1. <session-config>
  2. <session-timeout>15</session-timeout>
  3. </session-config>

Session和Cookie的区别。分析区别之前还是先弄清楚是什么导致了它们的不同。在HTTP刚发明的时候,还没有Session的概念,因此开发者只能将重要的数据保存在Cookie中。但是Cookie的数据是保存在浏览器中的,用户可以任意修改,非常不安全。因此有人提出了Session的概念,在Cookie中只保存一串随机生成的SessionID,服务器根据SessionID查找对应的数据,这样,重要的数据就保存在了服务器上,用户无法随意更改,因此比较安全。

JSP过滤器

过滤器的作用是给web请求增加额外的逻辑,每个页面可以被多个过滤器进行处理。过滤器需要在web.xml文件中进行定义,语法如下。过滤器的执行顺序与filter-mapping的定义顺序相同。

  1. <filter>
  2. <filter-name>FilterName</filter-name>
  3. <filter-class>TestFilter</filter-name>
  4. <init-param>
  5. <param-name>test-param</param-name>
  6. <param-value>test-value</param-name>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>TestFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

文件上传

浏览器上传文件的时候,HTTP请求中的MIME类型必须为multipart/form-data。



文件上传的处理需要使用commons-fileupload库和commons-io库。



在服务端,为了获取文件列表,你需要一个ServletFileUpload对象,这样就可以调用它的parseRequest(request)方法来获得文件列表。为了创建ServletFileUpload,你需要一个DiskFileItemFactory,这个类的作用就是将文件保存到内存中,如果保存不下,就保存到磁盘中。因此需要设置内存的使用量和临时文件的存放路径,分别可以通过setSizeThreshold和setRepository方法。下面是完整的例子。

  1. DiskFileItemFactory factory = new DiskFileItemFactory();
  2. // 设置内存中存储文件的最大值
  3. factory.setSizeThreshold(maxMemSize);
  4. // 本地存储的数据大于 maxMemSize.
  5. factory.setRepository(new File("c:\\temp"));
  6. // 创建一个新的文件上传处理程序
  7. ServletFileUpload upload = new ServletFileUpload(factory);
  8. // 设置最大上传的文件大小
  9. upload.setSizeMax( maxFileSize );
  10. // 解析上传的文件
  11. List fileItems = upload.parseRequest(request);

JSTL

在使用JSTL之前首先要下载jakarta-taglibs-standard-x.x.x.zip,并将压缩包中的standard.jar和jstl.jar加入到WEB-INF/lib下。



JSTL的所有标签见下图:





变量要用$符号括起来,$是EL表达式的写法,通过EL表达式转换成对应的字符串。下面这个例子展示了变量的用法。

  1. <fmt:formatNumber value="${balance}" type="currency"/>

JSTL函数的用法。下面这个例子中,将函数与if标签结合使用。

  1. <c:if test="${fn:contains(theString, 'test')}">
  2. <p>Found test string<p>
  3. </c:if>

数据库操作

下面的代码实现了JSP中数据库的连接,并且创建了一个名为snapshot的数据源。

  1. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test" user="root" password="123456"/>

下面的代码实现了数据库的请求。

  1. <sql:query dataSource="${snapshot}" var="result">
  2. SELECT * FROM users;
  3. </sql:query>

下面的代码展示了参数替换的用法。

  1. <sql:query dataSource="${snapshot}" var="result">
  2. SELECT * FROM users WHERE id = ?;
  3. <sql:param value="${userId}"/>
  4. </sql:query>

自定义标签

自定义标签需要完成两件事,一件是定义标签的规则,有哪些属性,哪些属性是必填的,格式是怎样的,可以包含哪些子标签。另外一件事就是实现标签的功能。



定义标签规则。新建一个tld文件,对于这个例子,文件的内容可以这样写:

  1. <taglib>
  2. <tlib-version>1.0</tlib-version>
  3. <jsp-version>2.0</jsp-version>
  4. <short-name>Test TLD</short-name>
  5. <tag>
  6. <name>hello</name>
  7. <tag-class>com.pc.HelloTag</tag-class>
  8. <body-content>empty</body-content>
  9. </tag>
  10. </taglib>

实现标签的功能。这个例子里面就是简单地将标签替换成Hello World字符串。代码可以写成这样:

  1. public class HelloTag extends SimpleTagSupport {
  2. public void doTag() {
  3. JspWriter out = getJspContext().getOut();
  4. out.println("Hello world!");
  5. }
  6. }

获取标签里面的内容。首先要修改TLD,使其允许在标签里面存放文本。其次是通过invoke函数获取标签里面的内容。

  1. <body-content>scriptless</body-content>
  1. StringWriter writer = new StringWriter();
  2. getJspBody().invoke(writer);

获取标签上的属性。首先要修改TLD,允许标签设置哪些属性。其次,JSP引擎会调用setXXX函数传递属性值。

  1. <tag>
  2. <attribute>
  3. <name>message</name>
  4. </attribute>
  5. </tag>
  1. // 由系统自动调用。
  2. public void setMessage(String message) {
  3. this.message = message;
  4. }

JSP 知识基本的更多相关文章

  1. JSP知识汇总

    JSP知识汇总 一.简介 > HTML - HTML擅长显示一个静态的网页,但是不能调用Java程序. > Servlet - Servlet擅长调用Java程序和后台进行交互,但是它不擅 ...

  2. JSP知识

    五.JSP概述及最佳实践1.更改MyEclipse生成的JSP模板.模板文件与Servlet.java(Servlet模板文件)很近.2.学好JSP的关键:JSP就是Servlet.一定要记住JSP中 ...

  3. JSP知识体系大全

    Jsp动态网页 Web页面之间有3种关系: 包含  请求转发  重定向 l Jsp的运行原理:(3个) Jsp页面不能直接运行 1.容器调用jsp引擎编译jsp文件  成一个java文本(Servle ...

  4. 初识JSP知识

    一.jsp概述 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP实际上就是Servlet. jsp = html ...

  5. 那些你常用的JSP知识

    脚本程序 <> 或者,您也可以编写与其等价的XML语句,就像下面这样: <jsp:scriptlet> 代码片段 </jsp:scriptlet>任何文本.HTML ...

  6. Servlet和JSP知识总结

    1.Servlet接口有哪些方法及Servlet生命周期 Servlet接口定义了5个方法,前三个方法与Servlet生命周期有关: void init() void service() void d ...

  7. JSP知识总结

    day11 JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 1. ...

  8. html与jsp

    1. 什么是 HTML 语言? HTML文件有什么特征? 答:HTML是超文本标记语言(Hypertext Mark-up Language)的缩写,主要用来创建与系统平台无关的网页文档.它是目前网络 ...

  9. Java EE基础之JSP(三)

         原来准备简单点,用一篇文章介绍完JSP的,没想到细节很多.这是第三篇也是最后一篇,这三篇文章介绍了基本的JSP知识,很多名词概念和用法,一定要在实践项目中使用之后才会有更加亲切的体会.第三篇 ...

随机推荐

  1. PGM:概率论基础知识

    http://blog.csdn.net/pipisorry/article/details/52459847 概率图模型PGM:概率论基础知识 独立性与条件独立性 独立性 条件独立性 也就是表示给定 ...

  2. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. java学习路线图-----java基础学习路线图(J2SE学习路线图)

    安装JDK和开发软件跳过,网上太多了,不做总结,以下是我总结的学习路线图,欢迎补充. JAVA基础语法 注释,标识符命名规则及Java中的关键字 Java基本数据类型 Java运算符与表达式 Java ...

  4. 使用jQuery AJAX读取二进制数据

    READING BINARY DATA USING JQUERY AJAX http://www.henryalgus.com/reading-binary-files-using-jquery-aj ...

  5. Android Studio基本配置

    主题设置 File→Settings- 添加第三方主题 网址:http://www.ideacolorthemes.org/home/ File→Import Settings- 设置控制台字体大小 ...

  6. Linux系统编程----僵尸进程

    什么是僵尸进程? 僵尸进程, 指子进程退出后, 父进程还没有回收子进程的资源,这个子进程就处在于僵尸状态. 来看看如何产生? #include <stdio.h> #include < ...

  7. linux常用的压缩与解压缩命令

    1.gzip 压缩 gzip 是压缩文件,压缩之后文件后缀为.gz 用法:gzip 选项 [文件] 2.gunzip 解压 这个命令与gzip的功能刚好相反,这个是解压. 用法 gunzip 选项 [ ...

  8. Portlet开发入门实例

    1原生Portlet开发 这是最简单.最本质的开发方式,直接基于Portlet规范定义的接口开发Portlet.优点是贴近底层比较灵活, 缺点当然就是所有事情都要自己去做.就好比不用SpringMVC ...

  9. Handler,MessageQueue Loop 和Message的原理解析

    先介绍和handler一起工作的几个组件 Handler的方法介绍 代码示例 package liu.peng.weather; import java.util.Timer; import java ...

  10. (八十)MapKit放置系统默认大头针和自定义大头针

    有关MapView的显示和定位在上一节已经说明,这一节说明如何在地图上放置大头针,以及设置点击大头针的视图. [系统默认大头针] mapView上放置大头针的方法是调用其addAnnotation:方 ...