JSP学习

 

//jsp文件就是一个Servlet,用于做页面展示的Servlet,只是该类的编译与运行都是由服务器执行,而它所有的功能,指令,动作,EL等,都是对java功能的包装,让在jsp中实现java功能时更方便,也简化了命令,比如在网页上要输出东西,得先out=response.getWriter(),获得输出对象,然后再输出,现在一个EL表达式${}就解决了,但其底层依旧是java代码

 

一、执行原理

//以.jsp结尾的文件就是一个java文件,是一个servlet。比如:index.jsp文件被访问后,会被服务器内置的一个jsp翻译引擎翻译为index_jsp.java文件,然后在编译生成index_jsp.class文件,并执行

//而index_jsp.java这个类继承HttpJsBase类,而HttpjsBase类又继承HttpServlet,

//所以访问.jsp文件就是执行翻译之后的service()方法

//修改JSP文件之后,不需要重新部署,也不需要重启服务器,只需刷新一下浏览器页面即可(暂时没设置成功

//JSP就是专注于做页面展示的Servlet

 

 

二、JSP语法

  1. //注释

<%--
  ......
--%>    

//注释是不会被翻译到java源文件中的

 

 

  1. //小脚本

<%
 java语句;
......    
%>

//小脚本中的语句是被翻译到Servlet的service()方法中执行的的;java语句必须以“;”结尾

//当有多个小脚本语句时,也是由上而下依次执行

 

 

  1. //声明语法

<%!
 实例变量;
 静态变量;
 方法;
 静态代码块;
 构造方法;
......    
%>

//声明块中的java程序会被翻译到service()方法之外,该Servlet类之中

 

 

  1. //表达式语法

<%
 String username="zs"
%>
?
<%
 out.print("登录成功,欢迎" + username + "回来")
%>
?
<br>
?
登录成功,欢迎<%=username%>回来                 //表达式语法

//两种输出结果是等价的,后一种就是表达式语法,还可以用在标签中也行,比如:<%int i=2%>,在标题标签中:<h<%=i%>>大标题</h<%=i%>>

 

 

 

三、指令

//指令的作用是指导JSP的翻译引擎如何翻译JSP代码

//指令语法格式

<%@指令名 属性名=属性值 属性名=属性值 ......%>

 

page指令常用属性

  1. //contentType

<%@ page contentType="text/html; charset=UTF-8"%>

//contentType指定的是响应时使用的编码,即对应response.setConteType()方法的参数值! Tomcat都会把响应正文转换成UTF-8编译,然后发送给我客户端,并且会在响应头中设置Content-Type头信息为text/html;charset=utf-8,这样浏览器就知道使用服务器发送过来的正文使用了什么编码。

 

  1. //pageEncoding

<%@ page pageEncoding="UTF-8"%>

//无论是page指令的pageEncoding还是contentType,它们的默认值都是ISO-8859-1,我们知道ISO-8859-1是无法显示中文的,所以JSP页面中存在中文的话,一定要设置这两个属性。

//处理乱码的方案:

  1. 把JSP页面的编码设置为UTF-8;

  2. 把contentType和pageEncoding都设置为UTF-8。

 

  1. //import

<%@page import=”java.net.*,java.util.*,...”%>

//导入包的

 

  1. //session

<%@ page session="false"%>

//当session="true"时,程序会获取当前session对象,获取不到就新建一个session对象(默认)

//当session="false"时,表示当前jsp不能直接使用内置对象session,程序会获取当前session对象,获取不到返回null

 

  1. //errorPage

<%@ page  errorPage="/a/c/b.jsp" %>

//当当前JSP页面出错后,跳转到指定页面

 

  1. //isErrorPage

<%@ page isErrorPage="true" %>              //默认值为false
<body>
  <%=exception.getMessage() %>             //打印异常信息
</body>      

//出错之后,在跳转的页面添加isErrorPage="true“,表示该页面可以直接使用内置对象exception,使用其打印异常信息

 

  1. //isELIgnored

<%@ page isELIgnored="true" %> 

//是否忽略EL表达式

 

 

includ指令

//file属性

index1.jsp
<%@ include file="/index2.jsp" %>

//使index1_jsp包含index2_jsp,这两个jsp文件合在一起,底层只生成一个java源文件和一个class字节码文件,即在同一个service()方法中,它们的局部变量也是共享的,将这种关系称为静态联编

 

taglib指令

//导入其他标签库

 

 

四、动作

//动作语法格式

<jsp:动作名 属性名=属性值 属性名=属性值 ......></jsp:动作名>

 

forward动作

index1.jsp
<jsp: forward page="/index2.jsp" %>

//就是Servlet中的forward方法,在jsp文件中分表达,一次请求

 

include动作

a.jsp
<jsp: forward page="/b.jsp" %>

//a.jsp包含b.jsp,底层会生成2个java源文件,两个字节码文件;即生成2个Servlet,有两个独立的service()方法,他们的局部变量是不共享的,这种关系称为动态联编;当两个jsp文件有重名变量时,只能使用这种方式,其余都可以使用静态联编

//在网页上输入a.jsp,网页显示b.jsp的内容之后,网址依然是a.jsp,还是一次请求。相当于a中的service方法去调用b中的service方法

 

bean动作

 

 

五、JSP中的内置对象

内置对象 类型
pageContext javax.servlet.jsp.PageContext
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
out javax.servlet.jsp.JspWriter
page java.lang.Object
exception java.lang.Throwable

 

四个范围对象

pageContext: 只在一个页面中保存属性。 跳转之后无效。

request: 只在一次请求中有效,服务器跳转之后有效。 客户端跳无效

session: z在一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效

application: 在整个服务器上保存,所有用户都可使用。 重启服务器后无效

//注意:如果设置过多的application属性范围会影响服务器性能。

 

通过page对象可访问其他对象

pageContext.getRequest()

pageContext.getSession()

pageContext.getServletContext()

pageContext.getServletConfig()

 

 

 

六、EL表达式

//El表达式只能从四大域中获取数据,所以其他数据要想在EL表达式中获得,必须先通过setAttribute()方法存进四大域中

//语法

${表达式}

 

 

获取数据

//EL获取数据时不会报空指针,下标越界等异常,即使出现了也不会报,只是不显示表示的结果而已

 

//从四大域中获取数据

session.setAttribute("u",200)
pageContext.setAttribute("u",100)
u=${u}           //100
?
u=${sessionScope.u}     //200         在指定域中获取数据

//EL表达式查找数据的顺序是:由从小到大的顺序依次从四大域中查找,找到了就不会接着再找了。(application是最后找的)

//通过以下4个内置对象在指定的域空间中找查找:

pageScope,requestScope, sessionScope, applicationScope

 

 

//从符合javabean规范的类中获取数据

<%@page import="com.dh.jsp.Student" %>   //Student类有两个属性:name,age
<%
  Student stu=new Student("zs",22);
  pageContext.setAttribute("s",stu);
%>
Student=${s}       //Student=Student{name=‘zs‘, age=22}
age=${s.age}       //age=22
age=${s[‘age‘]}   //age=22 第二种输出方式
?
?
name=${s3.name}   //name=   若访问为null的对象,不会报空指针异常,仅仅是不显示而已

 

 

//从数组中获取数据

<%
  Student[] students=new Student[2];
  students[0]=new Student("ls",21);
  students[1]=new Student("ww",28);
  pageContext.setAttribute("ss",students);
%>
students[1].name=${ss[1].name}       //students[1].name=ww

 

 

//从List集合中获取数据

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%
  List<Integer> names=new ArrayList<>();
  names.add(1);
  names.add(2);
  pageContext.setAttribute("name",names);
%>
name[1]=${name[1]}       //name[1]=2

 

 

//从Map集合中获取数据

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
  Map<String,Object> map =new HashMap<>();
  map.put("student",new Student("zl",66));
  pageContext.setAttribute("map",map);
%>
student.name=${map.student.name}       //student.name=zl

 

 

 

运算符

操作符 描述
. 访问一个Bean属性或者一个映射条目
[] 访问一个数组或者链表的元素
+ 加(注意:这里的加号不能进行字符串的拼接)
- 减或负 (EL不支持++和--)
*
/ or div
% or mod 取模
== or eq 测试是否相等
!= or ne 测试是否不等
< or lt 测试是否小于
> or gt 测试是否大于
<= or le 测试是否小于等于
>= or ge 测试是否大于等于
&& or and 测试逻辑与
|| or or 测试逻辑或
! or not 测试取反
? : 三元运算符

//empty运算符:用法:${empty 变量} 结果为布尔值

//若变量未定义,返回值为true

//若变量为String类型,且其值为空串,返回值为true

//若变量为引用类型,其值为null,返回值为true

//若变量为集合类型,且其不包含任何元素,返回值为true

 

 

EL中的内置对象

 

  1. //pageContext

${pageContext.request}

//此pageContext与jsp中的内置对象pageContext是同一个,但request,response,session,application等都不是EL的内置对象,只能通过pageContext对象以以上方式获得

 

  1. //获取当前项目发布到服务器的名称(即myweb)

${pageContext.request.contextPath}

//通过pageContext获取request对象

 

  1. //获取表单中value值

${param.name}       //获取属性名为name的value值,value值只有一个时
${paramValues.h}   //获得属性名为h的value值得一维数组

//以上两个内置对象底层分别调用了:request.getParameter()和request.getParameterValues()方法

 

  1. //获取Context范围的初始化属性值

${initParam.name}    //获取属性名为name的的属性值

//底层调用java中的:servletContext.getInitParameter()

 

 

 

七、JSTL标准标签库

 

核心标签库

导入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

 

1.set标签

//作用1:将变量存到指定域中

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="name" value="zs" scope="session"/>
name=${sessionScope.name}                 //name=zs

//var:变量名; varlue:变量值; scope:域属性,取值有page(默认),request,session,application

 

//作用2:为javaBean规范的类属性赋值

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="com.dh.jsp.Student" %>   //Student类有两个属性:name,age
<%
  Student stu=new Student();
%>
<c:set value="ls" property="name" target=${pageScope.stu}
name=${stu.name}                         //name=ls

//value:属性值; property:指定对象的指定属性;target:指定目标对象

 

//作用3:给Map赋值

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
  Map<String,Object> map =new HashMap<>();
%>
<c:set value="beijin" property="address" target=${pageScope.map}
address=${map.address}                 //address=beijin

//property:key值;target:指定目标集合

 

 

2.remove标签

//删除指定域中的属性

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%
session.setAttribute("u",200);
pageContext.setAttribute("u",100);
<%
<c:remove var="u" scope="session"/>
u=${sessionScope.u}                    //u=
u=${pageScope.u}                       //u=100

//若不指定某个域,则删除所有域中的同名属性

 

 

3.catch标签

//捕捉标签体重中的异常,并将其赋给其属性

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:catch var="es">
  {%int i=3/0}
</c:tch>
ec=${ex.message}               //ex=/byzero

//若标签体替换成{% 3/0 %},就没有异常,因为3/0=Infinity(无穷大),有值的,所以不会报异常

 

 

4.out标签

//default属性

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
name1=<c:out value="name1" default="2"></c:out>       //name1=name1
name2=<c:out value="${x}" default="2"></c:out>       //name2=2

//只有使用没定义的变量,才会显示default的值,若value=“”(空串),他也不会显示default的值

 

//escapeXml属性

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="xml" value="<h1>中国</h1>"/>
xml=<c:out value="${xml}"></c:out>                       //xml=<h1>中国</h1>
xml=<c:out value="${xml}" escapeXml="false" ></c:out>     //xml=中国

//escapeXml="false" : 是否忽视xml标签,默认值为true

 

 

5.if标签

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="判定语句">
  标签体
</c:if>

//判断语句返回true,执行标签体中的内容;返回false,结束该if

 

 

6.choose标签

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<c:choose>
  <c:when test="判断语句1">
      标签体1
   </c:when>
  <c:when test="判断语句2">
      标签体2
   </c:when>
  ......
   <c:otherwise>
      标签体n
   </c:otherwise>
</c:choose>

//判断语句1返回true,执行标签体1,执行之后结束choose;若判断语句1返回false,则执行判断语句2,......,若所有判断语句都返回false,则执行otherwise中的的标签体

 

7.forEach标签

//基本用法

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%
  List<Integer> names1=new ArrayList<>();
  names1.add(1);
  names1.add(2);
  names1.add(3);
  names1.add(4);
  names1.add(5);
  names1.add(6);
  pageContext.setAttribute("names1",names1);
%>
<c:forEach items="${names1}" var="num" begin="0"  end="4"  step="2">
  ${num}
</c:forEach>                   //1 3   5  

//begin,end:起始下标和终点下标都是闭环;step:间隔范围

 

//高级用法

<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%
  List<Student> rs=new ArrayList<>();
  rs.add(new Student("a",21));
  rs.add(new Student("b",22));
  rs.add(new Student("c",23));
  rs.add(new Student("d",24));
  rs.add(new Student("e",25));
  pageContext.setAttribute("rs",rs);
%>
<c:forEach items ="${rs}" var="s" varStatus="ss">
  ${ss.count}
  ${ss.first}
  ${s.name}
  ${s.age}
  <br>
</c:forEach>
?
//
1 true a 21
2 false b 22
3 false c 23
4 false d 24
5 false e 25

//ss.count:输出序号;ss.first:判断是否为集合的第一个元素,是返回true,反之false;

//ss.index:输出下标,从0开始;ss.last:判断是否为集合的最后一个元素,是返回true,反之false;

 

 

格式化标签库

1.formatDate标签

<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%
  Date time=new Date();
  pageContext.setAttribute("time",time);
%>
time=${time}                                                   //time=Sat Jun 12 15:05:27 CST 2021
now=<fmt:formatDate value="${time}" pattern="yyyy-MM-dd"/>     //now=2021-06-12
?
?
<fmt:formatDate value="${time}" pattern="yyyy-MM-dd" var="b" Scope="page"/>
<br>
生日:<input type="text" value="${b}">                         ////生日:2021-06-12
?

//在后面加var属性之后,内容会被保存在变量中,无法直接输出,必须以${变量名}的方式输出

 

2.pareseDate标签

3.formatNumber标签

4.parseNumber标签

 

 

 

 

 

 

 

 

JSP学习

上一篇:Maven---无法创建jsp


下一篇:21. Servlet3.0 / 3.1 文件上传 Plus