在学习了servlet之后,使用servlet进行页面展现,代码的书写过于麻烦。极大的影响了开发的效率,那么怎么样可以像写网络编程那样简单方便的写出页面代码呢?
这个时候我们就可以使用jsp技术了,那jsp又是什么呢?
Jsp全名是java server page中文名叫做java服务器页面,其根本就是一个简化的servlet。
jsp的特点是:本质上还是servlet;跨平台,一次编译,各处使用;组件跨平台;健壮和安全性;健壮是代码健壮比较强,就是逻辑很强,可以处理多种情况的发生 ;
jsp是怎么运行达到我们要的效果:
服务器在接受到请求之后会去找响应的文件,在项目目录下找jsp,找不到去服务器目录下找jsp,找到后,会使用调用jspserlet(jsp引擎);它可以将jsp文件转译为可执行的java文件,其实就是一个servlet文件(它的父类有service方法)。然后服务器执行相应的servlet。
这里面呢主要是转译后的文件继承了HTTPJspBase,它又继承自HttpServlet,它里面有service方法,经由服务器调用可以生成request与response来解析处理这次请求。
jsp文件大致是这样的
他们的含义语法是这样的
- page的作用
- 设置jsp转译时侯的一些配置信息,当然下列写的可以写到一行里面
- <%@page language="java"%><%-- 声明转义得语言 --%>
- <%@page import="java.util.*"%><%-- 声明转译时导入得Java包 --%>
- <%@page pageEncoding="utf-8" %><%-- 两个作用,一个页面得编码,与jsp文件保存的的编码格式 --%>
- <%@page contentType="text/html; charset=utf-8" %><%-- 设置数据的响应处理格式 --%>
- <%@page session="true" %><%-- 设置session的状态,默认为true --%>
- <%@page isErrorPage="true" %> <%-- 默认为false,true表示开启异常对象exception的使用 --%>
- <%@page errorPage="error.jsp" %><%-- 指定当jsp运行出现异常错误时跳转指定的页面 --%>
2.局部代码块,全局代码
局部代码
- 声明方式:<%局部代码块%>
- 特点:
- 使用局部代码块声明的java代码会被原样转译到——jspservice方法中,也就是局部代码。
全局代码
- 声明方式:<!%局部代码块%>
- 特点:
- 全局代码块中声明的java代码,在被转译时,会被转移成jsp对应的java文件的全局代码
- 作用:
- 声明方法和全局变量
注意:
- 使用全局代码块声明方法,使用局部代码块调用方法。
- 注意:除了全局声明,其他的内容都是写在jspservice中
Java脚本段、表达式
- 声明方式<%=变量名或者方法名()%>
- 作用:将java代码的运算结果数据或者其他数据响应给浏览器
- 注意:
- 在表达式中不能以分号结尾
3.jsp的注释,jsp文件中可以写其他语言代码,那么他们的注释也可以写进去
- HTML注释:会被转译,也会被响应给浏览器;但是浏览器不会执行
- Css注释:会被转译,也会被响应给浏览器;但是浏览器不会执行
- Js注释:会被转译,也会被响应给浏览器;但是浏览器不会执行
- Java注释:会被转译,但不会执行
- Jsp注释:不会被转译,也不会被执行
4.动态导入与静态动态导入
- 问题:不同的jsp页面会使用相同的资源。如果将资源 在每个jsp野蛮都单独声明则会造成代码冗余量过高,不宜与代码的维护和升级。
- 解决:使用静态引入和动态引入的方式
- 使用:静态引入.
- <%@include file =“要引入的资源的相对路径”%>
- 特点:被引入的jsp与原来的jsp文件会合并为一个
- 注意,静态引入的相关jsp文件不能出现同一变量
动态引入
- <jsp:include page="引入资源的相对路径"></jsp:include>
- 特点:被引入的文件会被单独转译,原有jsp文件会调用被引入jsp文件。
- 注意:动态引入的相关jsp文件可以声明同名变量当引入jsp文件中不需要写入java代码可以使用静态引用,否则适合动态引入
作用:实现资源的共享
5.jsp的forward标签
- 问题:不同的jsp在处理请求的时,有可能会将当前的请求转发给另外的jsp进行处理
- 解决:使用forward调用其他jsp的指令
- 声明方式:<jsp:forward page="转入资源的相对路径" ></jsp:forward>
- 特点: 从当前 jsp跳转到另一个jsp页面。
- 注意:forward标签中除了<jsp:param value="" name=""/>(声明转发的附带数据)外,不能有其他任何的内容,否则将会报错
6.Jsp内置对象的学习
- 内置对象:jsp在转译成其对应的java文件(也就是servlet)时,会默认在_jspservice中声明创建几个对象
- 特点,我们可以在jsp页面中声明java局部代码块中直接使用内置对象
- 对像:
- Request:封存了请求的相关数据,由服务器创建
- Session:解决了同一用户不同请求之间数据共享的问题
- Application:servletContext对象,解决了不同用户之间数据共享问题
- Out:响应数据的对象,较于response对象,out对象底层使用了缓冲区,他的效率高于response
- Response:响应对象
- Page:指当前在执行的jsp转译的java文件的对象
- Cpnfig:servletConfig对象:使用此对象完成数据的初始化
- exception:jsp页面的异常对象,封存了异常信息
- pageContext:页面上下文对象,此对象封存了另外8个对象
- 一个jsp页面一个pageContext对象。pageContext对象每次请求都会被重新创建。作用域:当前jsp页面
7。Servlet请求转发和重新定向jsp页面及相对路径
- resp.sendRedirect("jsp文件名/相对路径");
- req.getRequestDispatcher("jsp文件名/相对路径").forward(req, resp);
- 服务器根目录:webapps的目录路径
- 项目根目录:webapps的目录路径下的项目目录
- 注意;都是写的相对路径
- 绝对路径:
- 重定向:第一个斜杠叫做服务器根目录
- resp.sendRedirect("/虚拟项目名/资源路径");
- 请求转发:/第一个斜杠叫做项目根目录
- req.getRequestDispatcher("/资源路径").forward(req, resp);