Loading

Java之JSP

JSP

JSP简介

JSP指的是 JavaServerPages ,Java服务器端页面,也和Servlet一样,用来开发动态web

JSP页面中可以嵌入java代码为用户提供动态数据

JSP原理

JSP是如何执行的?浏览器在访问java资源其实访问的都是Servlet

JSP最终也会被转换为一个java类,JSP一般会继承HttpJspBase而HttpJspBase继承了HttpServlet,所以Jsp本质上也是个Servlet

public void _jspInit() {}			//初始化

public void _jspDestroy() {}	//销毁

public void _jspService(HttpServletRequest request, HttpServletResponse response)		//响应

在IDEA中的tomcat的index_jsp.java文件内中大致有如下内容

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, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
        return;
      }

2、初始化9个内置对象

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;									//当前页面
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
HttpServletRequest request													//请求
HttpServletResponse response												//响应

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

对内置类对象赋值。以下对象可以在jsp页面内直接使用

response.setContentType("text/html");							//设置contentype
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文件中<% %>内可以写java代码,在<% %> java代码会原封不动的输出,如果是html代码会被out.write("html代码")这种形式进行输出最终一起构造成了jsp页面。

其实JSP中的内容大致就是java代码,内置了9个对象方便我们调用,然后加上out.write()中输出html代码,两者合在一起构造一个jsp文件,并且可以实现动态的与服务器端进行交互。

JSP基础语法

1、JSP表达式

<%= 变量或表达式%>当然这里也可以用EL表达式${变量或表达式}将其值取出。

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

2、JSP脚本片段

<% 脚本片段 %>

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

3、在代码中嵌入html元素

<%--在代码中嵌入html元素--%>
<%
    for (int i = 0; i < 5; i++) {


%>
<h3>Hello,JSP <%=i%></h3>
<%
    }
%>

JSP声明 <%! >

<%!
    static {
        System.out.println("静态代码块");
    }
    
    private String globalVal = "Zh1z3ven";

    public void zh1z3ven(){
        System.out.println("进入了方法" + globalVal);
    }
%>

JSP声明会被编译到JSP生成饿Java类中。而上面其他三种会被生成到_jspService()方法中。

JSP指令 <%@ %>

JSP常用指令:如上图 基本就三个

<%@ page errorPage="/error/500.jsp" %>		//指向自定义的报错页面
<%@ page isErrorPage="true" %>						//是否为错误页面
<%@ include file="common/header.jsp"%>		//在该位置包含jsp文件
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  //导入JSTL核心标签库

自定义错误页面

<%@ page errorPage="/error/500.jsp" %>		//指向自定义的报错页面
<%@ page isErrorPage="true" %>						//是否为错误页面

Web.xml

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

包含文件

指令形式:

<%@ include file="common/header.jsp"%>		//在该位置包含jsp文件

jsp标签形式:

<jsp:include page="common/footer.jsp"></jsp:include>

test01.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="/error/500.jsp" %>
<%@ include file="common/header.jsp"%>				
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("<h1>" + "我是主体内容" + "</h1>");
%>
<%@ include file="common/footer.jsp"%>
</body>
</html>

jsp标签形式和jsp指令形式去做包含是有区别的。jsp指令形式会将要包含的内容用out.print()或者out.write()与当前页面合二为一。而jsp标签形式是直接拿到这个jsp文件,在html标签处去拼接页面。一般会用jsp标签形式

9大内置对象

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

存储属性

<%--内置对象--%>
<%--    4个存东西的对象--%>
<%

    pageContext.setAttribute("name1", "Zh1z3ven1");     //保存的数据在一个页面中有效
    request.setAttribute("name2", "Zh1z3ven2");         //保存的数据在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3", "Zh1z3ven3");         //保存的数据在一次会话中有效,从打开浏览器到关闭
    application.setAttribute("name4", "Zh1z3ven4");     //保存的数据在服务器中有效,服务器崩了才丢数据
%>

其中 pagecontext的作用域是在当前页面上下文,request的作用域是一次请求中,后面的session和application算是最大的了

作用域从低到高:pageContext ==> request ==> session ==> application

比如在另一个jsp页面 就取不到pageContext和request设置的setAttribute。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>
<%--    4个存东西的对象--%>
<%

    pageContext.setAttribute("name1", "Zh1z3ven1");     //保存的数据在一个页面中有效
    request.setAttribute("name2", "Zh1z3ven2");         //保存的数据在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3", "Zh1z3ven3");         //保存的数据在一次会话中有效,从打开浏览器到关闭
    application.setAttribute("name4", "Zh1z3ven4");     //保存的数据在服务器中有效,服务器崩了才丢数据
%>

<%
    //通过find寻找到Attribute
    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>

</body>
</html>

posted @ 2021-08-05 00:21  Zh1z3ven  阅读(203)  评论(0编辑  收藏  举报