jsp

1.jsp三大元素

  简介:

    JSP有三大类型的元素:指令元素(directive elements)、动作元素(action element)、和脚本元素(script element)。

        jsp是动态页面:在jsp中永远都是先执行Java代码再执行html代码

jsp就是一个servlet
jsp不能被浏览器直接解析,需要借助具有jsp解析引擎的服务器转换为静态资源 才能被浏览器直接解析
怎么转换:
  tomcat服务器会将jsp页面转换为一个Java类
  org,apache.jsp.jsp名字 jsp.java
  该类继承了HttpJspBase  HttpJspBase继承了HttpServlet 所以说jsp对应着一个servlet
  tomcat会调用
  HttpServlet extends .GenericServlet     .GenericServlet 实现了Servlet接口
   service(ServletRequest request ,ServletResponse response)HttpServlet重写的service方法
   |
   |
   HttpServletRequest req =(HttpServletRequest)request
   HttpServletResponse res =(HttpServletResponse)response
   service(HttpServletRequest,HttpServletResponse)
   
   HttpJspBase extends HttpServlet
   service(HttpServletRequest,HttpServletResponse)HttpJSpBase重写的service方法,
          方法中调用了jspService()方法(抽象)
   |
   |
   _jspService()(抽象方法)
   Hello.jsp extends HttpJspBase
   _jspService()  重写的jspService方法
    
   
   
   

       浏览器访问动态资源,服务器将动态资源解析为静态资源html,返回给浏览器。

       客户端运行jsp 第一次运行比较慢 因为要翻译和编译 从第二次开始则不需要这些操作 直接到执行阶段。

命周期

生命周期:
   编译阶段
      当第一次访问jsp,jsp就会被翻译成Java文件,然后会编译成class文件
  初始化阶段
    创建该servlet对象 调用构造方法 和init方法 只创建一次和层层调用一次jsp_init方法
 执行阶段
   在初始化阶段的基础上,层层调用_jspServlet方法
 销毁阶段
   tomcat正常关闭时销毁,层层调用_jspDestroy方法
   

  1.1脚本元素

    简介:脚本元素用于JSP页面中添加一些脚本代码,脚本代码必须用page指令所定义的脚本语言编写,通常是Java代码。

    表达式(expression)

      语法:<%= %>

<!-- 
   <%= "hello" %>这个里面的代码会被翻译到out.print()方法的括号里面,不要加; ,;代表语句结束

 -->
   <h1><%= "hello" %></h1>
   <h1><%=1+1 %></h1>
   <h1><%=Math.random() %></h1>
  
   <% 
    System.out.println("sasasasa");
    System.out.println(UUID.randomUUID());
    ArrayList<String> list =new ArrayList<>();
    list.add("lisi");
    list.add("wangwu");
   for(String s : list){
       System.out.println(s);
   }

   %>
   <%--这是jsp的注释 不会被翻译 编译的Java代码中也不能看见 --%>

    解释:

      上述代码将来翻译到Java文件中的位置:

        _jspServlet方法中的out.print()里面的参数。

                      例如上面的几个例子会翻译成:

out.print("hello");
out.print(1+1);
out.print(Math.random());

       注意:不要在<%= %>里面加分号

    脚本(script)

      语法:<% %>

      例子:

<% 
    System.out.println("sasasasa");
    System.out.println(UUID.randomUUID());
    ArrayList<String> list =new ArrayList<>();
    list.add("lisi");
    list.add("wangwu");
   for(String s : list){
       System.out.println(s);
   }

   %>

    解释:

      将来翻译到Java文件中的位置:

          脚本中的代码将来会被直接翻译到_jspServlet()方法中,在一个普通的方法中我们可以写什么,那么在脚本中我们就可以写什么样的代码。

      注意:在这个语法的脚本中写的代码要加分号,因为我们在一个方法里面所写的每一句代码后面都是要加分号的。

       在脚本中声明的变量,我们是可以在表达式里直接使用的,但是要注意先声明再使用,只要查看脚本和表达式分别编译到Java文件的位置,我们就可以很清楚的认识到这一点。

             小案例:快速生成一个10*10的表格:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
    <table border="1"> 

        <%
            for (int i = 0; i < 10; i++) {
        %>
        <tr>
            <%
                for (int j = 0; j < 10; j++) {
            %>
            <td>lisi<%=j%></td>
            <%
                }
                }
            %>  
        <%!
        
            public void go(){
            System.out.println("lkl");}
            public static final String DESC = "你好";
        
        %>
    </table>
</body>
</html>

    声明(declaration)

      语法:<%! %>

    

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
     <%!
       public void go(){
        System.out.println("ssssnnn");
     } 
     public static final String DESC ="好看";
     
     %>
     <%
       go();
     System.out.println(DESC);
     %>
</body>
</html>

      解释:

       将来翻译到Java文件中的位置:

        直接将声明中的代码翻译到Java文件里面所定义的类中。 

  1.2指令元素

    简介:

jsp的指令是给jsp引擎看的,让jsp引擎在翻译jsp页面成java文件的时候,知道需要注意哪些地方的设置.比如页面中的编码、页面中脚本里面所用的编程语言、翻译的java文件中需要引入哪些其他包下的java类等等.
简单来说就是:指定整个JSP页面的相关信息,并设置JSP页面的相关属性,如网页的编码方式等.

    语法:

      <%@指令名字属性="" .. %>

      指令名字主要有:pageincludetaglib三种

    page指令:

      

属性名字 解释
language="java" 表示当前页面中的编程语言是java,目前这个属性值只能写java
import 在当前页面中要引入哪些包下的类。import="java.util.HashMap" import="java.util.HashMap,java.sql.Connectio
pageEncoding 设置jsp页面文件保存时候所用的编码pageEncoding="UTF-8"
contentType 设置服务器将来使用iojsp页面内容一行一行的输出给浏览器的时候,使用什么编码向浏览输出. contentType="text/html; charset=UTF-8
extends 设置jsp页面被翻译成java文件的时候,java文件中的类要继承那个父类.这个属性不用设置,js引擎会给它一个默认的父类(HttpJspBase)去继承的
session 设置当前这个jsp页面是否支持session对象的使用.默认是支持的 session="true" 默认值为true
isThreadSafe 设置jsp页面是否是线程安全的isThreadSafe="true" 默认值为true
errorPage 如果a.jsp页面中设置了errorPage="b.jsp",那么a.jsp页面在运行的时候一旦出错,就会自动跳b.jsp里面
isErrorPage 如果一个页面中设置了isErrorPage="true",那么就表示这个页面是用来专门显示错误信息的页.然后在这个页面中就能够使用到隐藏对象exception来显示出错误的信息.(需要使用js的内置对象)

    include指令

      简介:

      在当前页面中使用include指令可以把另外一个页面的内容引入到当前页        面。一个页面包含/引入另外一个页面有俩种方式:静态包含和动态包含。通过这个include指令导入页面就属于静态包含。

      特点:

        a.jsp页面中静态包含了b.jsp页面,那么在翻译期间,jsp引擎在翻译a.jsp成为一个a_jsp.java文件的时候,发现jsp页面中有include指令,这时候jsp引擎就会把被包含的页面b.jsp中内容原封不动的拿到a_jsp.java中,然后用io输出出去.

    taglib指令

      简介:

        在当前jsp页面中引入一些特殊的标签库.比如jstl标签库、struts2标签库等等.

  1.3动作元素

    简介:表示客户端请求JSP页面时被调用的组件。

     <jsp:useBean> <jsp:setProperty><jsp:getProperty><jsp:forword>

<jsp:include>

2.jsp中的注释:<%-- --%>

3.九大内置对象

类型 名字
pageContext pageContext
HttpServletRequest request
HttpSession session
ServletContext application
Object page
HttpServletResponse response
JspWriter out
ServletConfig config
Throwable exception

  内置对象的解释:

    存取数据:

对象名字 作用范围
PageContext 页面范围(只能在同一个页面中起作用)
request 一次请求
session 一次会话
application 整个项目期间

   对象解析

page对象
虽然名字叫page,但是这个并不是页面范围对象,它是Object类型的对象,表示当前这个页面本身。
其实page指的是jsp页面翻译成的java类,服务器使用这个java类所创建的对象
把page对象输出即可看到,所以说page对象代表jsp页面本身
response对象
详细请参照前面servlet中response对象介绍
out 对象
用于向浏览器输出内容的输出流
config对象
详细请参照前面servlet对象中servletconfig对象介绍
exception
这个对象其实我们并不能直接使用,需要相关设置后才能使用,这个可以算是一个隐藏对象.这个对象表示将来这个jsp页面运行出错的时候所抛出的异常对象需要结合 page指令的isErrorPage属性使用
原文地址:https://www.cnblogs.com/jamers-rz/p/13823741.html