Java Server Pages(JSP) 学习笔记

1 什么是JSP

Java Server Pages(Java服务器端页面),也和Servlet一样用于开发动态Web。
最大的特点:

  • 写JSP就像在写HTML
  • HTML只提供静态数据
  • JSP中可以嵌入JAVA代码,为客户提供动态数据

2 JSP原理

JSP是怎么执行的?

  • 代码层面没有问题
  • 服务器内部工作
    Tomcat中有一个work目录
    IDEA中使用Tomcat的会在IDEA的Tomcat中也创建一个work目录
    在这里插入图片描述
    电脑中的地址:C:\Users\用户名\.IntelliJIdea2017.3\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\cookie01\org\apache\jsp
    发现页面转变为了Java程序!
    在这里插入图片描述
    浏览器向服务器发出请求,不管是访问什么资源,都是在访问Servlet,JSP最终也会被转换为一个Java类
    JSP本质上是一个Servlet
    在JSP中只要是Java代码,就会原封不动输出
    如果是Html代码,就会被转换为一行行的out.write("\r\n");
    在这里插入图片描述

源码解析:

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
	//判断请求类型
    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;
      }
    }
	//内置一些对象
    final javax.servlet.jsp.PageContext pageContext;//页面上下文
    javax.servlet.http.HttpSession session = null;
    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;//当前页
    javax.servlet.jsp.JspWriter _jspx_out = null;//
    javax.servlet.jsp.PageContext _jspx_page_context = null;
	//输出
    try {
      //输出页面前的一些操作
      response.setContentType("text/html;charset=UTF-8");//设置响应的页面类型
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      //以上的这些对象,可以在jsp页面中直接使用!
      //输出页面
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Hello</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("    <h3>Hello</h3>\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

3 JSP基础语法

任何语言都有自己的语法,JSP相较于JAVA有自己一些扩充的语法,JAVA所有语法都支持。
JSP表达式:

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

JSP脚本片段:

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

脚本片段的再实现:

  <%--在代码中嵌入HTML元素--%>
  <%
      for (int i = 0; i < 5; i++) {
  %>
    <h1>Hello,World! <%= i %></h1>
  <%
      }
  %>

JSP声明:
会被编译到JSP生成的Java的类中,其他的生成到_jspService方法中!
在JSP中嵌入Java代码

  <%--全局变量--%>
  <%! static {
      System.out.println("Servlet加载中~");
  }
  private int globalvar = 0;
  public void jspInit(){
      System.out.println("进入初始化方法~");
  }
  %>

4 JSP指令

<%--@ page 后跟参数类型和定义--%>
<%@ page ... %>
<%@ page errorPage="error/500.jsp" %>
<%--将两个页面合并--%>
<%@ include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@ include file="common/footer.jsp"%>
<hr>
<%--jsp标签--%>
<%--通过静态资源获取,拼接页面,本质还是三个--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>

5 JSP九大内置对象

  • PageContext
  • Request 存东西
  • Response 存东西
  • Session 存东西
  • Application【ServletContext】存东西
  • config 【ServletConfig】
  • out
  • page
  • exception
<%--内置对象--%>
<%
    pageContext.setAttribute("name1","明夜1");//保存的数据只在一个页面中有效
    request.setAttribute("name2","明夜2");//保存的数据只在一次请求中有效,转发会携带
    session.setAttribute("name3","明夜3");//保存的数据只在一个session中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","明夜4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
%>

request:客户端向服务器发送的请求,产生的数据只需要取一次,用完就没用了。
session:产生的数据用户用完,可能还需要再次取到。
application:产生的数据用户用完,其他用户还能用,比如聊天记录

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

需要引入以下依赖:

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取Web开发常用对象
    JSP标签:
    <jsp:forward page="jsptag2.jsp">
        <jsp:param name="name" value="mingye"></jsp:param>
        <jsp:param name="age" value="21"></jsp:param>
    </jsp:forward>

JSTL标签:

  1. 引入对应的taglib
  2. 使用其中的方法
  3. 在Tomcat中导入对应的包
<form action="coreif.jsp" method="get">
    <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:out>
</c:if>
<c:out value="${isAdmin}"></c:out>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值