概述
jsp
什么是jsp,它有什么用?
- jsp的全称是java.server.pages java的服务器页面
- jsp的主要作用是代替servlet程序回传html页面的数据
- 因为servlet程序回传html页面数据是意见非常繁琐的事情。开发成本和维护成本都极高
jsp的本质是什么
- jsp页面本质上是一个Servlet程序
- 当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并且对它进行编译成为.class字节码文件。
- jsp直接继承了HttpServlet类,也就是说,jsp翻译出来的Java类,它间接了继承HttpSerlvet类。也就说,翻译出的是一个Servlet程序
- 总结:通过翻译的java源代码我们就可以得到结果:jsp就是Servlet程序
jsp头部的page指令
<%@ page contentType="text/html;charset=UTF-8"
pageEncoding="utf-8"
buffer="8kb"
autoFlush="true"
errorPage="/err500.jsp"
language="java" %>
<%--
errorPage表示错误后自动跳转去的路径
这个路径一般都是以斜杠打头,他表示请求地址为http://ip/port/工程路径/
映射到代码的web目录
--%>
language属性 | 表示jsp翻译后是什么语言文件。目前只支持Java |
---|---|
contentType属性 | 表示jsp返回的数据类型是什么,也是源码中response.setContentType()参数值 |
pageEncoding属性 | 表示当前jsp页面文件本身的字符集 |
import属性 | 跟java源代码一样,用于导包,导类 |
--------------------------------------------------两个属性是给out输出流使用---------------------------------------------------
autoFlush属性 | 设置当out输出流缓冲区满了以后,是否自动刷新冲级区。默认是true |
---|---|
buffer属性 | 设置out缓冲区大小,默认是8kb |
--------------------------------------------------两个属性是给out输出流使用---------------------------------------------------
errorPage属性 | 设置当jsp页面运行时出错,自动跳转区的错误页面路径 |
---|---|
isErrorPage属性 | 设置当前jsp页面是否是错误信息页面,默认是lalse。如果是true可以获取异常信息 |
session属性 | 设置访问当前jsp页面,是否会创建HttpSession对象,默认是true |
extends属性 | 设置jsp翻译出来Java类默认继承谁 |
声明脚本
<%--1. 声明类属性--%>
<%!
private Integer Id;
private String name;
private static Map<String,Object> map;
%>
<%--2. 声明static静态代码块--%>
<%!
static {
map = new HashMap<String, Object>();
map.put("key1","value1");
map.put("key2","value3");
map.put("key3","value3");
}
%>
<%--3. 声明类方法--%>
<%!
public void fangfa(){
int i;
}
%>
<%--声明类--%>
<%!
public class A{
private Integer id=12;
private String name;
}
%>
表达式脚本
表达式脚本的格式是: <%=表达式%>
表达式脚本的作用就是在 jsp 页面上输出数据
代码脚本的格式是:
代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是Java语句)
多个代码块可以组合成一个完整的Java语句
代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
<%
java语句
%>
jsp九大内置对象
request | 请求对象 |
---|---|
response | 响应对象 |
pageContext | jsp的上下文对象 |
session | 会话对象 |
application | ServletContext对象 |
config | ServletConfig对象 |
out | jsp输出流对象 |
page | 指向当前jsp的对象 |
exception | 异常对象 |
jsp四大域对象
四大域对象分别是:
pageContext (PageContextImpl类) | 当前 jsp 页面范围内有效 |
---|---|
request (HttpServletRequest类) | 一次请求内有效 |
session (HttpSession类) | 一个会话范围内有效(打开浏览器访问服务器,知道关闭浏览器) |
application (ServletContext类) | 整个web工程范围内都有效(只有web工程有效,数据都在) |
域对象是可以像Map一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围
虽然四个域对象都可以存取数据,在使用上他们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序
pageContext>>request>>session>> application
<h1>scopejsp页面</h1>
<%
//往四个域中分别保存了数据
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
pageContext域是否有值<%=pageContext.getAttribute("key")%><br>
request域是否有值<%=request.getAttribute("key")%><br>
session域是否有值<%=session.getAttribute("key")%><br>
application域是否有值<%=application.getAttribute("key")%><br>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
<h1>这里是scope2页面</h1>
pageContext域是否有值<%=pageContext.getAttribute("key")%><br>
request域是否有值<%=request.getAttribute("key")%><br>
session域是否有值<%=session.getAttribute("key")%><br>
appliction域是否有值<%=application.getAttribute("key")%><br>
<--代码问题 pageContext不能使用setAttribute方法 导入jar包 两者有依赖关系-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
jsp_out和response输出流的区别
response中表示响应,我们经常用于设置返回给客户端的内容(输出)
out也是给用户做输出使用的
<%
out.write("输出out1</br>");
out.flush();
out.write("输出out2</br>");
response.getWriter().write("输出response1</br>");
response.getWriter().write("输出response2</br>");
%>
out和response都有自己的缓冲区(out缓冲区和response缓冲区)
当jsp页面中所有的代码执行完成后会做出下面两个操作
out.flush可以不写,默认会自动追加
- 执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾
- 会执行response的刷操作,把全部数据写个客户端
- 由于jsp翻译之后,底层源代码都是使用out类进行输出,所有一般情况下,我们在jsp页面中同一使用out来进行输出。避免打乱页面输出内容的顺序
out.wirte() 输出字符串都没有问题 ::因为源代码中对于类型的输出做了char类型的强转
out.print() 输出任意数据类型都没有问题(都转化成为字符串后掉头的write输出)
深入源码,浅出结论,在jsp页面中,可以同一使用out.print()输出
jsp静态包含
<body>
头部信息<br>
主题内容<br>
<%--
<%@include file="/include/foot.jsp"%>就是静态包含
file属性指定你要包含的jsp页面的路径
地址中的第一个斜杠/ 表示为 http://ip:port/工程路径/映射到代码的web目录
静态包含的特点:
1. 静态包含不会翻译被包含的jsp页面
2. 静态包含其实十八被包含的jsp页面的代码拷贝到包含的位置执行输出
--%>
<%@include file="/include/foot.jsp"%>
</body>
</head>
<body>
脚步
修改
</body>
动态包含
<%--
<jsp:include page="foot.jsp"> 这是动态包含
page属性是指定你要包含的jsp页面的路径
动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置
动态包含的特点:
1. 动态包含会把包含的jsp页面也翻译成java代码
2. 动态包含底层代码使用如下代码区调用被包含的jsp页面执行输出。
3. 动态包含,还可以传递参数
--%>
<jsp:include page="foot.jsp">
<jsp:param name="username" value="root"/>
<jsp:param name="password" value="1234"/>
</jsp:include>
<body>
脚步
修改
<%=request.getParameter("username")%>
<%=request.getParameter("password")%>
</body>
请求转发
<%--<jsp:forward page="/scope2.jsp">是否请求转发镖旗爱你,他的功能就是请求转发
page属性设置请求转发的路径
--%>
<jsp:forward page="/scope2.jsp">
</jsp:forward>
练习:
<%--九九乘法表--%>
<<body>
<table>
<%for (int i = 0; i < 10; i++) {%> <tr>
<% for (int j = 1; j <= i; j++) {%>
<td>
<% out.print(j+"x"+i+"="+i*j);%>
</td>
<% }%>
</tr>
<%}%>
</table>
</body>
练习二:程序要不报500错误,首先要先访问
<%--练习二:jsp输出一个表格,里面有10个学生信息--%>
<%
List<Student> studentList=new ArrayList<>();
for (int i = 0; i < 10; i++) {
int t=i+1;
studentList.add(new Student(t,"name"+t,"phone"+t,18+t));
}
%>
<table>
<%for (Student student:studentList) {%>
<tr>
<td><%=student.getId()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getPhone()%></td>
<td><%=student.getName()%></td>
</tr>
<%}%>
</table>
<%--输出10的学生信息--%>
public class Student {
public Student(){}
private Integer id;
private String name;
private String phone;
private Integer age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + ''' +
", phone='" + phone + ''' +
", age=" + age +
'}';
}
public Student(Integer id, String name, String phone, Integer age) {
this.id = id;
this.name = name;
this.phone = phone;
this.age = age;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public Integer getAge() {
return age;
}
}
什么Listener是监听器
- Listener监听器它是Javaweb的三大组件之一,Javaweb的三大组件分别是:Servlet程序,Filter程序,Listener监听器。
- Listener它是javaEE的规范,就是接口
- 监听器的作用是,监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理
ServletContextListener监听器
- ServletContextListener它可以监听ServletContext对象的创建与销毁
- ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁
- 监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈
两个方法分别是:
public interface ServletContextListener extends EventListener {
//初始化监听器方法,在系统初始化时自动调用
default void contextInitialized(ServletContextEvent sce) {
}
//销毁监听器,在系统运行结束时自动销毁
default void contextDestroyed(ServletContextEvent sce) {
}
如何使用ServletContextListener监听器监听ServletContext对象。
使用步骤如下:
- 编写一个类实现ServletContextListener接口
- 实现其两个回调方法
- 到web.xml中配置监听器
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextLister对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener被销毁了");
}
}
<!-- 配值监听器-->
<listener>
<listener-class>com.atguigu.Listener.MyListener</listener-class>
</listener>
最后
以上就是虚心小白菜为你收集整理的jsp复习资料jsp的全部内容,希望文章能够帮你解决jsp复习资料jsp所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复