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 笔记总结的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb学习笔记六 JSP

[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

javaweb笔记五

JAVAWEB学习笔记17

javaweb入门-----jsp概念

JavaWeb---总结JSP标签