第四次作业

第六章

 

一、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>


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值