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 | 设置服务器将来使用io把jsp页面内容一行一行的输出给浏览器的时候,使用什么编码向浏览输出. 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属性使用