JSP
为什么需要JSP?
Servlet:
**优点:**逻辑处理方便
**缺点:**页面表现麻烦
JSP:
**优点:**页面表现方便
**缺点:**逻辑处理麻烦
**注意:**一般在web项目中,采用JSP+Servlet+JavaBean技术
JSP≈java+html
JSP执行过程
浏览器输入:localhost:8080/jsp/1.jsp
tomcat收到*.jsp请求,则会到org.apache.jasper.servlet.JspServlet处理
JspServlet调用相应的java类,jsp引擎根据1.jsp生成的java类(位于tomcat子目录work下面:1.jsp.java,1.jap.class)
执行1.jsp.class,将HTML数据输出给tomcat,tomcat再将这些数据输出给客户端
Page:
作用:用来设置转义成servlet文件时的参数
contentType:表示浏览器解析响应信息时候使用的编码和解析格式
language:表示jsp要转义成的文件类型
import:导入需要的jar包,多个包使用逗号分隔
pageEncoding:设置页面的编码格式
session:用来控制servlet中是否有session对象
errorPage:当页面发生逻辑错误的时候跳转的页面
extends:选择要转义的servlet类要继承的父类(包名+类名)
JSP页面嵌入java代码
**局部代码块:**可以将java代码和页面展示的标签写在一个jsp页面中,java代码转义成的servlet文件中,java代码跟输出是保存在service方法中的。
**缺点:**代码可读性比较差,开发比较麻烦。
一般不使用
全局代码块:
定义公共的方法时候需要使用全局代码块<%!%>,生成的代码在servlet类中
调用的时候需要使用局部代码块
脚本调用方法:
使用<%=直接调用变量和方法(必须有返回值)%>
**注意:**不能在变量或方法的后面添加
include:
静态导入:
<%@ include file=“staticImport.jsp”%>
file中填写的是jsp页面的相对路径。
不会将静态导入的页面生成一个servlet文件,而是将两个文件合并。
**优点:**运行效率高
**缺点:**两个页面会耦合到一起,两个页面中不能存在相同名称的变量名。
动态导入:
<jsp:include page=“dynamicImport.jsp”></jsp.include>
两个页面不会进行合并,分别生成自己的servlet文件,但是页面在最终展示时候是合并在一起的
**优点:**没有耦合,可以存在同名的变量
请求转发:
在jsp中也可以实现servlet的请求转发
<jsp:forward page=“forward.jsp”></jsp.froward>
**注意:**在标签中间不可以添加任何字符除了<jsp:param name="" value="">,在转发的页面中想要获取到属性值request.getParameter("");
jsp九大内置对象:
jsp页面在转义成其对应的servlet文件的时候,会自动声明一些对象,在jsp页面可以直接使用
**注意:**内置对象是在jsp页面中使用的,可以再局部代码块中使用,也可以在脚本段语句中使用,不能在全局代码中使用
1.pageContext:表示页面上下文的对象,封存了其他的内置对象,封存了当前页面的运行信息
**注意:**每一个页面都有一个对应的pageContext对象,伴随着当前页面的结束而结束。
2.request:封装当前请求的数据,由tomcat创建,一次请求对应一个request对象
3.session:用来封装同一个用户的不同请求的共享数据,一次会话对应一个session对象
4.application:相当于ServletContext,一个web项目只有一个对选哪个,存储所有用户的共享数据,从服务器启动到服务器结束
5.response:响应对选哪个,用来响应请求数据,将处理结果返回给浏览器,可以进行重定向
6.page:代表当前jsp对象,跟java中的this指针类似
7.exception:异常对象,存储当前运行的异常信息,必须在page指令中添加isErrorPage=true
8.config:相当于servletConfig对象,用来获取web.xml中配置的数据,完成servlet初始化操作
9.out:响应对象,jsp内部使用,带有缓存区的响应对象,效率要高于response
四大作用域:
pageContext:当前页面,解决当前页面内的数据共享问题,获取其他内置独享
request:一次请求,一次请求的servlet的数据对象,通过请求请求转发的方式,将数据流转到下一个servlet
session:一次会话,一个用户发送的不同请求之间的数据共享
application:项目内不同用户数据共享问题,将数据从一个用户流转到其他用户
路径问题:
想要获取项目中的资源,可以使用相对路径,也可以使用绝对路径。
**相对路径:**相对于当前页面的路径
**问题:**1、资源的位置不可以随便更改
2、需要使用…/的方式进行文件夹的跳出,如果目录结构比较深,可能操作起来比较麻烦
**绝对路径:**在请求路径的前面加/表示当前服务器的根路径,使用的时候要添加虚拟项目名称加/资源目录
使用jsp中自带的全局路径声明:
<%
String path = request.getContextPath();
System.out.println(path);
String basePath = request.getScheme()+"😕/"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println(basePath);
%>
标签:
添加资源路径的时候,从当前项目的web路径下即可。
EL表达式:
使用传统方式获取request中的值有以下缺点:
1.必须要导入包
2.进行类型的强制转换
3.层次结构比较复杂
**解决办法:**使用EL表达式
**概念:**一种写法非常简单的表达式,语法简单易懂,便于使用
**作用:**让jsp写起来更加的方便。建华在jap中获取作用域或者请求数据的写法
语法结构:
${expression},可以使用.或者[]获取属性值或者指定索引位置的对象
获取值得时候,直接使用作用域中的key即可,使用.来引用属性,使用[]来获取指定索引位置的对象
**作用域:**pageContext–>request–>session–>application
获取作用域数据的顺序:
从小的作用域开始查询,如果找到则返回对应的值,不接着向大范围寻找数据。
当四种作用域中存在相同key的属性的时候,可以通过pageScope,requestScope,sessionSCope,applicationScope获取指定作用域的value
El表达式可以进行算数运算和关系运算:
直接在表达式中写入算法操作即可,如果是关系运算,返回true或者false。
**注意:**在EL表达式中的+表示加法操作,而不是字符串连接符。
EL表达式可以进行逻辑运算:
KaTeX parse error: Expected '}', got 'EOF' at end of input: {true$false}
EL表达式获取header信息:
${header}:获取所有请求头信息
${header[key]}:获取指定可以的数据
${headerValues[key]}:获取key对应的一组数据
${headerValues[key] [0]}:获取key对应数组的某一值
El表达式获取cookie数据
${cookie}:获取cookie中所有数据
${cookie.key}
${cookie.key.name}
${cookie.key.value}
JSTL标签库:
帮助我们在jsp页面中添加复杂的逻辑判断,避免逻辑代码和页面标签混为一谈
JSTL表达式是EL表达式的扩展,同事,JSTL依赖于EL,为了方便从作用域中获取值
JSTL的导入:
添加jar到web-inf的lib目录下
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
需要在配置里面加入c.tld文件(FIle–>Settings–>Languages & Frameworks–>Schemasand and DTDS -->±->)
核心标签库:
格式化标签库:
函数标签库:
xml标签库:
SQL标签库:
标签学习:
<c:out value="哈哈" default="嘿嘿"></c:out>
value:填写要输出的值
default:默认值
<c:set var="哈哈" value="pageContext"></c:set>
var:表示参数的key
value:表示参数的值
scope:表示向哪个作用域设置属性值
注意:当只配置这两个属性的时候,默认是向pageContext作用域中设置属性,可以通过参数来做选择向那个作用域设置。
<c:remove var="哈哈"></c:remove>
删除作用域数据
var:表示参数的key
如果没有指定删除的作用域(scope),则默认会把所有作用域中的参数删除
<c:if test"${a>5} var="flag" scope="request" >
<h1>jstl is easy</h1>
</c:if>