您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

一文搞定JSP

一、为什么使用JSP

HTML和JSP的区别,就好像我有一块巨大的墙,然后在上面用传统的方式粘贴广告布,今天是张三出1万块钱展示他的成人用品广告,明天是李四花2万块钱展示他的治肾亏广告。。。我每天都得去换广告布???

No,使用电子屏幕就搞定了!

  • HTML不能动态展示内容
  • HTML不能设置变量
  • HTML也不能进行业务逻辑判断
  • 不能进行数据循环

可以通过response对象响应浏览器数据的方式,在servlet中通过Java代码控制响应的数据,达到动态展示的效果,但是需要以一个完整页面的方式展示,但是代码量大

JSP(Java server pages),运行在服务器中的动态页面,通过Java代码展示数据

二、jsp的组成部分

1、HTML标签和文本

**解析方式:**通过out.write()响应

2、jsp脚本片段:

格式:<% Java代码 %>

​ **作用:**执行一段Java代码

解析方式:_直接在jsp所翻译成的servlet的_jspService()执行

3、jsp表达式:

格式:<%=数据%>

​ **作用:**将数据输出到页面

​ **解析方式:**通过out.print()响应到浏览器中

4、jsp声明

格式:<%! 格式; %>

​ **作用:**在jsp所翻译成的servlet中声明一个成员变量

​ **解析方式:**在jsp所翻译成的servlet中声明一个成员变量

三、jsp原理

jsp本质就是一个servlet

jsp就藏在tomcat的work目录中,jsp文件所翻译成的Java类和生成的class,是一个servlet的远房表亲,继承了HttpJspBase,而HttpJspBase继承了HttpServlet

jsp所翻译成的类就是一个servlet在jsp所翻译成的servlet的_jsService()中,将HTML代码通过out.write()响应到浏览器,将jsp脚本片段中的代码直接在_jspService()中执行,jsp中表达式中的额内容会通过out.print()响应到浏览器,jsp声明会在jsp所翻译成的servlet中直接声明相应的成员变量

四、jsp的四大域对象

域对象中操作数据库的方法

void setAttribute(String attributeName,Object attributeValue)://设置在域对象中共享的数据
Objcet getAttribute(String attributeName);//获取域对象中共享的数据
void removeAttribute(String attributeName);//删除域对象中共享的数据

1、pageContext

**类型:**PageContext

功能:

  • 获取其他八个隐式对象
  • 域对象,可以在一个一面范围内共享数据

使用场景:

  • jsp中大部分的标签都会默认将数据共享在pageContext中

2、request

**类型:**HttpServletRequest

功能:

  • 获取请求参数
  • 转发
  • 域对象,可以在一次请求范围中共享数据

应用场景:

  • 错误信息提示
  • 查询所有数据展示在页面中
  • 数据回显

3、session

**类型:**HttpSession

功能:

  • 域对象,可以在一次会话范围中共享数据(一次会话指的是浏览器从开启到关闭)

应用场景:

  • 记录用户的登录状态
  • 购物车

4、application

**类型:**ServletContext

功能:

  • 获取当前工程的初始化参数
  • 获取当前工程的上下文路径
  • 获取当前工程的部署路径
  • 域对象,整个工程的范围中共享数据

应用场景:

​ spring会将IOC容器对象所共享在ServletContext中

下面,我们来观察域对象中的范围:

首先创建两个页面,在这两个页面中写入四大域对象中需要共享的数据,然后做以下对照试验

<%--index页面
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>这是index.jsp页面,设置共享数据</h1>
<%
    //设置四大域对象共享的数据
    //pageContext.setArribute("testpageContext","pageContext设置的共享数据");
    request.setAttribute("testRequest","request设置的共享数据");
    session.setAttribute("testSession","session设置的共享数据");
    application.setAttribute("testApplication","application设置的共享数据");
    
%>
//<%=pageContext.getAttribute("testPageContext")%><br>
<%=request.getAttribute("testRequest")%><br>
<%=session.getAttribute("testSession")%><br>
<%=application.getAttribute("testApplication")%><br>
</body>
</html>




<%--test页面
  Created by IntelliJ IDEA.
  User: Django
  Date: 2021/4/14
  Time: 18:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>这是test页面</h1>
//pageContext:<%=pageContext.getAttribute("testPageContext")%><br>
//pageContext这个对象本来想测试的,但是idea中会报错,不知道是为什么,可以接下来去研究研究
request:<%=request.getAttribute("testRequest")%><br>
session:<%=session.getAttribute("testSession")%><br>
application:<%=application.getAttribute("testApplication")%><br>
</body>
</html>

1、在index.jsp中向四大域对象中共享数据,在当前页面中观察能否获取共享的数据
在这里插入图片描述
2、在index.jsp中向四大域对象中共享数据,通过转发跳转到test.jsp,在test.jsp中观察能否获取共享的数据
在这里插入图片描述
3、在index.jsp中向四大域对象中共享数据,通过重定向跳转到test.jsp,在test.jsp中观察能否获取共享的数据

//通过重定向到test.jsp
//response.sendRedirect(request.getContextPath()+"/test.jsp");

在这里插入图片描述
4、在index.jsp中向四大域对象中共享数据,打开一个新的标签页,访问test.jsp,在test.jsp中观察能否获取共享的数据

在这里插入图片描述
5、在index.jsp中向四大域对象中共享数据,打开一个新的标签页,访问test.jsp,在test.jsp中先观察能否获取共享的数据;将浏览器重启直接访问test.jsp,在test.jsp中再观察能否获取共享的数据,在上一步的基础上观察后,重启浏览器直接范文test.jsp
在这里插入图片描述
6、在index.jsp中向四大域对象中共享数据,打开一个新的标签页,访问test.jsp,在test.jsp中先观察能否获取共享的数据;将服务器重启直接访问test.jsp,在test.jsp中再观察能否获取共享的数据
在这里插入图片描述
7、在index.jsp中向四大域对象中共享数据,打开一个新的标签页,访问test.jsp,再打开一个新的浏览器,访问test.jsp,观察能否获取共享的数据

在这里插入图片描述

总结

从上面几个对照中,我们不难总结出以下内容:

  • 转发可以访问请求域中的数据,重定向不可以访问请求域中的数据(重定向是二次请求)
  • session域对象中的数据区分浏览器(对应第7个)
  • session域对象中的数据跟服务器是否关闭无关,只跟浏览器是否关闭有关
  • application域对象中的数据跟浏览器是否关闭没有关系,只跟服务器是否关闭有关

实际上:只需要明白这个逻辑即可——pageContext是获取当前页面;request中,如果是跳转,那么就是一次请求,是可以获取到请求域中的数据,而重定向相当于是二次请求,不是在服务器内部跳转,无法获取共享数据;session,如果浏览器没有关闭,则可以获取共享域数据(session是依赖于cookie的,钝化功能使得即使服务器关闭了,也会将数据序列化保存起来,当服务器再次启动时则反序列化,也称为活化;而application则只与服务器相关,因为服务器启动时,只创建一个域对象,只要服务器没有关闭,就使用的时同一个对象

五、JSP指令

jsp指令的格式:<%@ 指令名 属性名=“属性值” 属性名=“属性值”%>

5.1、page——设置当前页面相关信息

常用属性:

  • contentType:设置当前页面的内容格式
  • import:导包
  • errorPage:当前页面若出现异常,则会跳转到自定的错误页面
  • isErrorPage:用于在errorPage所指定的错误页面,当设置了属性isErrorPage="true"时,在当前页面中获取发生错误的页面异常信息(在实际开发中其实这两者用的很少)
<%--
  Created by IntelliJ IDEA.
  User: Django
  Date: 2021/4/14
  Time: 19:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="isErrorPage.jsp"%>

<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    System.out.println(2/0);
%>
</body>
</html>



<%--
  Created by IntelliJ IDEA.
  User: Django
  Date: 2021/4/14
  Time: 19:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>在当前页面显示errorPage的错误信息</h1>
<%=exception.getMessage()%>
<%--
最终会转发到errorPage.jsp,且页面中显示/by zero
--%>
</body>
</html>

<%--
  Created by IntelliJ IDEA.
  User: Django
  Date: 2021/4/14
  Time: 19:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="isErrorPage.jsp"%>

<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    System.out.println(2/0);
%>
</body>
</html>



<%--
  Created by IntelliJ IDEA.
  User: Django
  Date: 2021/4/14
  Time: 19:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>在当前页面显示errorPage的错误信息</h1>
<%=exception.getMessage()%>
<%--
最终会转发到errorPage.jsp,且页面中显示/by zero
--%>
</body>
</html>

5.2、include

**常用属性:**file设置包含的页面路径

六、JSP动作标签

jsp动作标签的格式:<jsp:标签名 属性名=“属性值” 属性名=“属性值”></jsp:标签名>

  • 1、转发

    <jsp:forword page="/index.jsp"></jsp:forword>
    
  • 2、动态包含

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

静态包含:

<%@ include file="被包含页面"%>

只将本页面中的内容翻译,不翻译包含的文件,而且是在JSP转换为Java阶段实现

被包含页面中的内容会被复制到主页面中,一起进行翻译

动态包含:

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

则是本页面和包含的文件都翻译,在执行class文件阶段,动态的加入

有不恰之处,还请爸爸们多多指摘;高鸣彻九州,延颈望八荒;我是想睡觉的m,咱们下期再见!


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进