jsp

jsp

  • 什么是JSP

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

    特点:

    • 和HTML很类似
    • 区别
    • HTML只给用户提供静态的数据
    • JSP页面中可嵌入JAVA代码,为用户提供动态数据

JSP原理

思路:JSP如何执行的?
  • 代码层面没有任何问题

  • 服务器内部工作

    tomcat中有一个work目录;

    IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

    在本机路径为:

    ​ 方便查找:

    C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\96a76efc-b5c5-41e5-b282-b34a1a82a2fc\work\Catalina\localhost\mavenTest_war\org\apache\jsp
    

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

JSP最终会被转换为Java类。

JSP本质上就是一个Servlet

//初始化
public void _jspInit() {}
//销毁
public void _jspDestroy() {}
//Service
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {}

该页面的流程:

  1. 判断请求

  2. 内置一些对象

    final javax.servlet.jsp.PageContext pageContext;//页面上下文
    javax.servlet.http.HttpSession session = null;    //Session
    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:当前页
    HttpServletRequest request;                        //请求
    HttpServletResponse response;                    //响应
    
  3. 输出页面前添加代码

    response.setContentType("text/html");         //设置响应的页面类型      
    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访问的流程
img

在JSP页面中:

  • java代码会原封不动的输出
  • HTML代码会被转化为带标签的格式

JSP基础语法

任何语言都有自己的语法。JAVA中有。JSP作为JAVA技术的一种应用,它拥有自己的一些扩充语法。

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

JSP表达式

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

JSP脚本片段

<%  int sum=0;  
	for (int i=0;i<=100;i++)
			{    sum+=i;  }  
    out.println("<h1>Sum="+sum+"</h1>");
 %>

脚本片段的再实现:代码最后都会编译到同一个方法中

JSP声明

<%!
    static {
        System.out.println("loading Servlet");
    }
    private int g=0;
    public void ruan(){
        System.out.println("进入方法ruan()");
    }
%>

JSP声明会被编译到JSP生成的JAVA类中,而其他会被生成到_jspService方法中。

在JSP中嵌入JAVA代码即可。

<%%> 
<%=%>  JSP表达式
<%!%>   JSP声明
<%--注释--%>

jsp的注释不会再客户端显示,但HTML会。

JSP指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page errorPage="error/500.jsp" %>
<%--显示地什么这是个错误页面--%>
<%@ page isErrorPage="false" %>
<%@ page pageEncoding="utf-8" %>

或者在web.xml中

<error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>

JSP标签

<jsp:include page="header.jsp"/>
<h2>网页主体2</h2>
<jsp:include page="footer.jsp"/>

JSP标签引入与JSP指令引入的不同之处:

JSP标签

  • 语法
    <%@include file="header.jsp"%>    
    <h2>网页主体1</h2>    
    <%@include file="footer.jsp"%>
  • 特点:编译成xxx_jsp.java后将引入的页面直接嵌入到_jspService方法中,与原页面有变量冲突的风险

JSP指令(推荐)

  • 语法
    <jsp:include page="header.jsp"/>    
    <h2>网页主体2</h2>    
    <jsp:include page="footer.jsp"/>
  • 特点:编译成xxx_jsp.java后将引入的页面通过java代码的方式引入,并出现在_jspService方法中。

    Java代码如下:

    org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "header.jsp", out, false);
    

内置对象

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 用户得到用户请求
response javax.servlet.http.HttpServletResponse 服务器给客户端响应消息
config javax.servlet.ServletConfig 服务器配置,获取初始化参数。
session javax.servlet.http.HttpSession 用于保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 页面转换为Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP页面容器
exception java.lang.Throwable JSP页面发生的异常,在错误页才起作用
<%
    pageContext.setAttribute("name1","name_1");//数据只在一个页面中有效
    request.setAttribute("name2","name_2");//数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","name_3");//在一次会话有效,直至关闭浏览器
    application.setAttribute("name4","name_4");//在服务器未关闭前都有效
%>

request:客户端向服务器发送请求,产生的数据,用户看完了就没用了。例如:新闻

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用。例如:购物车

application:客户端向服务器发送请求,产生的数据,一个用户填完了,其他用户还可能使用。例如:聊天数据

双亲委派机制

当某个类加载器需要加载某个,class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,它自己才会加载这个类

  • 简言之就是:将类的加载交给顶层加载器来执行,这样当类(包含包名)重名时,永远都只会加载官方类。

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

EL表达式:${}

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

JSP标签

<jsp:forward page="jsptag_02.jsp">   <%-- 转发页面 --%>
    <jsp:param name="name" value="saxon"/>    
    <jsp:param name="age" value="20"/>
</jsp:forward>

<%-- 取数据--%>
<%=request.getParameter("name") %>
<%=request.getParameter("age") %>

JSTL标签库

JSTL标签库的使用就是为了弥补HTML标签的不足,自定义了许多标签,可供我们使用,标签功能与JAVA代码一样。

核心标签

格式化标签

SQL标签

c:if

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="" method="get">
    <%--
        EL表达式获取表单中的数据
        ${param.参数名}
    --%>
    <input type="text"  name="username" value="${param.username}">
    <input type="submit" name="submit" value="登录">
</form>
<c:if test="${param.username}=='ssw'" var="isAdmin">
    <c:out value="Welcome!"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>

c:choose

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:set var="score" value="85" ></c:set>
<c:choose>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score<=90&&score>=70}">
        你的成绩为一般
    </c:when>
    <c:when test="${score<70}">
        你的成绩为垃圾
    </c:when>
</c:choose>
</body>
</html>

c:foreach

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/5/26
  Time: 9:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="" method="get">
    <%--
        EL表达式获取表单中的数据
        ${param.参数名}
    --%>
    <input type="text"  name="username" value="${param.username}">
    <input type="submit" name="submit" value="登录">
</form>

<c:if test="${param.username}=='ssw'" var="isAdmin">
    <c:out value="Welcome!"/>
</c:if>
</body>
</html>
posted @ 2021-05-26 16:10  saxon宋  阅读(56)  评论(0)    收藏  举报