深入浅出了解jsp

a.jsp 翻译成java 文件后的全名是a_jsp.java 文件
b.jsp 翻译成java 文件后的全名是b_jsp.java 文件


那么当我们访问一个xxx.jsp 文件后翻译成java 文件的全名是xxx_jsp.java 文件
xxx_jsp.java 文件是一个Servlet 程序。原来jsp 中的html 内容都被翻译到Servlet 类的service 方法中原样输出。

jsp 的语法 

4.1、jsp 文件头部声明介绍(page 指令介绍)


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
这是jsp 文件的头声明。表示这是jsp 页面。


language 属性值只能是java。表示翻译的得到的是java 语言的
contentType 属性设置响应头contentType 的内容
pageEncoding 属性设置当前jsp 页面的编码
import 属性给当前jsp 页面导入需要使用的类包
autoFlush 属性设置是否自动刷新out 的缓冲区,默认为true
buffer 属性设置out 的缓冲区大小。默认为8KB
errorPage 属性设置当前jsp 发生错误后,需要跳转到哪个页面去显示错误信息
isErrorPage 属性设置当前jsp 页面是否是错误页面。是的话,就可以使用exception 异常对象
session 属性设置当前jsp 页面是否获取session 对象,默认为true
extends 属性给服务器厂商预留的jsp 默认翻译的servlet 继承于什么类 

4.2、jsp 中的三种脚本介绍


1)第一种,声明脚本:

声明脚本格式如下:


<%!
java 代码
%>

在声明脚本块中,我们可以干4件事情
1.我们可以定义全局变量。
2.定义static 静态代码块
3.定义方法
4.定义内部类
几乎可以写在类的内部写的代码,都可以通过声明脚本来实现

2)第二种,表达式脚本

表达式脚本格式如下:
<%=表达式%>


表达式脚本用于向页面输出内容。
表达式脚本翻译到Servlet 程序的service 方法中以out.print() 打印输出


out 是jsp 的一个内置对象,用于生成html 的源代码
注意:表达式不要以分号结尾,否则会报错
表达式脚本可以输出任意类型。
比如:
1.输出整型
2.输出浮点型
3.输出字符串
4.输出对象 

3)第三种,代码脚本

代码脚本如下:
<% java 代码%>
代码脚本里可以书写任意的java 语句。
代码脚本的内容都会被翻译到service 方法中。
所以service 方法中可以写的java 代码,都可以书写到代码脚本中 

4.3、jsp 中的注释:

// 单行java 注释
/*
多行java 代码注释
*/
单行注释和多行注释能在翻译后的java 源代码中看见。
<%-- jsp 注释--%>
jsp 注释在翻译的时候会直接被忽略掉
<!-- html 注释-->

html 的注释会被翻译到java 代码中输出到html 页面中查看

5、jsp 九大内置对象
 

 request 对象请求对象,可以获取请求信息
response 对象响应对象。可以设置响应信息
pageContext 对象当前页面上下文对象。可以在当前上下文保存属性信息
session 对象会话对象。可以获取会话信息。
exception 对象异常对象只有在jsp 页面的page 指令中设置isErrorPage="true" 的时候才会存在
application 对象ServletContext 对象实例,可以获取整个工程的一些信息。
config 对象ServletConfig 对象实例,可以获取Servlet 的配置信息
out 对象输出流。
page 对象表示当前Servlet 对象实例(无用,用它不如使用this 对象)。

九大内置对象,都是可以在【代码脚本】中或【表达式脚本】中直接使用的对
象。

6、jsp 四大域对象 

四大域对象经常用来保存数据信息。


pageContext 可以保存数据在同一个jsp 页面中使用
request 可以保存数据在同一个request 对象中使用。经常用于在转发的时候传递数据
session 可以保存在一个会话中使用
application(ServletContext) 就是ServletContext 对象


四个作用域的测试代码:
新建两个jsp 页面。分别取名叫:context1.jsp,context2.jsp


1)context1.jsp 的页面代码如下: 

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是context1 页面<br/>
<%
//设置page 域的数据
pageContext.setAttribute("key", "pageContext-value");
//设置request 域的数据
request.setAttribute("key", "request-value");
//设置session 域的数据
session.setAttribute("key", "session-value");
//设置application 域的数据
application.setAttribute("key", "application-value");
%>
<%-- 测试当前页面作用域--%>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
<%
// 测试request 作用域
// request.getRequestDispatcher("/context2.jsp").forward(request, response);
%>
</body>
</html>

2)context2.jsp 的页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是context2 页面<br/>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
</body>
</html>

7、jsp 中out 输出流和response.getwriter()输出流

1) jsp 中out 和response 的writer 的区别演示

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// out 输出
out.write("这是out 的第一次输出<br/>");
// out flush 之后。会把输出的内容写入writer 的缓冲区中
out.flush();
// 最后一次的输出,由于没有手动flush,会在整个页面输出到客户端的时候,自动写入到writer
缓冲区
out.write("这是out 的第二次输出<br/>");
// writer 的输出
response.getWriter().write("这是writer 的第一次输出<br/>");
response.getWriter().write("这是writer 的第二次输出<br/>");
%>
</body>
</html>

 运行查看的结果:

8、jsp 的常用标签


<%-- 静态包含--%>
<%-- 动态包含--%>
<%-- 转发--%>

1)静态包含--很常用
<%@ include file="" %>
静态包含是把包含的页面内容原封装不动的输出到包含的位置。

2)动态包含--很少用
<jsp:include page=""></jsp:include>
动态包含会把包含的jsp 页面单独翻译成servlet 文件,然后在执行到时候再调用翻译的servlet 程序。并把
计算的结果返回。
动态包含是在执行的时候,才会加载。所以叫动态包含。

3)页面转发--常用
<jsp:forward page=""></jsp:forward>
<jsp:forward 转发功能相当于
request.getRequestDispatcher("/xxxx.jsp").forward(request, response); 的功能。

静态包含和动态包含的区别:

ServletContextListener 监听器


javax.servlet.ServletContextListener ServletContext 监听器
监听器的使用步骤。


第一步:我们需要定义一个类。然后去继承生命周期的监听器接口。
第二步:然后在Web.xml 文件中配置。


ServletContextListener 监听器,一定要在web.xml 文件中配置之后才会生效
<listener>
<listener-class>全类名</listener-class>
</listener>


生命周期监听器两个方法:
public void contextInitialized(ServletContextEvent sce) 是ServletContext 对象的
创建回调


public void contextDestroyed(ServletContextEvent sce) 是ServletContext 对象的销
毁回调
我们以ServletContext 的监听器为例演示如下:

1)创建一个ServletContextListenerImpl 类实现ServletContextListener 接口。 

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
“玩转”Java 系列
public class ServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁了");
}
}

 2)在web.xml 文件中的配置如下:


<listener>
<listener-class>com.atguigu.listener.RequestListener</listener-class>
</listener>


3)这个时候,启动web 工程和正常停止web 工程,后台都会如下打印:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只猪的思考

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

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

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

打赏作者

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

抵扣说明:

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

余额充值