JavaWeb jsp 笔记总结
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb jsp 笔记总结相关的知识,希望对你有一定的参考价值。
文章目录
1. 什么是jsp?
jsp全称java server pages (java的服务器页面)。
jsp的主要作用是代替Servlet程序回传html页面的数据。
jsp页面的本质就是一个Servlet程序。
当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,进而对这个源文件进行编译为.class文件。综上jsp本质上还是个Servlet程序。
在将jsp翻译后,它有很多write()方法,就是用来发送那些html标签的。
2. jsp 的头部指令 page指令
page指令不同的属性:
<!-- import标签类似导包 -->
<%@ page import=java.util.* %>
<!-- language表示jsp翻译后是什么语言(暂时只支持java); contentType表示jsp返回什么样的数据类型(response.setContentType的值一样); pageEncoding表示jsp当前页面文件的字符集 -->
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"%>
还有两个针对out输出流的属性如下:
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"
autoFlush="true" //默认是true,这里如果不设置他就会报JSP buffer overflow (jsp缓冲区溢出)。
buffer="8kb" //默认是8kb(最合适的),这里是设置缓冲区大小,上面不设置为true他就不会自动刷新。
%>
errorPage="\\xxx" 这里的斜杆开头,它表示请求地址为http://ip:port/工程路径/ ;映射到代码的Web目录中。
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"
//errorPage表示错误后自动跳转去的路径
errorPage="/error.jsp"
%>
isErrorPage=“false” ;默认是false,设置当前jsp页面是否是错误信息页面。
<%@ page language="java" contentType="text/html; utf-8"
pageEncoding="utf-8"
//设置当前jsp页面是否是错误信息页面。默认是false。如果是true可以获取异常信息
isErrorPage="false"
%>
session属性:设置访问当前jsp页面,是否会创建HttpSession对象,默认为true。因为jsp文件本质上就是一个Servlet程序,程序内部自然有很多对象等等。
extends属性:设置jsp,翻译出来的java类默认继承谁。
3. jsp 常用的脚本
这些脚本最好配合着Tomcat目录下的work/Catalina/工程名来对着java文件来看,这样更容易理解。
3.1 声明脚本
声明脚本的格式是: <%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等等。
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"
errorPage="/error.jsp"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%-- 1.声明属性 ,这里声明的属性,在这jsp转为Servlet代码时就会再里面定义。 --%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%-- 2.对应上面的map,生成静态代码块。同样这个代码块也会写入到Servlet源代码中 --%>
<%!
static
map = new HashMap<String,Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
%>
<%-- 3.声明类方法 , 会被写入到Servlet源代码中。 --%>
<%!
public int abc()
return 12;
%>
<%-- 4.声明内部类 ,也会被写入到Servlet源代码中。--%>
<%!
public static class A
private Integer id = 12;
private String abc = "abc";
%>
</body>
</html>
3.2 表达式脚本
表达式脚本的格式是:<%= 表达式 %>
表达式脚本的作用是:可以将表达式在jsp页面上输出数据。
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"
errorPage="/error.jsp"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%!
static
map = new HashMap<String,Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
%>
<%--1.输出整型 , 2.输出浮点型 , 3.输出字符串 , 4.输出对象--%>
<%=12 %><br><%=12.1212 %><br><%="我是字符串" %><br><%=map %>
</body>
</html>
需要注意的是:表达式脚本中的表达式不能以分号结束。
3.3 代码脚本
代码脚本格式:<% java语句 %>
代码脚本功能:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
需要写什么语句?那就要配合jsp文件转为Servlet的源代码来操作了。
4. html , java , jsp 三种注释
5. jsp 的 九大内置对象
jsp中的内置对象,是指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象。
6. jsp 四个大域对象
域对象是可以像Map一样存取数据的对象。
这些域对象的功能差不多,但是作用范围不同!!!
(request域对象的范围是一次请求及其抓发。)
scope.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>scope.jsp页面</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>
<%
//下面代码就是一个请求转发的一个过程,以此来测试4个域对象的范围有何不同。
request.getRequestDispatcher("/scope2.jsp").forward(request, response);
%>
</body>
</html>
scope2.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>scope2.jsp页面</h1>
pageContext域值是否有值:<%=pageContext.getAttribute("key") %> <br>
request域值是否有值:<%=request.getAttribute("key") %> <br>
session域值是否有值:<%=session.getAttribute("key") %> <br>
application域值是否有值:<%=application.getAttribute("key") %> <br>
</body>
</html>
7. jsp的 out 和 response输出区别
out和response输出时,没什么不同,但是有一定的顺序!!
伴随上图,定义out.write(“xxx”)输出数据时,它会先进入out缓冲区,同样response.getWriter().write()写数据时,也是进入response缓冲区。之后,out缓冲区的内容会追加到response缓冲区中,才有了这种顺序。
out.flush()方法执行时,会清空当前缓冲区,如果缓冲区中有数据,则输出缓冲中的数据,直接将现在的out缓冲区内容直接添加到response缓冲区中,因此,调用该方法时,就会注意out输出和response的顺序问题!!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
测试
<%
out.write("out输出1 <br>");
out.flush();//注意flush方法不同!!
out.write("out输出2 <br>");
response.getWriter().write("response输出1 <br>");
response.getWriter().write("response输出2 <br>");
%>
</body>
</html>
因为,我们底层信息之类的都是用out.write()方法来运行的,因此我们在jsp页面中定义java代码,也用out来进行输出,不然会遇到顺序混乱的问题。
jsp中的out变量中有两个输出方法:
-
out.write()方法:输出字符串没有问题。
-
out.print()方法:输出任意数据都没有问题(都转换成为字符串后调用的write输出)
out.print()方法它是不管接受的参数类型,它的底层都是转为字符串类型,之后调用write()方法。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//传入int类型,write它返回的就是一个acill码对应的字符,因为他的底层原理是一个char[]数组。
out.write(12);
//print没事就是因为,它无论接受什么都先将该类型转为字符串类型,之后在调用write()方法。
out.print(12);
%>
</body>
</html>
因为可能出现类似上面这种情况的出现,因此我们在jsp页面中,统一使用out.print()方法来输出。
8. jsp 的包含功能
包含引入功能如下:
8.1 jsp 静态包含
静态包含的格式: <%@include file=“要包含的jsp页面的路径” %>
注意这里的" / "斜杆表示也是:http://ip:port/工程路径 映射到代码的web目录。
main.jsp包含引入footer.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%@include file="/include/footer.jsp" %>
</body>
</html>
footer.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
页脚信息<br>
</body>
</html>
静态包含的特点:
-
静态包含不会把被包含的jsp页面翻译为java代码。
-
静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。
8.2 jsp 动态包含
动态包含的特点:
-
动态包含会把包含的jsp页面也翻译成为java代码。
-
动态包含底层代码使用如下代码调用被包含的jsp页面输出。
-
动态包含,还可以传递参数。
main.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
头部信息<br>
主体内容<br>
<jsp:include page="/include/footer.jsp">
<%-- 使用jsp和param这种name,value格式可以向footer.jsp发送数据。 --%>
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:include>
</body>
</html>
footer.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
页脚信息,动态包含<br>
<%-- 使用request.getParameter()可以获取到传过来的参数内容。 --%>
<%=request.getParameter("username") %>
<%=request.getParameter("password") %>
</body>
</html>
8.3 jsp 请求转发
请求转发两种方式:
- 通过代码方式进行的请求转发。
- <jsp:forward page=""></jsp:forward>是请求转发标签,它的功能就是请求转发。
a.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--
<% //请求转发方式一:通过代码方式进行的请求转发如下:
request.getRequestDispatcher("/include/b.jsp").forward(request, response);%>
--%>
<%--
请求转发方式二: <jsp:forward page=""></jsp:forward>是请求转发标签,它的功能就是请求转发。
page 属性设置请求转发的路径
--%>
<jsp:forward page="/include/b.jsp"></jsp:forward>
</body>
</html>
b.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是页面b,请求转发过来的,第二种方式。
</body>
</html>
9. jsp页面代码和html页面 混合使用的案例
九九乘法表的案例:
以上是关于JavaWeb jsp 笔记总结的主要内容,如果未能解决你的问题,请参考以下文章