JSP介绍
- JSP全称是Java Server Pages,它和Servlet都是Sun公司定义的用于开发动态Web资源的技术,它解决了Servlet输出流排版复杂和难以维护的问题。JSP完美融合了HTML模版元素和Java代码,通过JSP写服务端输出变得和写HTML网页一样容易。
- JSP通过涵盖HTML模版元素来简化输出排版,还提供不同的JSP标签管理不同类型的Java代码,除此之外,它还默认封装了9大隐式对象,帮助提高开发的效率。
- JSP本质上是Servlet,当用户请求JSP时,JSP引擎(Tomcat内嵌)会自动把JSP代码转化为Servlet,并把HTML模版元素和JSP标签内容填充到Servlet中的Service方法,通过Service方法输出响应流给客户。在进行转换时,Servlet引擎也会默认的将JSP的9大隐式对象封装到service方法当中。
- 由于JSP良好的布局性,实际开发Web应用通常采用JSP+Servlet的形式,JSP主要负责数据的展示,Servlet负责业务逻辑和数据计算。此种方式可以实现良好的代码解耦合和分层管理,也利于UI人员和后端人员并行开发。
JSP工作原理
JSP的本质是Java Servlet,它通过Tomcat JSP引擎将 JSP 翻译为相应的Servlet,并通过service方法来接受和响应客户请求。
示例:tomcat容器自带的index.jsp 对应的servlet
- 默认生成Servlet,并将JSP的内容自动填充到_jspService方法中
- Java代码直接填充到方法中
- HTML模版通过out.write("HTML 模版 /n") 填充到方法中,形成输出流
- _jspService方法带有request & response参数,能自动接收Tomcat传送的request和response对象
- HttpSession session
- ServletContxt application
- ServletConfig config
- PageContext pageContext 当前页面上下文,用于JSP标签传递参数
- Object page 代表当前页面
- JSPWriter 相当于PrintWrite,可以直接往浏览器输出文本
- Exception
除了request,response做为输入参数,JSP引擎还自动的在_jspService方法里面生成其他对象的引用并对他们初始化,这些对象结合起来称为JSP的默认9大隐式对象,在JSP页面可以直接通过对象名进行引用:
JSP页面组成
- 所有满足HTML规范的元素-JSP模版元素(直接翻译成out.write的内容)
- <% %> JSP脚本片段,即Java代码块( Java代码直译)
- <%= %> JSP表达式(直接翻译成out.print)
- <%-- --%> JSP 注释,此注释不在浏览器展示
- <%@ % > JSP指令,包括page/include/taglib
- JSP标签
- JSP九大内置对象:request/response/session/application/config/page/out/pageContext/Exception
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <!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>第一个JSP</title> </head> <body> <%!//定义一个类方法,只能通过JSP申明定义方法,全局变量和静态代码块 public void testJSPDeclarition() { System.out.println("这是一个JSP申明"); }%> <%--JSP注释,该注释并不会做为输出输出给浏览器,在JSP中应当用此注释替代Html注释<!--XXX-->,避免输出垃圾数据给客户端造成流量浪费 --%> 当前系统时间是: <%--脚本表达式,可以书写遵循java规范的代码,可以在JSP中多次出现,并且会被翻译为相应Servlet中的Service方法的代码片段 --%> <% testJSPDeclarition(); Date d = new Date(); out.write(d.toLocaleString()); String jspDefindedVar = "hello,i am a var generated by JSP"; for (int i = 0; i < 2; i++) { %> <br>测试脚本片段语法和多个脚本片段组合作用 <% } %> <br> <br> 查看前面JSP脚本片段定义的变量值: <%-- 脚本表达式,用于向浏览器输出数据,不以;结尾,仅用做数据输出 --%> <%=jspDefindedVar%> <br> <br> 查看Servlet传递过来的参数变量: <%=request.getAttribute("servletTransferVar")%> </body> </html>
JSP脚本片段
用于在JSP中编写和运行多行代码, 这些代码被“翻译到” service方法中,因此不能嵌套方法
- <% %> 只能出现严格遵循Java语法的代码,每行必须以;结束。
- 在一个JSP页面中可以有多个脚本片段,不同的脚本片段之间可以嵌入文本,HTML标记或者其他JSP元素, 并且同一个页面之间的脚本片段可以相互访问。本质上这些脚本片段都被翻译为同一个jspService方法里的代码,方法里的变量是可以相互访问的, 但一样要遵循先定义后访问的原则。
- 单个脚本片段在JSP中可以是不完整的,但是多个顺序结合的脚本片段必须是完整的Java代码。
JSP申明
- <%! %> JSP页面中编写的所有代码,默认都会翻译到servlet的Service方法当中,除了JSP申明。
- JSP申明中的Java代码会被翻译到Servlet的service方法外,常常用来定义JSP转化为Servlet程序的静态代码块,成员变量或者是方法。JSP脚本片段不能用来定义方法,只有JSP申明能够用来定义方法。
- JSP 申明必须满足Java代码规范
- JSP默认的九大隐式对象都是Servlet Service方法里申明的方法变量,在JSP申明中不能使用这些隐式对象。
JSP脚本表达式
用于将程序数据输出到客户端
<%= 变量或表达式 %>, 表达式后面不能有;。
JSP 注释
- <%— —%>, 需要和HTML注释区别开,实践中应该多用JSP注释少用html注释。
- <!— —>, HTML 注释会被解析到浏览器当中,造成不必要的垃圾数据输出。
JSP 指令
JSP指令是为JSP引擎设计的,它不直接产生可见输出,只是用于告诉JSP引擎如何处理JSP,JSP指令基本语法:<%@ 指令 属性名=“值” %> 。
常用的JSP指令包括:Page指令/
JSP Page指令,通常用于编码和包管理,无论出现在页面什么地方,它的作用域都是整个页面,实践中常常放在JSP页面顶部,重点包括以下几项:
- language=“java”, 编程语言是java
- contentType="text/html; charset=UTF-8”, 输出给浏览器的字符编码
- pageEnconding=“UTF-8”, JSP 页面的编码
- import=“”,引入的Java包,JSP默认引入的Java包只有java.lang和javax.servlet.*,其余的包需要在JSP页面中用到,则需要在page指令中导入, 否则都编译不过。
- session="true/false", 是否自动获取session。即使这里设置为false,仍然可以通过request.getSession()获取session对象
- buffer=“none/kbSize”,
- isThreadSafe="true/false"
- autoFlush="true/false"
- errorPage="relative_url", 定位页面失败后的自动跳转页面,避免抛500带来的差用户体验。
JSP Include指令,用来组合多个JSP,特别适用于页眉页脚等场合。
时间: 2024-10-20 01:17:24