JavaWeb开发之JSP技术

  1. JSP 技术
    JSP是Sun公司提供的动态Web资源开发技术,为了解决在Servlet中拼写Html、CSS、Js内容身份不方便的问题。
    jsp页面在第一次被访问到时会被jsp翻译引擎翻译成一个Servlet—JspName_jsp.java (这个Servlet放在TomcatHome/work/Catalina/Host/App/...),从此对这个jsp页面的访问都是由这个Servlet的 _jspService 执行后进行输出.

JSP页面中使用的JavaL类库需要在JSP页面进行声明:
<%@ page import = "java.util.Date" %>

JSP—index.jsp:
<%@ page import = "java.util.Date" %>
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
    pageEncoding = "UTF-8" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd " >
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > Index </ title >
</ head >
< body >
 Welcome to index.jsp...
  <%
  String str = "This is a Page!" ;
  %>
  < hr >
 Now: <%= new Date(). toLocaleString() %>
  < hr >
<%
out.write(str);
%>
< hr >
 
</ body >
</ html >

Servlet—index_jsp.java
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\n");
      out.write("\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \" http://www.w3.org/TR/html4/loose.dtd \">\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
      out.write("<title>Index</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write(" Welcome to index.jsp...\n");
      out.write(" ");

    String str = "This is a Page!";
      out.write("\n");
      out.write(" <hr>\n");
      out.write(" Now:");
      out.print(new Date().toLocaleString() );
      out.write("\n");
      out.write(" <hr>\n");

    out.write(str);

      out.write("\n");
      out.write("<hr>\n");
      out.write(" \n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
        
    2.jsp语法
        (1)JSP模版元素 :jsp页面中书写的HTML内容称作JSP的模版元素,在翻译过来的Servlet中直接被out.write()输出到浏览器页面上了
            
        (2)JSP表达式 <%= java表达式 %> 在翻译过来的Servlet中,计算java表达式的值后,被out输出到浏览器上
        
        (3)JSP脚本片断 <% 若干java语句 %> 在翻译过来的Servlet中,直接被复制粘贴到了对应的位置执行.
            在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素
            多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况
            单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
        (4)JSP声明  <%! 若干java语句 %> 在翻译过来的Servlet中会被放置到和Service方法同级的位置,变成了类的一个成员
            
        (5)JSP注释
         <%-- 注释的内容 --%> 被jsp注释注释掉的内容,在jsp翻译引擎将jsp翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息
         <%//java注释%> java注释被当作jsp脚本片段被翻译到了Servlet中,在.java文件被翻译成.class文件的时候注释信息被丢弃
         <!-- HTML注释 --> html注释被当作模版元素输出到了浏览器上,浏览器认识html注释不予显示
       
        (6) JSP指令
    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:
    page指令
    Include指令
    taglib指令
JSP指令的基本语法格式:
    <%@ 指令 属性名="值" %>

1) Page指令
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面

<%@ page
    [ language="java" ]
    [ extends="package.class" ]
    [ import="{package.class | package.*}, ..." ]
    [ session="true | false" ]
    [ buffer="none | 8kb | sizekb" ]
    [ autoFlush="true | false" ]
    [ isThreadSafe="true | false" ]
    [ errorPage="relative_url" ]
    [ isErrorPage="true | false" ]
    [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
    [ pageEncoding="characterSet | ISO-8859-1" ]
    [ isELIgnored="true | false" ]
%>

2)include指令
    include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
    <%@ include file="relativeURL"%>
    其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节:
被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

3)taglib指令
    Taglib指令用于在JSP页面中导入标签库,

        (7) JSP标签
        (8) JSP内置对象
JSP运行原理和九大隐式对象:
    每个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大对象的引用。

九大隐式对象:
request
response
config
application
exception —— 需要JSP指定  <%@ page isErrorPage = "true" %>
Session
page
out
pageContext

Out:
out隐式对象用于向客户端发送文本数据。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
    A. 设置page指令的buffer属性关闭了out对象的缓存功能
    B. out对象的缓冲区已满
    C. 整个JSP页面结束

PageContext:
            (1)可以作为入口对象获取其他八大隐式对象的引用
                getException方法返回exception隐式对象
                getPage方法返回page隐式对象
                getRequest方法返回request隐式对象
                getResponse方法返回response隐式对象
                getServletConfig方法返回config隐式对象
                getServletContext方法返回application隐式对象
                getSession方法返回session隐式对象
                getOut方法返回out隐式对象
            (2)域对象,四大作用域的入口,可以操作四大作用域中的域属性
                
                作用范围: 当前jsp页面
                生命周期: 当对jsp页面的访问开始时,创建代表当前jsp的PageContext,当对当前jsp页面访问结束时销毁代表当前jsp的pageContext
                作用:在当前jsp中共享数据
                
                    public void setAttribute(java.lang.String name,java.lang.Object value)
                    public java.lang.Object getAttribute(java.lang.String name)
                    public void removeAttribute(java.lang.String name)
                    public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
                    public java.lang.Object getAttribute(java.lang.String name,int scope)
                    public void removeAttribute(java.lang.String name,int scope)
                    
                    PageContext.APPLICATION_SCOPE
                    PageContext.SESSION_SCOPE
                    PageContext.REQUEST_SCOPE
                    PageContext.PAGE_SCOPE
                    findAttribute方法 -- 搜寻四大作用域中的属性,如果找到则返回该值,如果四大作用域中都找不到则返回一个null,搜寻的顺序是从最小的域开始向最大的域开始寻找
                    
            (3)提供了请求转发和请求包含的快捷方法
                pageContext.include("/index.jsp");
                 pageContext.forward("/index.jsp");

错误页面:
全局错误页面可以在web.xml 文件中配置:

以错误码的方式定义错误页面:
< error-page >
       < error-code > 404 </ error-code >
      < location > /WEB-INF/errors/404. jsp </ location >
</ error-page >

以错误类型的方式定义错误页面:

< error-page >
       < exception-type > java.lang.Exception </ exception-type >
      < location > /WEB-INF/errors/exception.jsp </ location >
</ error-page >


四大作用域:
    servletContext (application)
    session (session)
    request (request)
    pageContext

    如果一个数据只在当前jsp页面使用,可以使用pageContext域存储
    如果一个数据,除了在当前Servlet中使用,还要在请求转发时带到其他Servlet处理或jsp中显示,这个时候用request域
    如果一个数据,除了现在我自己要用,过一会我自己还要用,存在session域
    如果一个数据,除了现在我自己要用过一会其他人也要用,存在ServletContext域中s

jsp映射
            <servlet>
                <servlet-name>index</servlet-name>
                <jsp-file>/index.jsp</jsp-file>
            </servlet>
            <servlet-mapping>
                <servlet-name>index</servlet-name>
                <url-pattern>/jsp/*</url-pattern>
            </servlet-mapping>


发布了25 篇原创文章 · 获赞 36 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/DreamLi1314/article/details/79382210
今日推荐