• 【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中配置

  • 相关阅读:
    Linux 安装 iptables防火墙
    CentOS最常用命令及快捷键整理
    WebAPI 和 webservice接口
    Linux 文件权限
    Linux查看系统信息的一些命令及查看已安装软件包的命令
    navicat连接虚拟机(centos)中的mysql
    Nmap扫描与Tcpdump抓包分析
    python 识别验证码自动登陆
    iptables开通某些端口
    hive的安装和使用
  • 原文地址:https://www.cnblogs.com/frankruby/p/14949361.html
Copyright © 2020-2023  润新知