【JavaWeb jsp 08】

一、概念

1、何为jsp,它有什么用

jsp是Java的服务器页面,jsp的主要作用是代替Servlet程序回传html页面的数据

2、jsp如何访问

jsp文件和html文件一样,都是放到web目录下。访问也和html页面一样。

http://ip:port/工程路径/b.jsp

3、jsp的本质是一个Servlet程序

二、jsp的三种语法

1、jsp头部的page指令

jsp的page指令可以修改jsp页面中一些重要的属性,或者行为

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • language属性   表示jsp翻译后是什么语言,暂时只支持Java
  • contentType属性  表示jsp返回的数据类型是什么?也是源码中response.setContentType()参数值
  • pageEncoding属性  表示当前jsp页面文件本身的字符集
  • import属性  跟Java源代码中一样。用于导包,导类

========两个属性是给out输出流使用=========

  • autoFlush属性   设置当out输出流缓存区满了之后,是否自动刷新冲击区。默认值是true
  • buffer属性        设置out缓存区的大小,默认是8kb
  • errorPage个属性    设置当jsp页面运行时出错,自动跳转到错误页面路径
  • isErrorPage属性  设置当前jsp页面是否是错误信息页面。默认是false。如果是true可以获取异常信息
  • session属性    设置访问当前jsp页面,是否会创建HttpSession对象。默认是true
  • extends属性    设置jsp翻译出来的Java类默认继承谁

2、jsp中常用脚本 

1) 表达式脚本(常用)

  • 格式:<%=表达式%>
  • 表达式脚本的作用是:在jsp页面上输出数据
  • 表达式脚本的特点:
  1. 所有的表达式脚本都会被翻译到_jspService方法中
  2. 表达式脚本都会被翻译成out.print()输出到页面上  (即:只要被<%%>包裹起来就会输出到页面)
  3. 由于表达式脚本翻译的内容都在_jspService方法中的对象都可以直接使用
  4. 表达式脚本中的表达式不能以分号结束
<%=12%> <br />
<%=12.12%> <br/>
<%="我是字符创"%> <br/>
<%=map%> <br/>
<%=request.getParameter("username")%> <br/>

2)代码脚本

  • 格式:<% Java语句 %>
  • 作用:可以在jsp页面中,编写我们自己需要的功能(其实就是Java代码)
  • 代码脚本的特点是:
  1. 代码脚本翻译之后都在_jspService方法中
  2. 可以由多个代码脚本快组合挖按成一个完整的Java语句
  3. 代码脚本由于翻译到_jspService()方法中,所以在_jspService方法中的对象都可以直接使用
  4. 代码脚本还可以和表达式一起组合使用,在jsp页面上输出数
<%--代码脚本for语句--%>
<table border="1" cellspacing="0">
<%
for(int i=0;i<3;i++){
%>
    <tr>
        <td><%=i+1%></td>
    </tr>
<%
}
%>
</table>

<%--翻译后Java文件中_jspService方法内的代码都可以写--%>
<%
    String name = request.getParameter("name");
    System.out.println("用户请求的参数:"+name);
%>

3、jsp九大内置对象

jsp中的内置对象,是指tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象

如何找到jsp的源代码--->通过Tomcat启动后的日志查找路径

4、jsp四大域对象

四大域对象分别是:

  • pageContext             (PageContextImpl类),  当前jsp页面范围内有效
  • request      (HttpServletRequest类),  一次请求内有效
  • session      (HttpSession类),  一个会话范围内有效(打开浏览器访问服务器,知道关闭浏览器  这个过程叫会话)
  • application     (ServletContext类) 整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像Map一样存取数据的对象。四个域对象功能一样。不同的是他们对数据的存取范围

虽然四个域对象都可以存取数据。在使用上他们是有优先顺序的

从小到大的范围顺序:

pageContext --> request ---> session ---> application

scpe.jsp页面代码

<%--
  Created by IntelliJ IDEA.
  User: wufq
  Date: 2021/6/30
  Time: 10:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Scope jsp页面</title>
</head>
<body>
    <h1>scope.jsp页面</h1>
    <%
      // 往四个域内存数据
        pageContext.setAttribute("key","pageContext");
        request.setAttribute("key","request");
        session.setAttribute("key","session");
        application.setAttribute("key","application");
    %>
        pageContext域是否有值<%=pageContext.getAttribute("key")%><br>
        request域是否有值<%=request.getAttribute("key")%><br>
        session域是否有值<%=session.getAttribute("key")%><br>
        application域是否有值<%=application.getAttribute("key")%><br>

    <%
        //域名转发
        request.getRequestDispatcher("/scope2.jsp").forward(request,response);
    %>

</body>
</html>

scpe2.jsp页面代码

<%--
  Created by IntelliJ IDEA.
  User: wufq
  Date: 2021/6/30
  Time: 10:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Scope jsp页面</title>
</head>
<body>
    <h1>scope.jsp页面</h1>

        //取数据
        pageContext域是否有值<%=pageContext.getAttribute("key")%><br>
        request域是否有值<%=request.getAttribute("key")%><br>
        session域是否有值<%=session.getAttribute("key")%><br>
        application域是否有值<%=application.getAttribute("key")%><br>

</body>
</html>

5、jsp中out输出和response.getWriter输出的区别

response中表示响应,我们经常用于设置返回给客户端的 内容(输出)

out也是给用户做输出使用的

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        out.write("out输出1<br>");
        out.write("out输出2<br>");

        response.getWriter().write("response输出1<br>");
        response.getWriter().write("response输出1<br>");
    %>
</body>
</html>

上面的代码,按照正常的代码运行逻辑是先输出out打印的内容,后输出response内容,但是实际的执行结果先输出response后输出out

导致这样结果的原因是?

由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下。我们在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序

out.write()输出字符串没有问题

out.print()输出任意数据都没有问题(都转换成字符串后调用的write输出)

在jsp页面中,可以统一使用out.print()来进行输出

6、jsp的常用标签

 适用场景:一个网站一般分为三个部分,最上面一层的导航栏,中间一层是网页主体,最下面一层是联系方式等。网站会分为多层,每一层的底部都是一样的,为了防止多次修改,我们只需要引入一个公用的jsp即可

1)静态包含

<%@include file="/include/footer.jsp"%>

<%@include file""%>就是静态包含,file属性指定你要包含的jsp页面的路径(地址中的第一个斜杠 / 表示http://ip:port/工程路径/   映射到代码的web目录)

2)动态包含

    <jsp:include page="/scope2.jsp">
         <jsp:param name="username" value="root"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>

foolter.jsp文件的代码

<%= request.getParameter("username")%>

<jsp:include page=""> </jsp:include>  是动态包含

动态包含和静态包含一样,把被包含的内容执行输出到包含位置

3)jsp标签-转发

<jsp:forward page="/scope2.jsp"></jsp:forward>

请求转发标签,功能是请求转发

#案例:遍历输出多个学生信息到表格中

 students类

public class Stuents {
    private Integer id;
    private String name;
    private Integer age;
    private String phone;

stuServlet类

package com.wufq.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description
 * @Author wufq
 * @Version
 * @Date 2021/6/30 14:22
 */
public class StuServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        List<Object> stuList = new ArrayList<>();
        for(int i = 0; i <10; i++){
            int t = i+1;
            stuList.add(new Stuents(t,"name"+t,18+t,"phone"+t));
        }

//        保存查询到的学生信息到request域中
        req.setAttribute("stuList",stuList);
//        请求转发到test1.jsp页面
        req.getRequestDispatcher("/stu/test1.jsp").forward(req, resp);
    }
}

这里需要注意一点:编写servlet程序以后,一定要在web.xml文件内配置即:如上图的流程,客户端通过servlet程序访问,然后才能访问jsp文件。如果直接访问jsp文件 就会报空指针异常

test1.jsp文件

<%@ page import="java.util.List" %>
<%@ page import="com.wufq.servlet.Stuents" %><%--
  Created by IntelliJ IDEA.
  User: wufq
  Date: 2021/6/30
  Time: 14:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        table{
            border: 1px black solid;
             600px;
            border-collapse: collapse;
        }

        tr,td{
            border: 1px black solid;
        }

    </style>
</head>
<body>
    <%
        List<Stuents> stuentsList = (List<Stuents>)request.getAttribute("stuList");
    %>
    <table>
        <tr>
            <td>编号</td>
            <td>姓名</td>
            <td>年龄</td>
            <td>电话</td>
            <td>操作</td>
        </tr>
        <%for(Stuents stu:stuentsList){%>
            <tr>
                <td><%=stu.getId()%></td>
                <td><%=stu.getName()%></td>
                <td><%=stu.getAge()%></td>
                <td><%=stu.getPhone()%></td>
                <td>删除、修改</td>
            </tr>
       <%}%>
    </table>
</body>
</html>

访问:

http://localhost:8080/08_jsp/stuServlet

结果:

7、Listener监听器

7.1  ServletContextListener监听器

ServletContextListener它可以监听ServletContext对象的创建和销毁

ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁

监听到创建和销毁之后斗湖分别调用ServletContextListener监听器的方法反馈

两个方法分别是:

 

web.xml中配置

原文地址:https://www.cnblogs.com/frankruby/p/14949361.html