Jsp的概念和运行原理
- 问题:
在学习了servlet之后,使用servlet进行页面的展现,代码书写过于麻烦。极大地影响了开发的效率,那么有没有一种方式可以让我们像以前写网页一样来进行网页的编程工作呢? - 解决:
使用JSP技术
Servlet更适合做业务和逻辑处理,jsp适合页面响应 - 概念:
JSP全名为Java Server Page,中文名叫java服务器页面,其根本是一个简化的servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准(动态网页技术:数据能够动态改变,且能做逻辑判断;
Js或jquery实现的改变是网页元素的改变,不是数据的改变,仅实现了和用户的页面显示的简单交互)。 - 特点:
本质上还是servlet;
跨平台,一次编写处处运行;
组件跨平台;
健壮性(对于特别复杂的业务逻辑也可以处理,处理的问题比较多)和安全性(对数据的保护好); - Jsp的访问原理:(tomcat只认识servlet)
浏览器发起请求,请求JSP,请求被Tomcat服务器接收,执行JSPServlet(在web.xml中可以找到这个类的配置)将请求的JSP文件转义成对应的java文件(也是servlet),然后执行转义好的java文件;
通俗说就是讲 *.jsp 当做一个servlet请求来处理(将*.jsp当做一个servlet的别名来执行servlet,这个配置在tomcat的web.xml文件中),通过io流包装的工具类JSPServlet(在web.xml中可以找到这个类的配置,这个类的jar包在tomcat的lib包下Jasper.jar,用反编译软件可以查看源码),按行读出该jsp文件的内容,再在每一行前面加上resp.getWriter().write(),转义成servlet文件,再执行; - Jsp的语法和指令:
JSP的page指令(page、taglib、include,jsp三大指令)
JSP的taglib指令
JSP的局部代码块
JSP的全局代码块
JSP的注释
JSP的静态引入(JSP的include指令)
JSP的动态引入
页面转发(forward标签) - Jsp的内置对象:
PageContext对象
Request对象
Response对象
Session对象
Application对象
Config对象
Out对象
Page对象
Exception对象 - JSP转译规则
Java是原样转译,HTML等语言是转译成resp.getWriter().write(。。。);
Jsp的page指令
- 格式
<%@page 属性名=“属性值” 属性名=“属性值”...%>
- 属性解释
page标签常用属性解释:
1、language:声明jsp要被转译的语言
2、import:声明转译的java文件要导入的包,不同的包用逗号隔开
3、pageEncoding:设置jsp文件的保存数据的编码格式(jsp底层使用的编码格式是utf-8),
解决乱码用utf-8;同时还设置了响应编码格式
4、contentType="text/html; charset=UTF-8":设置jsp数据响应给浏览器时,浏览器
的响应编码格式。低版本的jsp写pageEncoding、contentType;
高版本写pageEncoding就可以;
5、session:设置转译的servlet中是否开启session支持,
默认是开启;true开启,false关闭;
6、errorPage:设置jsp运行错误跳转的页面
7、extends:设置jsp转译的java文件要继承的父类(包名+类名)
- 作用:
配置jsp文件的转译相关的参数。 - 例子
<%@ page language="java" import="java.util.*" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="true" %>
<%@ page errorPage="error.jsp" %>
- JSP的三种注释
1、前端语言注释:<!-- --!>
会被转译,也会被发送,但是不会被浏览器执行
2、java语言注释:
会被转译,但是不会被servlet执行
3、jsp注释:<%-- --%>
不会被转译
Jsp的局部代码块、全局代码块、脚本段语句
一、局部代码块
-
特点:
1、 局部代码块中声明的java代码会被原样转译到jsp对应的servlet文件的 _JspService方法中;
2、代码块中声明的变量都是局部变量; -
使用:<%
java代码%> -
缺点:使用局部代码块在jsp中进行逻辑判断,书写麻烦,阅读困难
-
开发:servlet进行请求逻辑处理,使用jsp进行页面展现。
-
例子
<%
//声明java代码域,局部
int a=4;
if(a>3){ %>
<b>jsp学习很简单</b>
<%} else{%>
<i>jsp中使用逻辑校验很难受</i>
<%} %>
二、全局代码块:
- 特点:声明的java代码作为全局代码转移到对应的servlet的类中。
- 使用**:<%!**
全局代码%> - 注意:全局代码块声明的代码,需要使用局部代码块调用,但不要写错地方了,如果写到HTML代码中,不报错;
- 例子
//局部代码块
<%
//调用全局代码块的方法
test();//转译到service方法中
%>
//全局代码块
<%!
//声明java代码域,全局
public void test(){
//转译到类下
System.out.println("我是全局代码块声明");
}
%>
三、脚本段语句:
- 特点:帮助我们快速的获取变量或者方法的返回值,作为数据响应给浏览器
- 使用:<%=
变量名或者方法%> - 注意:不要在变量名或方法名之后使用分号;
转译过去是:out.print(变量); - 位置:除jsp语法要求以外的任意位置。
- 例子
<%String str = "hahaha";%>
<i>jsp的脚本段1:<%=str %></i>
<i>jsp的脚本段1:<%=test() %></i>
<i>jsp的脚本段2:<%out.write(str); %></i>
JSP的静态引入和动态引入
一、静态引入
- 使用:
<!-- jsp的静态引入 -->
<%@ include file="includeStatic.jsp" %>
- 特点:
会将引入的jsp文件和当前jsp文件转译成一个java(servlet)文件使用。
在网页中也就显示了合并后的显示效果。 - 注意:
1、静态引入的jsp文件不会单独转译成java(servlet)文件。
2、当前文件和静态引入的jsp文件中不能够使用java代码块声明同名变量。如下:
当前jsp | 要被静态引入的jsp |
---|---|
<%int a = 5;%> | <%int a = 5;%> |
像上面这样静态引入时会报同名错误,因为转译后为同一个java文件。
同名错误只考虑名字,不考虑类型。
二、动态引入
- 使用:
<!-- jsp的动态引入 -->
<jsp:include page="includeActive.jsp"></jsp:include>
Page是要引入的jsp文件的相对路径
-
特点:
会将引入的jsp文件单独转译,在当前文件转译好的java文件中调用引入的jsp文件的转译文件。
在网页中显示合并后的显示效果。 -
注意:
动态引入允许文件中声明同名变量。 -
动态引入和静态引入优点:
降低jsp代码的冗余,便于维护升级。
Jsp的forward转发标签
- 使用:
<!-- jsp的转发 -->
<jsp:forward page="forward.jsp">
<jsp:param value="aaa" name="str"/>
</jsp:forward>
- 特点:
一次请求
地址栏信息不改变 - 注意:
<jsp:forward page="">这里不能有空格,只能是键值对</jsp:forward>
除了<jsp:param value="" name=""/>之外的字符串都会报错
应为:
<jsp:forward page="">
<jsp:param value="" name=""/>
</jsp:forward>
解释:
Name属性为附带的数据的键名
Value为附带的数据内容
注意:会将数据以?的形式拼接在转发路径后面
相当于:forward.jsp?str=aaa
- 取出参数:
在forward.jsp中取出传过来的值:
<%=request.getParameter("str") %>
Jsp的九大内置对象
-
内置对象:
根据jsp的访问原理,真正执行的是转译好的servlet文件。Jsp文件在转译成其对应的servlet文件的时候自动生成的并声明的对象。我们再jsp页面中直接使用即可。 -
注意:
内置对象在jsp页面中使用,使用局部代码块或者脚本段语句来进行使用,不能够在全局代码块中使用。因为除去全局代码块外,其余的大部分是servlet的service方法体,刚好在九大内置对象声明的下面。而且九大内置对象只声明在service方法中。如下图:
注意:page=this的,this是当前servlet对象。 -
内容:九个
1、pageContext:页面上下文对象,封存了其他的内置对象。也就是封存了当前jsp的运行信息。注意:每个jsp文件单独拥有一个pageContext对象。作用域:当前页面
2、request:封存当前请求数据的对象。由tomcat服务器创建。作用域:不进行转发,service方法执行完销毁。一次请求
3、Session:此对象用来存储用户的不同请求的共享数据。一次会话
4、Application:也就是ServletContext对象,一个项目只有一个。存储用户共享数据的对象,以及完成其他操作。项目内。
5、Response:响应对象。用来响应请求处理结果给浏览器对象。设置响应头,重定向。
以上常用
6、Out:响应对象,jsp内部使用。带有缓冲区的相应对象,效率高于response对象。不能设置响应头,重定向。
7、Page:代表当前jsp的对象。相当于java中的this。
8、Exception:异常对象。存储了当前运行的异常信息。注意:使用此对象需要在page指令中使用属性isErrorPage=”true”开启。
9、Config:也就是servletConfig,主要是用来获取web.xml中的配置数据,完成一些初始化数据的读取。
- 四个作用域对象:
1、pageContext:当前页面,解决了在当前页面内的数据共享问题。主要作用:获取其他内置对象。
2、request:一次请求,一次请求的servlet的数据共享。通过请求转发将数据流转给下一个servlet。
3、session:一次会话,一个用户的不同请求的数据共享问题。将数据从一次请求流转给其他请求。
4、application:项目内,不同用户的数据共享问题。将数据从一个用户流转给其他用户。
四个作用域对象的作用:数据流转
Jsp中的资源路径使用
- 在jsp中资源路径可以使用相对路径完成跳转。但是:
问题一:资源的位置不可以随意更改
问题二:需要使用…/进行文件夹的跳出,使用比较麻烦。 - 在jsp中使用绝对路径:
/虚拟项目名/项目资源路径:/jsp/a/a.jsp
注意:绝对路径如下
“/jsp/jspPro.jsp”: 第一个“/”表示服务器根目录
相当于“localhost:8080” - 使用jsp中自带的全局路径声明:(MyEcplise自带,Eclipse不自带,但可以添加)
(一)使用:相当于绝对路径
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath %>">
<a href="jspPro.jsp">jspPro.jsp</a>
解释:
basePath =http://127.0.0.1:8080/虚拟项目名/
(二)作用:
给资源前面添加项目路径