问题
在学习了Servlet之后,使用Servlet进行页面的展现,代码书写过于麻烦。
极大的影响了开发的效率,那么有没有一种方式可以让我们像以前写网页一样来进行
网页的编程工作呢?
Jsp
虽然jsp这项技术随着时代的发展,前后端分离的浪潮以及各种框架的涌现,已经慢慢被淘汰,可能只有一些老项目还在使用,一些模板引擎能够更好的适应时代,虽然jsp也是一种模板引擎,但是里面可以嵌套Java代码,这就大大提高了程序的不安全性,因为前端程序员如果不是在很熟悉Java的情况下不小心改动了代码,那就可能会出现一些不可预料的错误,所以这项技术的淘汰是必然的。
FreeMarker、Thymeleaf等模板引擎兴起,能够更好的适应时代的要求。
但是学习Jsp我认为还是有点必要的。
- 第一,大部分学校的书上还是会有这项技术的教学,所以为了考试,即使不深入了解,但是一些基础知识也是很有必要的。
- 第二,模板引擎虽然各不相同,优点也不尽然,但是他们的设计理念都是相通的,所以学习了Jsp后,对于其他模板引擎的学习会有很大帮助,会很容易接受。
Jsp是什么
JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求
Jsp能干什么
-
JSP是一种Java servlet,主要用于实现Java
web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。 -
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
-
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
特点
- 本质上还是Servlet
- 跨平台,一次编写处处运行
- 组件跨平台
- 健壮性和安全性
访问原理
浏览器发起请求,请求JSP,请求被Tomcat服务器接受,执行JspServelt将请求的JSP文件转义成为对应的java文件(也是Servlet),然后执行转义好的Java文件。
语法和指令
内置对象
- PageContext对象
- Request对象
- Session对象
- Application对象
- Response对象
- 对象
- Page对象
- Exception对象
注释
- 前端语言注释
<!-- 这是标准的html注释 -->
会被转译,也会被发送,但是不会被浏览器执行
- Java语言注释 会被转译,但是不会被servlet执行
单行注释// 多行注释 /* */
- Jsp注释 不会被转译
<%-- --%> 这是Jsp注释
page指令
<%@page 属性名=“属性值” 属性名=“属性值”…%>
- language:声明Jsp要被转译的语言。
- import:声明转译的java文件要导入的包。不同的包使用逗号隔开。
- pageEncoding:设置Jsp文件的数据编码格式。
- contentType=“text/html; charset=utf-8” 设置Jsp数据响应给浏览器时,浏览器的解析和编码格式。
- session:设置转译的servlet中是否开启session支持,默认开启,true表示开启,false表示关闭
- errorPage:设置Jsp运行错误跳转的页面。
- extends:设置Jsp转译的Java文件要继承的父类(包名+类名)。
作用:
配置Jsp文件的转译相关的参数。
taglib指令
引用jsp的标签库,下篇介绍EL表达式和JSTL的时候再详细介绍语法。
局部代码块
- 特点:
局部代码块中声明的Java代码会被原样转译到Jsp文件对应的servlet文件的 _JspService方法中
代码块中声明的变量都是局部变量 - 使用:
<% Java代码 %>
- 缺点:
使用局部代码块在Jsp中进行逻辑判断,书写麻烦,阅读困难。 - 开发:
使用Jsp进行逻辑处理,使用Jsp进行页面展现。
全局代码块
- 特点:
声明的Java代码作为全局代码转译到对应的servlet类中。 - 加粗样式使用:
<%! 全局代码块 %>
- 注意:
全局代码块声明的代码,需要使用局部代码块调用。
脚本段语句
- 特点:
帮助我们快速获取变量或者方法的返回值作为数据响应给浏览器。 - 使用:
<%=变量名或方法%>
- 注意:
不要在变量名或者方法名后面使用分号。 - 位置:
除Jsp要求语法之外的任意位置
静态引入
<%@include file="要引入的Jsp文件的相对路径" %>
- 特点:
会将引入的Jsp文件和当前Jsp文件转译成一个Java(servelt)文件使用
在页面中也就显示了合并后的显示效果。 - 注意:
静态引入的Jsp文件不会单独转译成Java(servlet)文件。
当前文件和静态引入的Jsp文件中不能够使用Java代码块声明同名变量。
动态引入
<jsp:include page="要引入的Jsp文件的相对路径"></jsp:include>
- 特点:
会将引入的Jsp文件单独转译,在当前文件转译好的Java文件中调用引入的Jsp文件的转译文件。
在网页显示合并后的显示效果。 - 注意:
动态引入中允许文件中声明同名变量。
转发标签
优点:
降低Jsp代码的冗余,便于维护升级。
使用:
<jsp:forward page="要转发的jsp文件的相对路径"></jsp:forward>
- 特点:
一次请求
地址栏信息不改变 - 注意:
在转发标签的两个标签中间除了写<jsp:param name="str" value="aaa" />
子标签不会报错,其他任意字符都会报错 - name属性为附带的数据的键名
- value为附带的数据内容
**注意:**会将数据以?的形式拼接在转发路径的后面。
Jsp的九大内置对象
内置对象:
Jsp文件在转译成其对应的Servlet文件的时候自动生成的并声明的对象。我们在Jsp页面中直接使用即可。
注意:
内置对象在Jsp页面中使用,使用局部代码块或者脚本语句段语句来使用,不能够在全局代码块中使用。
内容:
九个对象
- pageContext:页面上下文对象,封存了其他内置对象。封存了当前Jsp的运行信息。
注意:
每个Jsp文件单独有一个pageContext对象。 作用域:当前页面。 - request:封存当前请求数据的对象。由Tomcat服务器创建。一次请求
- session:此对象用来存储用户的不同请求的共享数据的。一次会话
- application:也就是ServletContext对象,一个项目只有一个。存储用户共享数据的对象,以及完成其他操作。项目内
- response:响应对象,用来响应请求处理结果给浏览器对象。设置响应头,重定向。
- out:响应对象,Jsp内部使用。带有缓冲区的响应对象,效率高于response对象。(专门用来响应的,不能设置响应头,不能进行重定向)
- page:代表当前Jsp的对象。相当与Java中的this。
- exception:异常对象。存储了当前运行的异常信息。
**注意:**使用此对象需要在page指定中使用属性isErrorPage="true"开启。 - config:也就是ServletConfig,主要是用来获取web.xml中的配置数据,完成一些初始化数据的读取。
四个作用域对象
- pageContext:当前页面。解决了在当前页面内的数据共享问题。获取其他配置对象。
- request:一次请求。一次请求内的数据共享。通过请求转发将数据流转给下一Servlet。
- session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求。
- application:项目内。不同用户的数据共享。将数据从一个用户流转给其他用户。
作用:
数据流转
Jsp的路径:
在Jsp中资源路径可以使用相对路径完成跳转,但是:
问题一:资源的位置不可随意更改
问题二:需要使用…/进行文件夹的跳出。使用比较麻烦
使用绝对路径:(必须会)
/虚拟项目名/项目资源路径
例如:
<a href="/jsp/jspPro.jsp">jspPro.jsp</a>
注意:
在Jsp中资源的第一个/表示的服务器根目录,
相当与:localhost:8080
使用Jsp中自带的全局路径声明:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
作用:
给资源前面添加项目路径:http://localhost:8080/虚拟项目名/