zoukankan      html  css  js  c++  java
  • JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象

    1 什么是JSP
      1)为什么说,Servlet是一个动态Web开发技术呢?
        Servlet是基于服务端的一种动态交互技术,
        HttpServletRequest表示客户端到服务端的对象
        HttpServletResponse表示服务端到客户端的对象
      2)JSP是SUN公司开发的一个基于服务端的一种动态WEB开发技术
      3)JSP的代码结构/内容=HTML+JSP所有元素内容  
      4)在IDE工具中,开发JSP,pageEncoding有二层含义:
        a)指明当前JSP中的中文采用什么方式编码(如果在IDE工具外)
        b)指明当前JSP页面保存时采用什么方式编码
      5)项目中,JSP最佳实践模式:
        Servlet:适合控制器
        Jsp:适合显示
        JavaBean:模型

        不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

        其原因为,程序的数据通常要美化后再输出:

            •让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

            •让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

            •因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

    package cn.itcast.web.servlet;
    
    import java.io.IOException;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import cn.itcast.web.domain.TableBean;
    
    public class TableServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            //调用模型对象
            TableBean tableBean = new TableBean();
           List<String> stringList = tableBean.getList();
            //绑定到域对象
            request.setAttribute("stringList",stringList);
            //转发到jsp页面
            request.getRequestDispatcher("/WEB-INF/table.jsp").forward(request,response);
        }
    }
    package cn.itcast.web.servlet;
    
    import java.io.IOException;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import cn.itcast.web.domain.TableBean;
    
    public class TableServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            //调用模型对象
            TableBean tableBean = new TableBean();
            List<String> stringList = tableBean.getList();
            //绑定到域对象
            request.setAttribute("stringList",stringList);
            //转发到jsp页面
            request.getRequestDispatcher("/WEB-INF/table.jsp").forward(request,response);
        }
    }
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%    
              //取得域对象中的内容
              List<String> stringList = (List<String>)request.getAttribute("stringList");
          %>
           <table border="1" align="center">
               <caption>学员信息</caption>
               <tr>
                   <th>姓名</th>
                   <td>操作</td>
               </tr>
            <%
                for(String username : stringList){
            %>               
                   <tr>
                       <th><%=username%></th>
                       <td><a href="#">查看</a></td>
                   </tr>
               <%
                }           
               %>
           </table>
      </body>
    </html>


    *2 JSP工作原理
      1)Web容器根据客户端访问的资源类别(Web容器会根据资源的第一行代码确定),如果你访问的是JSP资源,就交由JSP引擎处理
        如果你访问的是Servlet资源,就交由Servlet引擎处理
      2)如果是JSP资源,JSP引擎会将其翻译成Servlet资源,传入相关的对象,如果是静态资源,以out.write()形式输出,如果是动态     资源,以out.print()形式输出
      3)此时JSP引擎在翻译正确后,将其输出给Servlet引擎,当作Servlet处理。
      4)如果再次访问同一个date.jsp文件,翻译工作依然进行,Servlet引擎工作可以减化,所以这是为会么第N次较第1次快的原因
     
    3 JSP语法
      1)JSP模版元素
        模版元素就是HTML中的静态内容,即<body>,<table>,<form>标签。。。

      2)JSP表达式
            a)语法:<%="字符串变量或表达式"%>
            b)结束无分号     
            c)默认输出到浏览器

            d)JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.write(…) 将数据输给客户端。

      3)JSP脚本片断
        a)语法:<% ...java代码; %> 
        b)脚本片断中的注释符号与java代码一致
            注意:JSP修改后,无需重新部署,直接刷新,Web容器会自动比较新旧二个版本的JSP
        c)多个JSP脚本片断中定义的变量,本质是_jspService()方法中的局部变量,可以相互访问

            在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

            举例:

            多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%="这是JSP的脚本输出表达式"%>
          <hr/>
          <%=new Random().nextInt(1000)%>
          <hr/>
          <%    
              //以下代码是JSP的脚本
              Random r = new Random();
              double num = r.nextDouble();
          %>
          随机数是:<%=num%><br/>
      </body>
    </html>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
            for(int i=1;i<=6;i++){
        %>    
                <h<%=i%>>JavaWebGood!</h<%=i%>>
        <%            
            }
         %>
         <hr/>
         <%
             String name = "喜喜";
         %>
         用户名:<font color=""><%=name%>      
      </body>
    </html>

      4)JSP声明
        a)语法:<%! ...java代码 %> 
        b)JSP声明的变量或方法,会成为Servlet的实例变量或实例方法或普通方法 
        c)JSP脚本片断中不能定义局部方法,方法只能定义在JSP声明中
         

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ page import="java.io.*"%>
    <%@ page import="java.net.*"%>
    <%@ page buffer="8kb" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <!--
              HTML注释     
        -->
        <%-- 
            JSP
            注释(写JSP优先推荐使用)引擎不会加载
        --%>
        <%!
            String name = "呵呵"; 
        %>  
        <%!
            public String getName(){
                return name;
            }
        %>
        <%
            String name = "局部变量";
        %>
        
        
        该实例变量为:<%=getName()%>
      </body>
    </html>

      5)JSP注释
        1)语法:<%-- 注释的内容 --%>
            2)对于HTML注释来说,JSP引擎会将其翻译成servlet内容,
          对于JSP注释来说,JSP引擎不会将其翻译成servlet内容
            3)注释不能嵌套使用 
      6)JSP指令
        1)指令是程序员控制JSP引擎做什么的依据
        2)有三类:
            a)page
            b)include
            c)tablib

        JSP指令的基本语法格式:

            <%@ 指令属性名="值" %>

            举例:<%@ page contentType="text/html;charset=UTF-8"%>

            如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。

            例如:

                <%@ page contentType="text/html;charset=UTF-8"%>

                <%@ page import="java.util.Date"%>

            也可以写作:

                <%@ page contentType="text/html;charset=UTF-8" import="java.util.Date"%>

       *3)page指令的属性有
            language="指明JSP支持的语言,默认为java语言" 
          *import="当前JSP页面中,需要导入的包,其中import可以写多次" 
            session="true表示需要服务器创建session/false不需要服务器创建session",默认true
            buffer="none|8kb|sizekb"JSP输出使用的缓存大小,默认8kb
            autoFlush="true表示当缓存满时,web容器是自动刷新到客户端/false需要手工刷新到客户端",默认true 
            isThreadSafe="true表示web服务器确保线程安全/false不确保线程安全",默认true

            info="text"表示jsp的相关描述信息,可以通过getServletInfo()取得该jsp的信息 

            三种错误处理方式,try-catch->jsp页面处理->webxml配置处理
          *errorPage="当前jsp页面出错后,转发到的目标页面" 
          *isErrorPage="true"(当某个jsp页面有该属性时,web容器会自动创建exception对象    
            上述异常处理属于局部异常处理
            在web.xml文件:     

    <error-page>
            <error-code>500</error-code>
            <location>/s_500.jsp</location>
        </error-page>
        <error-page>
            <exception-type>java.lang.NumberFormatException</exception-type>
            <location>/s1_500.jsp</location>
        </error-page>

            上述异常处理属于全部异常处理.如果全局中有code又有type,此时二者同时显示.当全局和局部异常同时出现时,局部异常优先

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page errorPage="error.jsp" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              Integer.parseInt("abc");
          %>    
      </body>
    </html>
    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page isErrorPage="true" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        出错了:原因如下<br/>
        <%=exception.getMessage()%>
      </body>
    </html>

           *pageEncoding="UTF-8"  
            前提在IDE工具中
                a)JSP页面的中文采用UTF-8方式编码   
                b)JSP保存时采用UTF-8方式编码
                c)指示浏览器以UTF-8方式查看

            contentType="text/html;charset=UTF-8"  
          *isELIgnored="false表法JSP引擎不忽略EL表达式语言/true表法JSP引擎忽略EL表达式语言"

    9)如何查找JSP页面中的错误

    4 JSP出错后处理方法

    5 M(Javabean)V(Jsp)C(Servlet)模式

    6 @include指令[静态包含]
      1)include指令包含多个JSP页面,最后JSP引擎只翻译总JSP页面,即index.jsp页面
      2)include指令包含多个JSP页面,那么被包含的JSP页面原封不动的进入总JSP页面,即index.jsp页面,造成HTML结构非常混乱
      3)include指令包含多个JSP页面,多个JSP最终会翻译成一个Servlet,即index_jsp.java页面
     

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page errorPage="error.jsp" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
      <%-- 包含head.jsp和foot.jsp --%>    
        <%@ include file="common/head.jsp"%>
            <hr/>
            include指令的用法
            <hr/>
        <%@ include file="common/foot.jsp"%>
          <%--
              Integer.parseInt("abc");
          --%>    
      </body>
    </html>


    *7 jsp九大隐式/内置对象
        1)request

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              //进行以请求体为主的中文编码[输入]
              request.setCharacterEncoding("UTF-8");
    
              //收集客户端提交的数据
              String username = request.getParameter("username");
              
              //使用response对象输出到浏览器
              response.getWriter().write("用户名:" + username);
          %>
      </body>
    </html>
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              //进行以请求体为主的中文编码[输入]
              request.setCharacterEncoding("UTF-8");
    
              //收集客户端提交的数据
              String username = request.getParameter("username");
              
              //使用response对象输出到浏览器
              response.getWriter().write("用户名:" + username);
          %>
      </body>
    </html>


        2)response
        3)session
        访问jsp页面时,默认web服务器创建session
        访问servlet时,必须通过request.getSession()才能创建session
        在转发和重定向情况下,session域不会销毁

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page import="java.util.*" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        <%
            session.setAttribute("name","杰克");
            //转发到result.jsp页面
            //request
            //    .getRequestDispatcher("/result.jsp")
            //    .forward(request,response);
            //重定向到result.jsp页面
            response.sendRedirect("/day09/result.jsp");    
        %>          
      </body>
    </html>
    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page import="java.util.*" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        <%!
               //比较后并返回结果
            public String guess(int numClient,int numServer){
                if(numClient < numServer){
                    return "猜小了";
                }else if(numClient > numServer){
                    return "猜大了";
                }else{
                    return "中了";
                }
            }
        %>
          <%
              String name = (String)session.getAttribute("name");
              response.getWriter().write("用户名:" + name);
          
          
          
              //取得客户端猜的数字
              //int numClient = Integer.parseInt(request.getParameter("numClient"));
              //随机产生1-10整数,作为服务器猜的
               //Random r = new Random();
               //int numServer = r.nextInt(10)+1;
               //比较
              //String msg = guess(numClient,numServer);
              //response.getWriter().write("客户数字是:" + numClient + "<br/>");
              //response.getWriter().write("系统数字是:" + numServer + "<br/>");
              //response.getWriter().write("<font color='red'>"+msg+"</font>");
          %>
      </body>
    </html>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        欢迎<%=session.getAttribute("username")%>光临<br/>
        <a href="/day09/ExitServlet">安全退出</a> 
      </body>
    </html>
    package cn.itcast.web.servlet;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet extends HttpServlet {
        public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            String username = request.getParameter("username");
            if(username!=null && username.trim().length()>0){
                //取得ServletContext对象
                ServletContext application = this.getServletContext();
                //检证ServletContext对象中的用户名列表
                List<String> usernameList = (List<String>) application.getAttribute("usernameList");
                //用户名列表空
                if(usernameList==null){
                    //创建用户名列表集合
                    usernameList = new ArrayList<String>();
                    //将用户加入列表信合
                    usernameList.add(username);
                    //绑定到ServletContext域对象
                    application.setAttribute("usernameList",usernameList);
                    //绑定到sesison域对象中
                    request.getSession().setAttribute("username",username);
                    //转发
                    request.getRequestDispatcher("/WEB-INF/welcome.jsp").forward(request,response);
                //用户名列表非空
                }else{
                    //循环迭代
                    for(String un : usernameList){
                        //如果用户名存在于列表名
                        if(un.equals(username)){
                            request.getRequestDispatcher("/WEB-INF/message.jsp").forward(request,response);
                            return;
                        }
                    }
                    //必定该用户名未在用户名列表中
                    //绑定到sesison域对象中
                    request.getSession().setAttribute("username",username);
                    //转发
                    request.getRequestDispatcher("/WEB-INF/welcome.jsp").forward(request,response);
                }
            }
        }
    }
    package cn.itcast.web.servlet;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class ExitServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            HttpSession session = request.getSession();
            ServletContext application = this.getServletContext();
            List<String> usernameList = (List<String>) application.getAttribute("usernameList");
            boolean flag = usernameList.remove(session.getAttribute("username"));
            session.invalidate();
            response.sendRedirect("/day09/login.jsp");
        }
    }

         4)application=ServletContext对象

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page import="java.util.*" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        <%
            application.setAttribute("name","jack");
            application.removeAttribute("name");
            String name = (String)application.getAttribute("name");
            if(name!=null){
                response.getWriter().write("用户名:"+name);
            }else{
                response.getWriter().write("用户名:"+name);
            }
        %>
      </body>
    </html>

        5)config:取得jsp在web.xml文件中的映射信息
        6)exception:该对象只能在<%@isErroPage="true"%>的情况下,容器才会创建,否则容器不予创建
        7)out:out的类型是JspWriter,它是具体缓存功能的PrintWriter对象

            •out隐式对象用于向客户端发送文本数据。

            •out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。

            •JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。

            •只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

                设置page指令的buffer属性关闭了out对象的缓存功能

                out对象的缓冲区已满

                整个JSP页面结束

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              //out内置对象的类型是JspWriter,它是一个带有缓冲的PrintWriter对象
              out.write("");
            //response内置对象输出          
              response.getWriter().write("");
          %>
      </body>
    </html>

    image

        8)pageContext: 表示Jsp行运过程中的环境对象。pageContext对象是JSP技术中最重要的一个对象,它代表当前JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如包含和跳转其它资源、检索其它域对象中的属性等。
          a)能够取得其它8个内置对象
          b)具有转发和包含的功能
          c)域对象

          d)通过pageContext获得其他对象

            •getException方法返回exception隐式对象

            •getPage方法返回page隐式对象

            •getRequest方法返回request隐式对象

            •getResponse方法返回response隐式对象

            •getServletConfig方法返回config隐式对象

            •getServletContext方法返回application隐式对象

            •getSession方法返回session隐式对象

            •getOut方法返回out隐式对象

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              //HttpServletRequest requestCopy = (HttpServletRequest)pageContext.getRequest();
            //JspWriter outCopy = pageContext.getOut();
            
            //String ip = requestCopy.getRemoteAddr();
            //outCopy.write("你是IP是:" + ip);
            
            pageContext.forward("/guess.jsp");
          %>
      </body>
    </html>

    a)PageContext域对象仅限于当前jsp页面中,出了该jsp页面,原PageContext域对象销毁,如果取不到值,返回null

    b)PageContext域对象可以将对应的值保存在指定的四个域对象之一
        pageContext.setAttribute("name","丝丝",PageContext.REQUEST_SCOPE);    
    c)PageContext域对象可以将对应的值从指定的四个域对象之一取出
        <%=pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE) %>
    d)PageContext.findAttribute("name")
        它会以name为key,依次去四个域对象中查询对应的值,找到即止,如果找不到,返回null

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              //pageContext.setAttribute("name","丝丝2",PageContext.REQUEST_SCOPE);
              //pageContext.setAttribute("name","丝丝3",PageContext.SESSION_SCOPE);
              //pageContext.setAttribute("name","丝丝1",PageContext.PAGE_SCOPE);
              //pageContext.setAttribute("name","丝丝4",PageContext.APPLICATION_SCOPE);
          %>
          
          用户名:<%=pageContext.findAttribute("name")%>
      </body>
    </html>
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
          <%
              pageContext.removeAttribute("name",PageContext.SESSION_SCOPE);
          %>
          用户名:<%=pageContext.getAttribute("name",PageContext.SESSION_SCOPE) %>
      </body>
    </html>


        [pageContext/request/session/application]
        9)page

  • 相关阅读:
    20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践
    20165205 2017-2018-2 《Java程序设计》第八周学习总结
    20165205 2017-2018-2《Java程序设计》结对编程一 第二周总结
    20165104 第一周学习心得
    Linux安装及命令入门
    做中学learning by doing个人感想
    我所期望的师生关系
    2018-2019 20165235《信息安全系统设计基础》第三周学习总结
    20165235 缓冲区溢出漏洞实验
    2018-2019-20165235 《信息安全系统设计基础》第二周学习总结
  • 原文地址:https://www.cnblogs.com/sunhan/p/3542142.html
Copyright © 2011-2022 走看看