Jsp技术总结

简介:

目录(?)[+]

这节我们总结一下Jsp的相关技术。

1. 什么是JSP

        JSP即Java Server Pages,它和servlet技术一样,都是sun公司定义的一种用于开发动态web资源的技术。该技术的最大特点在于:写JSP就像写html,但它相比html而言,html只能为用户提供静态数据,而JSP技术允许在页面中嵌套java代码,为用户提供动态数据。

2. JSP原理

1) web服务器是如何调用并执行一个JSP页面的?

        服务器首先将JSP翻译为一个Servlet,翻译过后的Servlet可以在\tomcat主目录\work\Catalina\localhost\工程名\org\apache\jsp目录下查看,这是服务器的工作目录。打开相应的Servlet可以看到,翻译过后的servlet继承了org.apache.jasper.runtime.HttpJspBase,而HttpJspBase继承了HttpSerrvlet。说到这里,我们就明白了,其实JSP就是一个Servlet,访问jsp即访问一个Servlet。

2) JSP页面中的html排版标签是如何被发送到客户端的以及java代码服务器是如何执行的?

        继续浏览JSP翻译过后的Servlet,里面有个service方法_jspService(request, response),在该方法中可以看到,JSP中的所有内容都会翻译到service方法中,html代码会通过out输出,就像学习JSP之前,在Servlet中用out输出html语句一样,java部分代码会原封不动的搬到service方法中。

3) web服务器在调用JSP时,会给JSP提供一些什么java对象?

        web服务器在将JSP翻译成Servlet时,会在service方法中提供web开发所有的对象,这样在JSP页面中,我们就可以直接使用这些对象了,而不用再去获得。web服务器所提供的对象(这些对象我们下面户详细分析)有:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. final javax.servlet.jsp.PageContext pageContext;         //pageContext对象  
  2. javax.servlet.http.HttpSession session = null;           //session对象  
  3. final javax.servlet.ServletContext application;          //application对象  
  4. final javax.servlet.ServletConfig config;                //config对象  
  5. javax.servlet.jsp.JspWriter out = null;                  //out对象  
  6. final java.lang.Object page = this;                      //page对象  
  7. javax.servlet.jsp.JspWriter _jspx_out = null;              
  8. javax.servlet.jsp.PageContext _jspx_page_context = null;   
        还有service方法的参数request和response。所以Servlet可以做的事,JSP都可以做。但是两者各有特点,我们继续往下看。

3. JSP的最佳实践

        不管是JSP还是Servlet,虽然都可以用于开发动态web资源,但是由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。原因在于,程序的数据通常要美化后再输出。让JSP既用java代码产生动态数据,又做美化会导致页面难以维护;让Servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护;因此最好的办法就是让Servlet负责相应请求产生的数据,并把数据通过转发技术带给JSP,JSP用来做数据的显示。

4. JSP语法

1) JSP模板元素

        JSP模板元素即JSP页面中的HTML内容。JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。

2) JSP脚本表达式

        JSP脚本表达式用于将程序数据输出到客户端。

        语法:<%= 变量或表达式 %> 如:当前时间:<%= new java.util.Date() %>
        JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输给客户端。
        注意:JSP脚本表达式中的变量或表达式后面不能有分号(;)

3) JSP脚本片段

        JSP脚本片段用于在JSP页面中编写多行java代码。
        语法:<% 多行java代码 %>
        注意:JSP脚本片段只能出现java代码,不能出现其他模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本片段中的Java代码原封不动的放到Servlet的_jspService方法中。JSP脚本片段中的java代码必须严格遵循java语法。
        在一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记和其他JSP元素。不同脚本片段中的代码可以相互访问,犹如将所有的代码放到一个<% %>中一样。但是所有的脚本片段组合在一起必须是一个完整的java代码。

4) JSP声明

        JSP声明中的java代码会被翻译到_jspService方法的外面。(面试题)
        语法:<%! java代码 %>
        所以,JSP声明可用于定义JSP页面转换成Servlet程序的静态代码块、成员变量和方法。多个静态代码块、变量和方法可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
        JSP隐式对象的作用范围仅限于Servlet的_jspService方法中,而JSP声明的代码会被翻译到该方法的外面,所以在JSP声明中不能使用这些隐式对象。

5) JSP注释

       语法:<%- 注释信息 -%>
       JSP引擎在将JSP页面翻译成Servlet时,忽略JSP页面中被注释的内容。
        如果在JSP中使用<!-- 注释内容-->时,注释内容会打给浏览器,浏览器认识这个注释,所以不会显示给用户。而JSP注释将注释内容不打给浏览器。

6) JSP指令

        JSP指令是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中其余的部分。
        语法:<%@ 指令 属性名="值" %>
        如:<%@ page contentType="text/html;charset=UTF-8" %>     <%@ page import="java.util.Date" %>
        如果一个指令有多个属性,这多个属性可以写在一个指令中,中间用空格隔开。即上面两条指令等价表示如下:      

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page contentType="text/html;charset=UTF-8" import="java.util.Date" %>          

        在JSP2.0规范中共定义了三个指令:
         1)page指令

         page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它的作用都是整个JSP页面。为了保持程序的可读性,page指令最好放在整个JSP页面的起始位置。   
          语法:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page  
  2.               [import="{package.class | package.*},..."]  
  3.               [session="true | false"]  
  4.               [errorPage=""relative_url]  
  5.               [isErrorPage="true | false"]  
  6.               [contentType="mimeType[;charset=characterSet]" | "text/html;charset=ISO-8859-1]  
  7.               [pageEncoding="characterSet | ISO-8859-1"]  
  8.               [isELIgnored="true | false"]   
  9. %>     
         JSP引擎会自动导入如下包:java.lang.* / java.servlet.* / javax.servlet.jsp.* / javax.servlet.http.*
         JSP导入多个包的时候,可以分开写,也可以放在一起写,放在一起的时候,使用逗号分隔:         
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ paga import="java.util.Date,java.sql.*,java.io.*"%>      
         session属性设置为true时,翻译后的servlet中会自动创建session对象,false则不创建。
         errorPage属性用来设置错误相应页面。它的值必须使用相对路径,如果以"/"开头,表示相对于当前web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。也可以在web.xml文件中使用<error-page>元素为整个web应用程序设置错误处理页面,其中<exception-type>子元素指定异常类的完全限定名,<location>元素指定以"/"开头的错误处理页面路径。如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
         isErrorPage为true时,表示该页面是处理错误页面,JSP引擎在翻译成servlet时,会定义一个exception对象,从而就可以用exception隐式对象获得出错信息。
         JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语句。       

        2) include指令:   
        include指令用于引入其他JSP页面,如果使用include指令引入了其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet,所以include指令引入通常称为静态引入。由于JSP引擎会把多个JSP页面翻译成一个Servlet,所以,在被引入的JSP中,全局架构的代码可以去掉(<html><head><body>等)(当然这不是必须的),这样避免与当前JSP页面中的重复。
       语法:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <% include file="relativeURL"%>  
       其中file属性用于指定被引入文件的路径。以"/"开头,表示代表当前web应用。

       几个细节需要注意:
         · 被引入的文件必须遵循JSP语法;
         · 被引入的文件可以使用任意的扩展名,即使扩展名为html,JSP引擎也会按照处理JSP页面的方式去处理,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名;
         · 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个Servlet,所以这两个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。比如现在要引入两个JSP页面,一个JSP中session="true",另一个JSP中session="false",这样在引入这两个JSP页面时就会产生冲突,服务器会报错。
       在JSP中也可以使用java代码实现动态包含:   

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <% request.getRequestDispather("relativeURL").include(request,response);%>  
       这样JSP引擎会将不同的JSP页面翻译成不同的Servlet,动态包含只是引入其他JSP页面的结果。动态包含的时候,服务器会调用多个web资源,而静态包含时,被翻译成一个Servlet,服务器只需要调用一个web资源,所以静态包含性能好一点,开发时用静态包含。

        3)taglib指令:用来导入自定义标签库,见后面自定义标签部分的内容

5. JSP运行原理和9大隐式对象

        由上文可知:每个JSP页面在第一次被访问时,web容器都会把请求交给JSP引擎(即一个java程序)去处理。JSP引擎现将JSP翻译成一个_jspServlet(实质上也是一个Servlet),然后按照Servlet的调用方式进行调用。由于JSP第一次访问时会翻译成Servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
        JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用,9大隐式对象是哪些以及各自的作用是什么?

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. request://就是Servlet里的request  
  2. response: //就是Servlet里的response  
  3. session: //就是Servlet里的session  
  4. application: //就是servlet里的servletContext  
  5. config: //就是Servlet里的servletConfig  
  6. page: //就是Servlet自己  
  7. exception: //异常,只有errorPage才有  
  8. out://JSP页面输出  
  9. pageContext:<span style="font-family:Microsoft YaHei;">//</span>pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境  
        pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. getException<span style="font-family:Microsoft YaHei;">()  //</span>方法返回exception隐式对象  
  2. getPage<span style="font-family:Microsoft YaHei;">()  //</span>方法返回page隐式对象  
  3. getRequest()  //方法返回request隐式对象  
  4. getResponse()  //方法返回response隐式对象  
  5. getgetServletContext()  //方法返回application隐式对象  
  6. getServletConfig()  //方法返回config隐式对象  
  7. getSession()  //方法返回session隐式对象  
  8. getOut()  //方法返回out隐式对象  
pageContext作为一个域对象,还封装了下面的方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //pageContext域对象的方法:  
  2. public void setAttribute(String name, Object value)  
  3. public Object getAttribute(String name)  
  4. public void removeAttribute(String name)  
  5. //pageContext对象中还封装了访问其它域的方法(重要)  
  6. public void setAttribute(String name, Object value, int scope)  
  7. public Object getAttribute(String name, int scope)  
  8. public void removeAttribute(String name, int scope)  
  9. //代表各个域的常量  
  10. pageContext.APPLICATION_SCOPE  
  11. pageContext.SESSION_SCOPE  
  12. pageContext.REQUEST.SCOPE  
  13. pageContext.PAGE_SCOPE  
        到现在为止,应该可以看出pageContext对象的强大之处了!另外还有个findAttribute方法(*重要,查找各个域中的属性,EL表达式就依赖于这个方法),可以直接调用pageContext.findAttribute(String name),首先会从pageContext里找该属性,如果没有,会依次按照下面顺序在相应的域中查找:request, session, servletContext,如果没找着,返回null,否则返回属性值。
        pageContext类中定义了一个forward方法和两个include方法分别简化和替代RequestDispatcher.forward方法和include方法,方法接收的资源如果以"/"开头,"/"代表当前web应用。不过这里的include是动态包含,不建议使用include。

6. JSP标签

        JSP标签也称为JSP动作元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码造成JSP页面难以维护。JSP有三种标签

1) <jsp:include>标签

        <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称为动态引入。
        语法:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <jsp:include page="relativeURL | <%= expression%>" flush="true | false" />  
        相当于调用pageContext.include("relativeURL")
        page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面都已输出的内容刷新到客户端。

2) <jsp:forward>标签

        <jsp:forward>标签用于把请求转发给另一个资源
        语法:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <jsp:forward page="relativeURL | <%= expression%>" />  
        page属性用于指定请求转发到的资源的相对路径,它可以通过执行一个表达式来获得。

3) <jsp:param>标签

        当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
        语法1:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <jsp:include page="relativeURL | <%=expression%>">  
  2.       <jsp:param name="parameterName" value="parameterValue | <%=expression%>" />  
  3. </jsp:include>  
        相当于relativeURL?name=...&value=....
        语法2:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <jsp:forward page="relativeURL | <%=exception%>">  
  2.       <jsp:param name="parameterName" value="parameterValue | <%=expression%>" />  
  3. </jsp:forward>  
        相当于relativeURL?name=...&value=....
        <jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。

7. JSP映射

        JSP也可以像Servlet那样映射,因为JSP本来就是Servlet。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>SimpleJspServlet</servlet-name>  
  3.     <jsp-file>/jsp/simple.jsp</jsp-file>  
  4. </servlet>  
  5.   
  6. <servlet-mapping>  
  7.     <servlet-name>SimpleJspServlet</servlet-name>  
  8.     <url-pattern>/xxx/yyy.html</url-pattern>  
  9. </servlet-mapping>  
        /jsp/simple.jsp表示在webRoot/jsp目录下的simple.jsp文件

8. 四个域对象

        到目前为止,web开发共接触到了4个域对象,这4个域对象是学习web的重点,也是笔试经常考察的知识点:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. pageContext(称为page域): //pageContext中存的数据在页面范围都可以取出  
  2. request(称为request域):  //request中存的数据在请求范围内都可以取出  
  3. session(称为session域):  //session中存的数据在会话范围内都可以取出  
  4. servletContext(称为application域)://servletContext中存的数据在整个应用程序范围内都可以取出  
        明确如下两个问题:这四个对象的生命周期?哪种情况下用哪种对象?
        request:如果客户机向服务器发请求产生的数据,用户看完就没用了,向这样的数据就存在request域中。如用户看的新闻。
        session:如果客户机向服务器发请求产生的数据,用户用完了等一会儿还有用,向这样的数据就存在session域中。如用户购买的东西,因为结账还要用到。
        servletContext:如果客户机向服务器发请求产生的数据,用户用完了还要给其他用户用,向这样的数据就存在servletContext域中。如聊天室中说出的话,因为话要在自己页面中看到,别人也要看到。
        实际中,能用小的容器就不要用大的,即request能满足就不要用session,session能满足就不要用servletContext 

9. 总结

        由于JSP一般都是通过servlet转发过来,servlet会通过容器将数据带过来,所以会使用JSP从容器中取出数据然后显示出来即可。取数据用脚本片段<%%>来取,显示用脚本表达式<%= %>处理。在学习了EL表达式和自定义标签后,脚本片段就可以用自定义标签替代,脚本表达式就可以用EL表达式替代了。

        相关阅读:http://blog.csdn.net/column/details/servletandjsp.html

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15

相关文章
|
7月前
|
存储 XML SQL
【JavaWeb】渲染技术Jsp
JSP 全称是 Java Server Pages,Java 的服务器页面 JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码, 为用户提供动态数据 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数据的同时,也很容易对数据进行排版。
|
3月前
|
SQL 前端开发 Java
JSP技术详解及其在Web开发中的应用
【1月更文挑战第2天】本文将对JSP(Java Server Pages)技术进行详细的介绍和分析。JSP是一种基于Java的服务器端编程技术,它允许开发者在HTML或XML等文档中直接嵌入Java代码片段,从而动态地生成Web页面内容。本文将首先阐述JSP的基本原理和工作机制,然后讨论其在Web开发中的各种应用场景,包括表单处理、数据库访问、会话管理等,并通过实例代码展示JSP的实际应用。最后,本文将对JSP的优缺点进行评述,并对未来的发展趋势进行展望。
114 10
|
3月前
|
Java 数据库连接 数据库
通过JSP、JavaBean、JDBC、Servlet技术,实现用户登录功能
通过JSP、JavaBean、JDBC、Servlet技术,实现用户登录功能
|
8月前
|
存储 前端开发 Java
|
4月前
|
开发框架 前端开发 JavaScript
毕业设计论文--外文翻译:JSP技术简介
毕业设计论文--外文翻译:JSP技术简介
|
6月前
|
SQL 前端开发 Java
JSP个人信息管理系统myeclipse开发sql数据库BS模式java编程struts2技术mvc框架
JSP 个人信息管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助struts2技术mvc框架,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
56 0
|
6月前
|
SQL 前端开发 Java
JSP网上订餐管理系统myeclipse开发sql数据库BS模式java编程servlet技术mvc框架
JSP 网上订餐管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servlet技术mvc框架,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
38 0
|
6月前
|
前端开发 Cloud Native Java
JSP 技术从问世到淘汰,它到底经历了什么?
JSP 技术从问世到淘汰,它到底经历了什么?
149 0
|
7月前
|
Java 应用服务中间件
jsp技术
jsp技术
117 0
|
8月前
|
SQL XML 前端开发
JavaWeb开发 JSP技术详解(一)
JavaWeb开发 JSP技术详解(一)