JavaWeb-JSP

一、JSP

1.1、什么是 JSP

Java Server Pages:Java服务器端页面,也和 Servlet一样,用于动态 Web技术!

最大的特点:

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

1.2、JSP原理

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

  • 代码层面没有任何问题
  • 服务器内部工作
    • Tomcat 中有一个 work目录;

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

JSP最终也会被转换成为一个 Java类!

JSP本质上就是一个 Servlet。

JSP被解析成 Java的源代码分析:

  • 路径:
    • apache-tomcat-9.0.41\work\Catalina\localhost\ROOT\org\apache\jsp
// 初始化
public void _jspInit() {
}

// 销毁
public void _jspDestroy() {
}

// JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response){}

_jspService()方法功能分析:

  1. 判断请求

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }
    }
    
  2. 内置一些对象

    final javax.servlet.jsp.PageContext pageContext;    // 页面上下文
    final javax.servlet.ServletContext application;     // applicationContext
    final javax.servlet.ServletConfig config;           // config
    javax.servlet.jsp.JspWriter out = null;             // out
    final java.lang.Object page = this;                 // page:当前页
    
    final javax.servlet.http.HttpServletRequest request     // 请求
    final javax.servlet.http.HttpServletResponse response   // 响应
    
  3. 输出页面前增加的代码

      response.setContentType("text/html; charset=UTF-8");          // 设置响应的页面类型
      pageContext = _jspxFactory.getPageContext(this, request, response,null, false, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      out = pageContext.getOut();
      _jspx_out = out;
    
  4. 以上的这些个对象我们可以在 JSP页面中直接使用!

用户访问 Servlet上的 JSP页面流程:

Aa

Java代码中的 JSP:

  • 在 JSP页面中;

  • 只要是 Java代码就会原封不动的输出;

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

    // 被转换成这样的格式,输出到前端
    out.write("</h1>\r\n");
    

1.3、JSP基础语法

任何语言都有自己的语法,JAVA中有。JSP 作为 Java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!

JSP的基础使用:

  1. JSP基础格式

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
        <head>
            <title>$Title$</title>
        </head>
        <body>
            
        </body>
    </html>
    
  2. JSP表达式

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
        <head>
            <title>$Title$</title>
        </head>
        <body>
    
            <%-- JSP表达式
            作用:用来将程序的输出,输出到客户端
            格式:<%= 变量或者表达式 %>
            --%>
            <%= new java.util.Date()%>
    
        </body>
    </html>
    
  3. jsp脚本片段

    <%-- JSP脚本片段 --%>
    <%
        int sum = 0;
        for (int i = 1; i <= 100; i++){
            sum += i;
        }
        out.println("<h1>Sum="+sum+"</h1>");
    %>
    
  4. jsp脚本片段再使用

    <%
        int x = 10;
        out.println(x);
    %>
    <p>这是一个 JSP文档 <p>
    <%
        int y = 2;
        out.println(y);
    %>
    
    <hr>
    
    <%-- 在代码嵌入 HTML元素 --%>
    <% for (int i = 0; i < 5; i++){
    %>
        <h1>Hello,World <%= i %> </h1>
    <%
    }
    %>
    
  5. JSP声明

    <%!
        static{
            System.out.println("Loading Servlet!");
        }
    
        private int globalVar = 0;
    
        public void kuang(){
            System.out.println("进入了方法 Kuang!");
        }
    %>
    

    JSP声明:会被编译到 JSP生成 Java的类中!其他的,就会被生成到 _jspService方法中!

  6. <% %> 的使用

    <% %>   <%-- 片段 --%>
    <%= %>  <%-- 表达式 --%>
    <%! %>  <%-- 全局定义 --%>
    <%-- --%>   <%-- 注释 --%>
    <%@ %>  <%-- JSP指令 --%>
    

    JSP的注释,不会在客户端显示,HTML就会!

1.4、JSP指令

Aa

  1. page 指令的使用

    <%-- JSP定制错误页面 --%>
    <%@ page errorPage="error/500.jsp" %>
    
    <%-- web.xml定制错误页面 --%>
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    
  2. include 指令的使用

    <%-- @include 会将两个页面和二为一 --%>
    <%@include file="common/header.jsp" %>
    <h1>网页主题1</h1>
    <%@include file="common/footer.jsp" %>
    
    
    <%--JSP标签
    jsp:include:拼接页面,本质还是三个
    %>
    <jsp:include page="common/header.jsp" />
    <h1>网页主题2</h1>
    <jsp:include page="common/footer.jsp" />
    

1.5、9大内置对象

  1. PageContext 存东西
  2. Request 存东西
  3. Response
  4. Session 存东西
  5. Application 【SerlvetContext】 存东西
  6. config 【SerlvetConfig】
  7. out
  8. page 不用了解
  9. exception
<body>

<%-- 内置对象 --%>
<%
    pageContext.setAttribute("name1", "秦疆1号");   // 保存的数据只在一个页面中有效
    request.setAttribute("name2", "秦疆2号");   // 保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3", "秦疆3号");   // 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4", "秦疆4号");   // 保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>


<%
    // 通过 pageContext取出我们保存的值
    pageContext.getAttribute("name1");

    // 从底层到高层(作用域):page --> request --> session --> application
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");
%>

<%-- 使用EL表达式输出:${} --%>

<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>

<%-- 普通方法会输出 null --%>
<h3><%= name5 %></h3>

</body>

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

1.6.1、EL表达式

  • EL表达式:${}
    • 获取数据
    • 执行运算
    • 获取 Web开发的常用对象

1.6.2、JSP标签

<%--jsp:include:拼接页面,本质还是三个%>
<jsp:include page="common/header.jsp" />
<h1>网页主题2</h1>
<jsp:include page="common/footer.jsp" />

------------------------------------------------

<%-- 跳转使用标签携带参数 --%>
<jsp:forward page="/jsptag2.jsp">
    <jsp:param value="kuangshen" name="name"/>
    <jsp:param value="12" name="age"/>
</jsp:forward>

<%-- 第二个页面--%>
    <%-- 取出参数 --%>
姓名:<%=request.getParameter("name") %>
年龄:<%=request.getParameter("age") %>

1.6.3、JSTL表达式

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

  1. 核心标签(掌握部分)

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

  2. 格式化标签

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

  3. SQL标签

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

  4. XML标签

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

  5. JSTL标签库使用步骤

    • 引入对应的 taglib
    • 使用其中的方法
    • 在 Tomcat中也需要引入 jstl的包,否则会报错:JSTL解析错误。
  6. 参考资料:

    菜鸟教程:https://www.runoob.com/jsp/jsp-jstl.html

  7. 代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <html>
    <head>
        <title>Insert title here</title>
    </head>
    <body>
    
    <h4>if测试</h4>
    <hr>
    <form action="coreif.jsp" method="get">
        <%-- 
        EL表达式获取表单中的数据
        --%>
        <input type="text" name="username" value"${param.username}">
        <input type="submit" value="登录">
    </form>
    
    <%-- 判断如果提交的用户名是管理员,则登录成功 --%>
    <c:if test="${param.username=='admin'}" var="isAdmin">
        <c:out value="管理员欢迎您" />
    </c:if>
    
    <%-- 自闭合标签 --%>
    <c:out value="${isAdmin}" />
    
    ----------------------------------------------------------------------
    
    <%-- 定义一个变量 score,值为85 --%>
    <c:set var="score" value="88" />
    
    <c:choose>
        <c:when test="${score>=90}" >
            你的成绩为优秀
        </c:when>
        <c:when test="${score>=80}" >
            你的成绩为一般
        </c:when>
        <c:when test="${score>=70}" >
            你的成绩为良好
        </c:when>
        <c:when test="${score<=60}" >
            你的成绩为不及格
        </c:when>
    </c:choose>
    
    ----------------------------------------------------------------------
    
    <%
        ArrayList<String> people = new ArrayList<String>();
        people.add(0, "张三");
        people.add(1, "李四");
        people.add(2, "王五");
        people.add(3, "赵六");
        people.add(4, "田七");
        request.setAttribute("list", people);
    %>
    
    <%--
    var,每次遍历出来的变量
    items,要遍历的对象
    begin,哪里开始
    end,到哪里
    step,步长
    --%>
    <c:forEach var="people" items="${list}">
        <c:out value="${people}" /> <br>
    </c:forEach>
    
    <hr>
    
    <c:forEach var="people" items="${list}" begin="1" end="3" step="2">
        <c:out value="${people}" /> <br>
    </c:forEach>
    
    </body>
    </html>
    
posted @ 2021-02-21 09:36    阅读(55)  评论(0)    收藏  举报