• JSP学习日记


    JSP简述

    Java Sever Pages----->Java服务器界面 用于前后端结合

    jsp为什么淘汰?

    由于JSP的前后端耦合性极高,编写代码非常臃肿。前后端的代码放在一起,所以JSP可以看成是已经被淘汰的技术。

    为什么还要学jsp?

    由于一些公司的项目较老,更新换代成本较高,只能选择不断维护。而维护的同时就需要用到jsp老知识
    JSP在编译后也是一个和Java文件,并且会生成class文件,可以打开Tome cat 指定路径查看:

    D:\simon\tools\Tomcat\apache-tomcat-8.5.20\work\Catalina\localhost\ROOT\org\apache\jsp
    在这里插入图片描述
    由此可以得出:

    JSP本质上就是一个Servlet

    JSP生成Java文件剖析

    下面是JSP文件编译后生成的Java文件

    // 类声明定义
    public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent,
    org.apache.jasper.runtime.JspSourceImports {
    
    • 1
    • 2
    • 3

    可以看出 index_jsp继承了HttpJspBase类,继续向上找,发现HttpJspBase继承了JspPage,JspPage继承了Servlet

    public interface HttpJspPage extends JspPage {
    public interface JspPage extends Servlet {
    
    • 1
    • 2

    所以说JSP就是一个Servlet

    JSP语法

    
    <%-- JSP注释 --%>
    
    • 1
    • 2

    JSP声明语句: <%!%>
    特点:定义全局变量,可以声明方法、类、支持任意Java数据类型

    
    <%! 
        String str = "全局变量";
        static{
        System.out.println("静态代码块");
    } %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    JSP表达式:<%=%>
    特点:常用于输出内容、插入表达式

    
    
    • 1

    JSP脚本程序:<%%>
    特点:定义局部变量、编写语句 不能定义方法 也可输出内容

    <% for (int i = 0; i < 10; i++) { %>
    

    HELLO WORLD <%= i %>

    <% } %>
    • 1
    • 2
    • 3

    注释:

    
    <%-- JSP代码注释 --%>
    区别:在网页中查看源代码时:jsp注释不会显示,但HTML注释会显示
    
    • 1
    • 2
    • 3

    JSP指令

    Page

    1. 定制错误页面
    <%-- 头文件page 声明了页面类型  编码集  语言等 --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%-- 显示声明这个是一个错误界面 --%>
    <%@ page isErrorPage="true" %> 
    <%-- 错误页面也可以在web.xml中声明 如下: --%>
    
        
            404
            /error/404.jsp
        
        
            500
            /error/500.jsp
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 其他指令如:autoFlush:是否被刷新 import : 导包 …

    include

    <%-- 提取公共页面   例如网页的头部尾部导航栏 --%>
    <%@ include file="./beInclude.jsp" %>
    
    
    
    <%--  也可以用jsp标签提取公共页  --%>
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    taglib

    标签库 引入:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    JSP的内置对象

    在第一次访问jsp网页时,会由服务器将该jsp文件转换为Java文件并生成字节码文件,在生成的Java文件中会包含经常使用的一些内置对象

    // 如下所示
    final javax.servlet.jsp.PageContext pageContext; // 上下文
    final javax.servlet.ServletContext application;// 存储数据
    final javax.servlet.ServletConfig config; // 配置信息
    javax.servlet.jsp.JspWriter out = null;  // 输出
    final java.lang.Object page = this;   // 当前页面
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
    // 除此之外 还包含了
    HttpRequest req  // 请求
    HttpResponse resp  // 响应
    Execption // 异常错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    九大内置对象

    1. PageContext // 可以访问所有的jsp内置对象
    // 常用
    pageContetx.getRequest()//返回当前页面中的request对象。
    pageContetx.getResponse()//使用此方法将返回当前页面中的response对象。
    pageContetx.getPage()//此方法返回当前页面中的page对象。
    pageContetx.getSession()//返回当前页面中的session对象。
    pageContetx.getOut()//返回当前页面中的out对象。
    pageContetx.setAttribute(String name)//给指定的属性名设置属性值。
    pageContetx.getAttribute(String name)//根据属性名称找到相应的属性值。
    pageContetx.findAttribute(String name)//寻找一个属性并返回,如果没有找到则返回一个null。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. Request // 请求
    request.setAttribute(String name,Object value) //储存此请求中的属性
    request.getAttribute(String name) //返回指定属性的属性值
    request.getParameter(String name) //返回name指定参数的参数值
    request.getParameterValues(String name) //返回包含参数name的所有值的数组
    
    • 1
    • 2
    • 3
    • 4
    1. Response
    response.getCharacterEncoding() //返回响应用的是何种字符编码
    response.getWriter() //返回可以向客户端输出字符的一个对象
    response.sendRedirect(java.lang.String location) //重新定向客户端的请求
    
    • 1
    • 2
    • 3
    1. Session
    session.getId()//返回session的ID号
    session. setAttribute(String name,Object value)//将value值存在session域中,名字为name
    session.getAttribute(String name)//返回与此会话中的指定名称绑定在一起的值,如果没有值绑定在该名称下,则返回null
    session.invalidate()//销毁session
    
    • 1
    • 2
    • 3
    • 4
    1. out
    2. aplication
    application.setAttribute(key,value)//设置应用对象中指定名字的属性值
    application.getAttribute(key)//获取应用对象中指定名字的属性值
    application.getAttributeNames()//获取应用对象中所有属性的名字 枚举
    
    • 1
    • 2
    • 3
    1. config
    2. Page
    3. execption

    pageContext.setAttribute的作用域

    // 只在一个网页中有效
    pageContext.setAttribute("name1","张一");
    // 只在一个请求中有效  请求转发时将会携带
    request.setAttribute("name2","张二");
    // 在一次会话中均可读取  打开浏览器到关闭浏览器
    session.setAttribute("name3","张三");
    // 在服务器中有效  从打开服务器到关闭服务器
    application.setAttribute("name4","张四");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用场景:

    1. request: 客户端向服务端请求的数据,用过之后即销毁。再次请求需要重新加载----> 新闻
    2. Session : 用户向服务器请求得到的数据需要保存,后续还会使用 购物车
    3. application: 用户向服务器发送请求,使用该数据,使用完毕后还可以给其他用户使用

    JSP标签

    1. 
          
          
        
      <%-- 在另一jsp中获取 --%>
      姓名:<%= request.getParameter("name")%>
      年龄:<%= request.getParameter("age")%>
      // 注意处理编码问题
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    EL表达式

    全称 Express Language

    • 获取数据
      按照域对象从小到大进行获取,依次是:
      pageContext < request < Session < application

    • 执行运算

    • 获取Web

    <%
        pageContext.setAttribute("name","张三");
        request.setAttribute("name","张四");
        session.setAttribute("name","张五");
        application.setAttribute("name","张六");
        List<String> list = new ArrayList<>();
        list.add(0,"张三");
        list.add(1,"张四");
        list.add(2,"张五");
        list.add(3,"张六");
        list.add(4,"张七");
        request.setAttribute("list",list);
    %>
    <pre>
      获取pageContext作用域中的name: ${pageScope.name}
      获取request作用域中的name: ${requestScope.name}
      获取session作用域中的name: ${sessionScope.name}
      获取application作用域中的name: ${applicationScope.name}
        获取集合指定索引的数据:${list[0]} ${list[4]}
    <%--  张三 和  张七  --%>
        获取集合长度:${list.size()}
    </pre>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    【C语言程序设计】实验 3
    mysq索引
    基于SpringBoot的图书商城系统
    工业控制系统的安全建议
    如何查找文献,如何阅读文献
    主从复制和读写分离
    leetcode201 Bitwise AND of Numbers Range
    Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题
    ABB机器人切割铣削钻孔自动化加工应用
    042:mapboxGL点击某feature点,使其为中心点
  • 原文地址:https://blog.csdn.net/yuqu1028/article/details/128055659