• JavaWeb --JSP详解


    前言

    • Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件。
    • 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会在案例中根据不同的需求引入。
    • 首先了解javaWeb的整个技术体系,掌握常用的技术知识点。

    8、JSP

    8.1、什么是JSP

    JavaServletPages: Java服务器端页面,也和Serlvet一样,用于动态web技术

    最大的特点:

    • 写JSP就像写HTML
    • 区别:
      • HTML只给用户提供静态的数据
      • JSP页面中可以嵌入Java代码,为用户提供动态数据

    8.2、JSP原理

    思路:JSP到底是怎么执行的

    • 代码层面没有任何问题

    • 服务器内部工作

      ​ Tomcat中有一个work目录:

      ​ idea中使用Tomcat会在idea的Tomcat中产生一个work目录

    • 发现页面变成了Java程序

    JSP最终也会被转成一个java类

    JSP本质上就是一个Servlet

    浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet

    1.判断请求

    2.内置一些对象

    1. final javax.servlet.jsp.Pagecontext pagecontext;
    2. //页面上下文
    3. javax.servlet.http.Httpsession session null;
    4. //session
    5. final javax.servlet.Servletcontext application;
    6. //applicationContext
    7. final javax.servlet.servletconfig config;
    8. //config
    9. javax.servlet.jsp.Jspwriter out null;
    10. //out
    11. final java.lang.object page this;
    12. //page:当前
    13. HttpservletRequest request
    14. //请求
    15. HttpservletResponse response
    16. //响应

    3.输出页面前增加的代码

    1. response.setcontentType("text/htm1");
    2. //设望响应的页面类型
    3. pagecontext = _jspxFactory.getPagecontext(this,request,response,
    4. null,true,8192,true);
    5. _jspx_page_context = pagecontext;
    6. application = pagecontext.getservletcontext();
    7. config = pagecontext.getservletconfig();
    8. session = pagecontext,getsession();
    9. out = pagecontext.getout();
    10. _jspx_out=out;

    以上的这些对象我们可以在JSP页面上直接使用

    在JSP页面中,只要是Java代码就会原封不动的输出

    如果是HTML代码就会被转换为:

    out.write("\n");
    

    这样的格式输出到前端

    8.3、JSP基础语法

    任何语言都有自己的语法,Java中有;JSP作为Java技术的一种应用,他拥有一些自己的扩充语法,Java所有的语法都支持

    JSP表达式

    1. <%--JSP表达式
    2. 作用:用来将程序的输出,输出到客户端
    3. <%= new 变量或者表达式%>
    4. --%>
    5. <%= new java.util.Date()%>

    JSP脚本片段

    1. <%--jsp 脚本片段 --%>
    2. <%
    3. int sum = 0;
    4. for (int i = 1; i <= 100; i++) {
    5. sum+=i;
    6. }
    7. out.println("

      Sum="+sum+"

      "
      );
    8. %>

    脚本片段的再实现

    1. <%
    2. int x = 10;
    3. out.println(x);
    4. %>
    5. 这是一个jsp文档

    6. <%
    7. int y = 20;
    8. out.println(2);
    9. %>

    10. <%--在代码中嵌入HTML元素 --%>
    11. <%
    12. for (int i = 0; i < 5; i++) {
    13. %>
    14. hello world <%=i%>

    15. <%
    16. }
    17. %>

    JSP声明

    1. <%!
    2. static {
    3. System.out.println("Loading Servlet!");
    4. }
    5. private int global = 0;
    6. public void qjd(){
    7. System.out.println("进入了方法qjd");
    8. }
    9. %>

    JSP声明:(<%!%>)会被编译到JSP生成的Java类中!其他的(<%%>)就会被生成到jspService 方法中

    在JSP中嵌入Java代码

    1. <%----%> 注释
    2. <%%> 片段
    3. <%=%> 表达式输出一个值
    4. <%!%> 全局
    5. ${} el表达式

    JSP的注释(<%----%>)不会在客户端显示,HTML()就会

    8.4、JSP指令

    1. <%@page args...%>
    2. <%@ include file="" %>

    1.定制错误页面<%@page args...%>

    jsp2.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%--定制错误页面(可以在这个jsp中引入也可以在web.xml 中配置)--%>
    3. <%@ page errorPage="error/500.jsp" %>
    4. Title
    5. <%
    6. int x = 1/0;
    7. %>

    如果在web.xml中配置

    1. 500
    2. /error/500.jsp

    500.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. "../img/500.png" alt="500">

    测试

    500错误:

    404错误:

    2.共用部分<%@ include file="" %>

    1. Title
    2. <%--方法一@ include会将三个页面合三为一--%>
    3. <%@ include file="common/header.jsp" %>
    4. 网页主体

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

    6. <%--方法二jsp标签
    7. jsp:include:拼接页面,本质还是3
    8. --%>
    9. "/common/header.jsp">
    10. 网页主体

    11. "/common/footer.jsp">

    测试

    8.5、九大内置对象

    • PageContext (存东西)
    • Request (存东西)
    • Response
    • Session (存东西)
    • Application 【ServletContext】(存东西)
    • config 【ServletConfig】
    • out
    • page
    • exception

    重点对象理解:

    request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
    session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
    application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数
    据;

    具体实现:

    • 通过pageContext寻找的方式取出我们保存的值

    pageContextDemon01.jsp(在一个页面取值)

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%--内置对象--%>
    4. <%
    5. pageContext.setAttribute("name1","张三1");//保存的数据只在一个页面中有效
    6. request.setAttribute("name2","张三2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    7. session.setAttribute("name3","张三3");//保存的数据只在一次会话中有效,打开到关闭浏览器
    8. application.setAttribute("name4","张三4");//保存的数据在服务器中有效,打开到关闭服务器
    9. %>
    10. <%
    11. //通过pageContext寻找的方式取出我们保存的值
    12. //从底层到高层(作用域): page->request->session->application->找不到
    13. //JVM:双亲委派机制 应用->扩展类->rt.jar
    14. String name1 =(String) pageContext.findAttribute("name1");
    15. String name2 =(String) pageContext.findAttribute("name2");
    16. String name3 =(String) pageContext.findAttribute("name3");
    17. String name4 =(String) pageContext.findAttribute("name4");
    18. String name5 =(String) pageContext.findAttribute("name5");//不存在
    19. %>
    20. <%--使用el表达式输出 ${}--%>
    21. 取出的值为:

    22. ${name1}

    23. ${name2}

    24. ${name3}

    25. ${name4}

    26. ${name5}

    pageDemon02.jsp(在另一个页面取值)

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. <%--在另一个页面取pageContextDemon01.jsp中的值只能取到34
    4. 如果 request请求转发就可以取出来
    5. --%>
    6. <%
    7. //通过pageContext寻找的方式取出我们保存的值
    8. //从底层到高层(作用域)
    9. String name1 =(String) pageContext.findAttribute("name1");
    10. String name2 =(String) pageContext.findAttribute("name2");
    11. String name3 =(String) pageContext.findAttribute("name3");
    12. String name4 =(String) pageContext.findAttribute("name4");
    13. String name5 =(String) pageContext.findAttribute("name5");//不存在
    14. %>
    15. <%--使用el表达式输出 ${}--%>
    16. 取出的值为:

    17. ${name1}

    18. ${name2}

    19. ${name3}

    20. ${name4}

    21. ${name5}

    手动修改作用域与请求转发

    1. //手动修改作用域,第三个参数为作用域
    2. pageContext.setAttribute("hello","hello1",PageContext.SESSION_SCOPE);//等价于 session.setAttribute("hello","hello1");
    3. <%
    4. //请求转发
    5. pageContext.forward("/index.jsp");
    6. //等价于 request.getRequestDispatcher("/index.jsp").forward(request,response);
    7. %>

    8.6、JSP标签、JSTL标签、EL表达式

    1. javax.servlet.jsp.jstl
    2. jstl-api
    3. 1.2
    4. taglibs
    5. standard
    6. 1.1.2

    EL表达式:${}

    • 获取数据
    • 执行运算
    • 获取web开发的常用对象

    JSP标签

    1. <%--jsp:include --%>
    2. 1

    3. <%--转发时添加数据--%>
    4. "/jsptag2.jsp">
    5. "name" value="ikun"/>
    6. "age" value="23"/>
    7. <%--取出参数--%>
    8. 名字:<%=request.getParameter("name")%>
    9. 年龄:<%=request.getParameter("age")%>

    JSTL表达式

    JSTL标签库的使用就是为了弥补html标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样

    • 核心标签(掌握部分)

    • 格式化标签

    • SQL标签

    • XML标签

    JSTL标签库使用步骤:

    • 引入对应的taglib
    • 使用其中的方法
    • 在Tomcat也需要导入jstl的包。否则会报错:jstl解析错误

    c:if:

    1. <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
    2. Title
    3. if测试


    4. "coreif.jsp" method="get">
    5. <%--el表达式获取表单中的数据
    6. ${param.参数名}
    7. --%>
    8. "text" name="username" value="${param.username}">
    9. "submit" value="登录">
    10. <%--判断如果提交的用户名是管理员则登录成功--%>
    11. if test="${param.username == 'admin'}" var="isAdmin">
    12. "管理员进入">
    13. if>
    14. "${isAdmin}">

    c:choose:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%--引入jstl核心标签库--%>
    3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    4. <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
    5. Title
    6. <%--定义一个标量scroe,值为99--%>
    7. var="score" value="99"/>
    8. "${score>=95}">
    9. 你的成绩为优秀
    10. "${score>=80}">
    11. 你的成绩为良好
    12. "${score>=70}">
    13. 你的成绩为一般
    14. "${score<60}">
    15. 你的成绩为不及格

    c:forEach:

    1. <%@ page import="java.util.ArrayList" %>
    2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    3. <%--引入jstl核心标签库--%>
    4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    5. <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
    6. Title
    7. <%
    8. ArrayList people = new ArrayList<>();
    9. people.add(0,"张三");
    10. people.add(1,"李四");
    11. people.add(2,"王五");
    12. people.add(3,"赵六");
    13. people.add(4,"田七");
    14. request.setAttribute("list",people);
    15. %>
    16. <%--var:每一次遍历出来的变量
    17. items:要遍历的对象
    18. begin:开始
    19. end:结束
    20. step:步长
    21. --%>
    22. var="people" items="${list}">
    23. "${people}">

  • 相关阅读:
    01-大语言模型发展
    机器学习基础之《回归与聚类算法(2)—欠拟合与过拟合》
    Java面向对象8——抽象类和抽象方法(知识点+使用方法)
    【web前端】web前端设计入门到实战第一弹——html基础精华
    最长偶串的长度
    深入解析 MySQL binlog
    redis的常用基础类型及操作
    计算机毕业设计 JSPM校园闲置物品交易平台的设计与实现 Java实战项目 附源码+文档+视频讲解
    如何写好一篇学术论文
    化工机械基础复习要点
  • 原文地址:https://blog.csdn.net/guanshengg/article/details/126316668