JavaWeb05-JSP(源码分析,九大内置对象和四大作用域)

目录

1.1 什么是JSP

1.2JSP和Html的区别

1.3JSP原理

1.4JSP简单的代码

1.5九大内置对象

1.6四大作用域


1.1 什么是JSP

Java Server Pages.Java服务器端页面,JSP本质上就是Servlet!!用于动态web技术。

没有JSP时程序员是将前端页面转译成Java代码在类里面一个个out出去,非常麻烦。


1.2JSP和Html的区别

Html只给用户提供静态数据

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

1.3JSP原理

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

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

咋先启动一个tomcat找到JSP看源码

发现它变成了个Java类! 

 发现JSP类最终还是继承了Servlet类,所以说它本质是个Servlet

再仔细往下看,它有类似于生命周期的函数

内置对象 


    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:当前 

    Request;

    Response;

    javax.servlet.jsp.JspWriter _jspx_out = null;                    
    javax.servlet.jsp.PageContext _jspx_page_context = null;

页面里面内置的代码

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; 

我们会发现这些代码不就是我们之前在Servlet里面写的吗,而这些代码会在JSP页面里面自动执行 !!!

 JSP里面的代码其实都转换成了我们原本在Servlet写的代码。

JSP执行流程 

1.4JSP简单的代码

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

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

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

  </body>
</html>

jsp代码基本被淘汰了不再细讲。 

 有个很坑壁的错误

如果你下面写了个hello.jsp

你访问时候访问路径必须写上后缀,只写hello会报错。。可能会为了和之后的springmvc用controller跳转区分开来吧。

1.5九大内置对象

PageContext  存东西

Request  存东西

Response

Session   存东西

Application【ServletContext】存东西

config【ServletConfig】

out

page,几乎不用

exception 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name","小红"); //保存的数据只在一个页面中有效
    request.setAttribute("name2","小红2");   //保存的数据只有在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","小红3");   //保存的数据只有在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","小红4");  //保存的数据只有在服务器中生效,从打开服务器到关闭服务器
%>

<%
    String name1=(String) pageContext.findAttribute("name");

%>
<%--用el表达式取出数据--%>
<h1>取出的值为</h1>
<h3>${name}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%--用jsp--%>
<h3><%=name1%></h3>
</body>
</html>

这里我们先放入数据,如果在另一个页面去获取数据只能取到name3和name4的值,也就是只能取到session和application,为什么?

简单来说,session和application是可以跨页面的。

 session是一次会话,那么应该是我们在自己电脑上的每个请求都可以获取session 而不是几个电脑共享这个数据 那是application。

又回到上面那个问题,为什么session和application可以跨页面?其实setAttribute可以有第三个参数,scope作用域。

源码:

1.6四大作用域

JSP四大作用域分别为:page、request、session、application。

  第一个作用域是page

  只在当前页面有效,也就是用户请求的页面有效。page只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放。

  第二个作用域是request

  它在当前请求中有效。request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址。

  第三个作用域是session

  它在当前会话中有效。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过 setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前 会话。

  第四个作用域是application

  他在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。

page太菜了,不怎么用了,其他的三个举个小例子理解一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JagTom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值