JSP基础知识点(详细总结)

1、JSP概述

学习要点:三个指令,六个动作,九大内置对象还有四大域对象

1.1、JSP运行原理

  • 当服务器上的一个JSP页面第一次被请求执行是,服务器上的Web容器首先将JSP页面转译成一个Java文件

  • 再将这个Java文件编译生成字节码文件,然后通过执行字节码文件响应客户的请求

  • 当这个JSP页面再次被请求执行时,Web容器将直接执行这个字节码文件来响应客户

  • servlet:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            String value1=request.getParameter("value1");
            String value2=request.getParameter("value2");
            int sum=Integer.valueOf(value1)+Integer.valueOf(value2);
            request.setAttribute("sum", sum);
            System.out.println(request.getAttribute("sum"));
            
            request.getRequestDispatcher("result.jsp").forward(request, response);
        }

1.2、JSP脚本和概述

1.2.1、JSP脚本

// 1、<% 代码 %>----java代码片段(常用)
脚本片段,生成在service方法中,每次请求的时候都会执行
// 2、<%! 代码 %>----变量和方法的声明 
声明片段,在java代码中声明成员,放在jsp生成java文件中的成员位置,变量作用范围是整个JSP页面,同时它只在一个JSP页面有效

<%!
    int x=100;
    String y="声明变量";
    Date date;
    String sayHello(){
        return "Hello my dear friends";
    }
 %>
// 3、<%=代码 %>----表达式,输出到JSP页面
输出脚本片段,相当于out.print("代码") 方法,输出到jsp页面,该表达式结果在JSP程序请求处理阶段会自动转化为字符串然后插到该表达式在JSP文件的位置
 <%=sayHello()%>  //输出上面生命的方法体

1.2.2、JSP和Servlet的区别

JSP主要以页面为主,尽量不要书写java代码。
Servlet主要以业务逻辑为主,尽量不要书写页面。
JSP:作为请求发起页面,例如显示表单、超链接。作为请求结束页面,例如显示数据。
Servlet:作为请求中处理数据的环节

1.2.3、JSP注释

html注释<!-- 注释静态资源 -->

JSP注释<%-- 注释所有 --%>

1.3、JSP指令(三大指令)

1.3.1、什么是指令?

用于配置JSP页面,导入资源文件。

1.3.2、指令格式

<%@ 指令名称 属性名1="属性值1" 属性名2="属性值2" ...%>

1.3.3、page指令

作用 : 用于定义JSP页面的各种属性,告诉tomcat服务器如何翻译JSP文件。主要用于配置当前jsp页面的一些信息

pageEncoding    编码方式
language    目前仅支持java语言
import  导入jar包
errorPage   当前页面报错后,跳转指定错误提示页面
isErrorPage 声明当前jsp页面是一个异常处理页面,打开异常开关 false:(默认) true:可以操作exception异常对象
autoFlush   它是指在使用out方法输出的时候,是否自动刷新. 默认是true。会自动刷新
buffer="8kb"    当前页面的输出流的缓冲区大小。如果设置buffer=0 ,表示没有缓冲区
isELIgnored 是否运行使用el表达式 ,false允许使用 true是不允许使用。
session 指定一个http会话中是否使用会话

1、配置单个友好报错页面

//errorPage属性
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="/500error.jsp" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        int a = 1/0;//当页面发生错误,跳转到指定的错误页面(配置友好页面)
    %>
</body>
</html>

2、配置全局友好报错页面

    
<error-page>
        <!--配置错误状态码-->
        <error-code>404</error-code>
        <!--配置错误友好页面-->
        <location>/404error.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/500error.jsp</location>
    </error-page>

3、isErrorPage属性获取异常信息

<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>
<html>
<head>
    <title>当前是一个错误的友好页面</title>
</head>
<body>
    <%--只有isErrorPage="true" 才可以使用exception对象 --%>
    <%= exception.getMessage()%>
</body>
</html>

1.3.4、include指令

作用:在当前页面用于包含其他页面。

<%@include file="xxx.jsp"%>
<h2>我是头部</h2>
<h2>我是脚部</h2>
   // 
<%@include file="header.jsp"%>
<h2>我是身体</h2>
<%@include file="fooder.jsp"%>

1.3.5、taglib指令

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

导入资源, 在jstl中我们会使用该指令导入标签库--prefix 自定义前缀

<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<%--引入jstl核心标签库,前提得导入jstl相关的jar包--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--引入taglib指令,就可以使用相关的标签库--%>
</body>
</html>

1.4、JSP内置对象(九大内置对象)

作用:在JSP页面中不需要获取和创建,可以直接使用的对象,查看jsp底层源码service方法。

// 1、page this 封装页面对象,
   该对象代表了正在运行的由JSP文件产生的类对象,相当于this。一般情况下不建议使用该对象
// 2、request ServletRequest,封装请求对象,
   代表的是来自客户端的请求HttpServletRequest。包括从GET/POST请求传递过来的参数
// 3、response ServletResponse,封装响应对象,
    代表的是对客户端的响应HttpServletResponse。网页传回客户端的信息
// 4、application ServletContext,封装应用程序对象,
   负责提供应用程序在服务器中运行时的一些全局信息,是一个容器级的共享对象数据
// 5、session HttpSession 封装会话对象,
   代表服务器与客户端所建立的会话,是javax.servlet.http.HttpSession接口。当需要在不同的JSP页面中保留客户信息的情况下用于跟踪用户状态。在客户端允许时,使用Cookie支持;否则一般使用URL重写来支持。即使不存在session引用,这个对象也是自动绑定的。但有一个例外,这就是如果你用page指令的session属性关闭了会话,此时对session变量的引用将导致JSP页面转换成Servlet时出错
// 6、config ServletConfig 封装代码配置对象,
   该对象提供一些该Servlet的配置信息,是javax.servlet.ServletConfig接口的实现
// 7、exception 异常信息的对象,封装异常对象,
     代表了JSP文件运行时所产生的并且没有被捕获的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了
     <%@ page isErrorPage="true "%>的JSP文件中使用
// 8、out 等价于response.getWriter() 封装输出对象,
   用来向客户端自定义输出内容,代表了向客户端发送数据的对象,是javax.servlet.jsp.JspWriter接口的实现.JspWriter是带缓冲的版本
// 9、pageContext 包装页面上下文对象,
   代表的是当前页面运行的一些属性,例如可以获取session、request、response、exception、ServletContext和ServletConfig的引用。是javax.servlet.jsp.PageContext接口的实现

1.4.1、常用内置对象

// 变量名      说明
pageContext  当前页面的域对象和获取其他八个内置对象。
request      接收用户请求(参数)和 获取一次请求中域对象。
response     设置响应:字节流和字符流。
out          专门在jsp中处理字符流。
             print(): 可以输出一切类型。
             write():只能输出字符类型。

1.4.2、pageContext

向四大域中存取数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%
            pageContext.setAttribute("username","tom");
            pageContext.setAttribute("username","tom", PageContext.PAGE_SCOPE);
            pageContext.setAttribute("username","jack",PageContext.REQUEST_SCOPE);
            pageContext.setAttribute("username","rose",PageContext.SESSION_SCOPE);
            pageContext.setAttribute("username","yiyan",PageContext.APPLICATION_SCOPE);
        %>
        page:<%= pageContext.getAttribute("username")%><br>
        page:<%= pageContext.getAttribute("username",PageContext.PAGE_SCOPE)%><br>
        request:<%= pageContext.getAttribute("username",PageContext.REQUEST_SCOPE)%><br>
        session:<%= pageContext.getAttribute("username",PageContext.SESSION_SCOPE)%><br>
        application:<%= pageContext.getAttribute("username",PageContext.APPLICATION_SCOPE)%><br>
 
        <hr>
        <%--findAttribute  page request session application 范围查找--%>
        find:<%= pageContext.findAttribute("username") %>
        
    </body>
</html>

四个域对象作用范围

page < request < session < ServletContext(application)

1.5、JSP动作标签介绍(六大页面动作)

jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

1.5.1、jsp:useBean标签

---代替java代码在jsp中的书写,用标签即可完成

    
<%
        User user = new User();
        user.setUsername("jack");
        user.getUsername();
    %>
    <%--相当于User user = new User()--%>
    <jsp:useBean id="user" class="cn.itssl.bean.User" scope="page"/>
    
    <%--user.setUsername("jack")--%>
    <jsp:setProperty name="user" property="username" value="jack"/>
 
    <%--user.getUsername()--%>
    <jsp:getProperty name="user" property="username"/>

1.5,2、jsp:include标签

<jsp:include page="header.jsp"/>
<h2>我是内容</h2>
<jsp:include page="foot.jsp"/>

1.5.3、jsp:forward标签

可以实现转发。

 <jsp:forward page="login.html"/>

1.6、存放数据的四大范围

  • page只在当前页面范围内有效

  • request可以在请求转发时在多个页面之间共享数据

  • session在当前应用中针对当前用户共享数据

  • application当前应用中跨用户数据共享

2、EL表达式(重要)

EL 全名为Expression Language,翻译成中文表达式语言
语法:${标识符} 作用就是输出标识符的所代表的值。
el出现目的:代替<%= %>,代替out.print();
常用功能:
获取各种域(各种数据范围,servletContext(全局的),request(一次请求)中存储的数据
    
    // el表达式遍历方式:
    <c:forEach items="${requestScope.arr}" var="i">
        ${i}
    </c:forEach>

2.1、EL取值

2.1.1、pageContext域

<%
    pageContext.setAttribute("username","tom");
    pageContext.setAttribute("username","tom", PageContext.PAGE_SCOPE);
    pageContext.setAttribute("username","jack",PageContext.REQUEST_SCOPE);
    pageContext.setAttribute("username","rose",PageContext.SESSION_SCOPE);
    pageContext.setAttribute("username","yiyan",PageContext.APPLICATION_SCOPE);
%>  
 
    ${pageScope.username}
    ${requestScope.username}
    ${sessionScope.username}
    ${applicationScope.username}
    <hr>
    <%--也可不指定范围,从page reqeust session application 找--%>
    ${username}

2.1.2、数组

Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws                            ServletException, IOException {
        //业务层   dao
        //把查到的数据返回给web层
        int[] arr = {11,22,33,44,55,66};
        request.setAttribute("arr",arr);
        request.getRequestDispatcher("show.jsp").forward(request,response);
 
    }
show.jsp :
<body>    
    ${requestScope.arr[0]}
    ${requestScope.arr[1]}
    ${requestScope.arr[2]}
    ${requestScope.arr[3]}
    ${requestScope.arr[4]}
    ${requestScope.arr[5]}dy>
    //
    <c:forEach items="${requestScope.arr}" var="i">
        ${i}
    </c:forEach>
 </body>
    

2.1.3、list集合

Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws                                          ServletException, IOException {
        //web service  dao
        //把查询的结果放在list集合
        List<String> list = new ArrayList<>();
        list.add("tom");
        list.add("jack");
        list.add("rose");
        list.add("yiyan");
        request.setAttribute("list",list);
        request.getRequestDispatcher("show.jsp").forward(request,response);
 
    }
show.jsp:
    <body>
    <c:forEach items="${requestScope.list}" var="list">
        ${list}
    </c:forEach>
</body>

2.1.4、map集合

 request.setAttribute("map",map);
 request.getRequestDispatcher("show.jsp").forward(request,response);
 //
 <body>
    ${requestScope.map.a}
    ${requestScope.map.b}
    ${requestScope.map.c}
    ${requestScope.map.d}
 
    <c:forEach items="${map}" var="map">
        key:${map.key}
        value:${map.value}
    </c:forEach>
</body>

2.1.5、java对象

request.setAttribute("user",user);
request.getRequestDispatcher("show.jsp").forward(request,response);
//
<body>
    <%--直接对象.属性名--%>
    ${requestScope.user.username}
    ${requestScope.user.addr}
</body>

2.1.6、集合对象

list.add(user);
request.setAttribute("list",list);
request.getRequestDispatcher("show.jsp").forward(request,response);
//
​
<body>
    <c:forEach items="${requestScope.list}" var="user">
        ${user.username}
        ${user.addr}
    </c:forEach>
</body>

3、JSTL核心标签库

JSTL的作用:

用于简化和替换jsp页面上的java代码的编写,注意事项:需要手动添加jstl的jar包

3.1、c:if标签

<body>
    <%
        int a = 10;
        request.setAttribute("a",a);
    %>
    <c:if test="${requestScope.a > 10 }" var="a">
        登录失败!
    </c:if>
    <c:if test="${requestScope.a == 10}" var="a">
        登录成功!
    </c:if>
</body>

3.2、c:choose、c:when、c:otherwise标签

c:choose标签用于指定多个条件选择的组合边界,它必须与c:when和c:otherwise标签一起使用。
使用c:choose,c:when和c:otherwise三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
c:when ,c:otherwise 属于同一级别标签。同时是c:choose的子标签
它可以理解成switch结构。 • c:choose 相当于switch • c:when 相当于 case • c:otherwise 相当于 default
    
   
 <body> 
    <%
        int a = 10;
        request.setAttribute("a",a);
    %>
    <c:choose>
        <c:when test="${a==1}">星期一</c:when>
        <c:when test="${a==2}">星期二</c:when>
        <c:when test="${a==3}">星期三</c:when>
        <c:otherwise>星期八</c:otherwise>
    </c:choose>
</body>

3.3、c:set标签

<body>
    <%--
        var:变量名
        value: 值
        scope: 范围
    --%>
    <c:set var="name" value="张三" scope="page"/>
    ${pageScope.name}
    <%
        User user = new User();
        user.setUsername("jack");
        request.setAttribute("user",user);
    %>
 
    原始数据:
    ${requestScope.user.username}
 
    <%--修改数据--%>
    <c:set target="${user}" property="username" value="rose"/>
    修改后数据:
    ${requestScope.user.username}
</body>

3.4、c:out标签

<body>
    <c:set var="name" value="张三" scope="page"/>
    <%--out是输出标签, value: 要取的值 default:如果你没有取到值给出默认值--%>
    <c:out value="${name123}" default="法外狂徒"/>
 
    <%
        String str ="<a href='https://www.baidu.com'>百度一下</a>";
        request.setAttribute("str",str);
    %>
 
    <%--
        escapeXml:表示输出的内容是html相关的,是否按照html格式输出
        true 默认:不会按html格式输出
        false: 按html格式输出
    --%>
    <c:out value="${str}" escapeXml="false"/>
</body>

3.5、c:forEach标签

<body>
    <%
        int[] arr ={11,22,33,44,55,66};
        request.setAttribute("arr",arr);
    %>
    <c:forEach items="${arr}" var="i">
        ${i}
    </c:forEach>
 
    <hr>
    <c:forEach begin="0" end="4" step="2" var="i">
        ${arr[i]}
    </c:forEach>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈水水水水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值