第六章
一、JSP简介
Java Server Page:Java服务器端页面,也和Servlet一样,用于动态Web技术
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
二、JSP的运行原理
1、客户端通过浏览器向服务器发出请求,在该请求中包含了请求的资源的路径,这样当服务器接收到该请求后就可以知道被请求的内容。
2、服务器根据接收到的客户端的请求来加载相应的JSP文件。
3、Web服务器中的JSP引擎会将被加载的JSP文件转化为Servlet。
4、JSP引擎将生成的Servlet代码编译成Class文件。
5、服务器执行这个Class文件。
6、最后服务器将执行结果发送给浏览器进行显示。
三、JSP脚本和注释
脚本:
1.<%Java代码%>
2.<%=java变量或表达式>
3.<%!java代码%>
以下是永远可用的脚本变量:
-
out – JSPWriter用来写入响应流的数据
-
page – servlet自身
-
pageContext –一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间传递。
-
request –HTTP request对象
-
response –HTTP response对象
-
session –用于保持客户端与服务器连接的对象
注释:
1.Html注释:
可见范围jsp源码,翻译后的servlet,页面显示Html源码
2.java注释://单行注释 /多行注释*/
可见范围jsp源码 翻译后的servlet
3.JSP注释:<%–注释内容–%>
可见范围jsp源码可见
四、JSP指令
JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令:
-
包含指令include –包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C预处理器所提供的很类似。被包含文件的扩展名一般都是"jspf"(即JSPFragment,JSP片段):
-
<%@ include file="somefile.jsp" %>
page指令
属性最多的指令(开发过程Page指令默认)
格式:<% page 属性名1=”属性值1“ 属性名2=”属性值2”…%>
常用属性如下:
language:jsp脚本中可以嵌入的语言种类
contentType:response.setContentType(text/html;charset=UTF-8)
session:是否Jsp在翻译时自动创建session
import:导入java的包
errorPage:当前页面出错后跳转到哪个页面
include指令:
页面包含(静态包含)指令,可以将一个Jsp页面包含到另一个jsp页面中
格式:<%@ include file=“被包含的文件地址”%>
taglib指令:
在Jsp页面中引入标签库(jstl标签库,strus2标签库)
格式:<%@ taglib uri="标签库地址“ prefix="前缀” %>
五、JSP隐式对象概述
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。JSP所支持的九大隐式对象:
Request对象:是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response对象:是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
out对象:是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。
session对象:是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。session对象用来跟踪在各个客户端请求间的会话。
applicetion对象:直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
config对象:是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
pageContext对象:是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
page对象:这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。page 对象就是this对象的同义词。
Exception对象:包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。
六、JSP标签
JSP标签用来控制JSP的行为,执行一些常用的JSP页面动作,通过标签可以实现很多行Java代码才能够实现的功能,比如请求转发的功能
页面包含(动态包含):<jsp:include page=“被包含的页面”/>
请求转发:<jsp:forward page=“要转发的资源” />
import:导入Java的包
errorPage:当前页面出错后跳转到哪个页面
第七章
一、EL表达式中获取域中数据
EL提供了在JSP中简化表达式的方法,让Jsp的代码更加简化,可以嵌入在jsp页面内部,减少Jsp脚本的编写;
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:r e q u e s t S c o p e . n a m e E L 最 主 要 的 作 用 是 获 取 四 大 域 中 的 数 据 , 格 式 {requestScope.name} EL最主要的作用是获取四大域中的数据,
格式requestScope.nameEL最主要的作用是获取四大域中的数据,格式{EL表达式}
EL获得pageContext域中的值,p a g e S c o p e . k e y E L 获 得 r e q u e s t 域 中 的 值 , {pageScope.key} EL获得request域中的值,pageScope.keyEL获得request域中的值,{requestScope.key}
EL获得session域中的值,s e s s i o n S c o p e . k e y E L 获 得 a p p l i c a t i o n 域 中 的 值 : {sessionScope.key} EL获得application域中的值:sessionScope.keyEL获得application域中的值:{applicationScope.key}
El从四个域中获得某个值${key}:
–同样是依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找
二、EL的内置对象
pageScope,requestScope,sessionScope,applicationScope—获取JSP中域的数据
param,paramValues-接收参数
相当于request.getParameter() request.getParameterValues()
header,headerValues-获取请求头信息
相当于request.getHeader(name)
initParam—获取全局初始化参数
相当于this.getServletContext().getInitParameter(name)
cookie-WEB开发中的cookie
相当于request.getCookies()—>cookie.getName()---->cookie.getValue()
pageContext–WEB开发中的pageContext.
三、JSTL的简介与基本配置
<c:if>标签专门用于完成JSP页面中的条件判断
<c:if test=“表达式”>
//表达式成立执行语句
</c:if>
其中test是返回boolean的条件
package net.zixue.JSP;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "FollowServlet")
public class FollowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//关注的时候传一个参数follow=1 不关注的时候传follow=0
String follow = request.getParameter("follow");
request.setAttribute("follow",follow);
request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response);
}
}
四、JSTL——forEach标签
<c:forEach>循环标签可以根据循环条件(通常和el表达式使用,el表达式我们有机会再说,在这里我就默认你会基本的el表达式了),遍历集合并从中取出我们想要的数据。如果在JSP页面中使用JAVA代码来遍历数据,会使页面非常混乱,不利于维护和分析。使用<c:forEach>循环标签可以是页面更加直观、简洁。
<c:forEach>有以下的属性:
items:指定要遍历的集合,相当于下面的str
String[] str={"1","2"};
for(String s:str)
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: 86178
Date: 2021/4/27
Time: 21:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--使用JSTL的时候需要配合EL表达式--%>
<c:if test="${requestScope.follow eq 1}">
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<%
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小花");
user1.setSex("女");
User user2=new User();
user2.setName("小刚");
user2.setSex("男");
list.add(user1);
list.add(user2);
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
request.setAttribute("list",list);
for (User user : list) {
System.out.println(user.getName());
}
%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
${list[i].name}
</c:forEach>
<%--items代表的是一个集合或者是数组--%>
<c:forEach items="${list}" var="user">
${user.name}
</c:forEach>
</body>
</html>