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指令
1
2
3
4
5
6
7
8
9
10
11
12<%@ 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<%--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 页面上输出数据
代码脚本的格式是:
1
2
3
4
5
6代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是Java语句) 多个代码块可以组合成一个完整的Java语句 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
1
2
3
4<% 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<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); %>
1
2
3
4
5
6<h1>这里是scope2页面</h1> pageContext域是否有值<%=pageContext.getAttribute("key")%><br> request域是否有值<%=request.getAttribute("key")%><br> session域是否有值<%=session.getAttribute("key")%><br> appliction域是否有值<%=application.getAttribute("key")%><br>
1
2
3
4
5
6
7
8<--代码问题 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也是给用户做输出使用的
1
2
3
4
5
6
7
8
9<% 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静态包含
1
2
3
4
5
6
7
8
9
10
11
12
13
14<body> 头部信息<br> 主题内容<br> <%-- <%@include file="/include/foot.jsp"%>就是静态包含 file属性指定你要包含的jsp页面的路径 地址中的第一个斜杠/ 表示为 http://ip:port/工程路径/映射到代码的web目录 静态包含的特点: 1. 静态包含不会翻译被包含的jsp页面 2. 静态包含其实十八被包含的jsp页面的代码拷贝到包含的位置执行输出 --%> <%@include file="/include/foot.jsp"%> </body>
1
2
3
4
5
6</head> <body> 脚步 修改 </body>
动态包含
1
2
3
4
5
6
7
8
9
10
11
12
13
14<%-- <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>
1
2
3
4
5
6
7<body> 脚步 修改 <%=request.getParameter("username")%> <%=request.getParameter("password")%> </body>
请求转发
1
2
3
4
5
6
7<%--<jsp:forward page="/scope2.jsp">是否请求转发镖旗爱你,他的功能就是请求转发 page属性设置请求转发的路径 --%> <jsp:forward page="/scope2.jsp"> </jsp:forward>
练习:
1
2
3
4
5
6
7
8
9
10
11
12
13
14<%--九九乘法表--%> <<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错误,首先要先访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<%--练习二: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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59<%--输出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监听器的方法反馈
两个方法分别是:
1
2
3
4
5
6
7
8public interface ServletContextListener extends EventListener { //初始化监听器方法,在系统初始化时自动调用 default void contextInitialized(ServletContextEvent sce) { } //销毁监听器,在系统运行结束时自动销毁 default void contextDestroyed(ServletContextEvent sce) { }
如何使用ServletContextListener监听器监听ServletContext对象。
使用步骤如下:
- 编写一个类实现ServletContextListener接口
- 实现其两个回调方法
- 到web.xml中配置监听器
1
2
3
4
5
6
7
8
9
10
11
12public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContextLister对象被创建了"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContextListener被销毁了"); } }
1
2
3
4
5<!-- 配值监听器--> <listener> <listener-class>com.atguigu.Listener.MyListener</listener-class> </listener>
最后
以上就是虚心小白菜最近收集整理的关于jsp复习资料jsp的全部内容,更多相关jsp复习资料jsp内容请搜索靠谱客的其他文章。
发表评论 取消回复