JSP主要作用是代替Servlet程序回传html页面的数据。
jsp页面和html页面一样,都是存放在web目录下,访问jsp页面也和访问html页面一样。
jsp本质上是Servlet程序,当访问jsp页面时,Tomcat服务器会把jsp页面翻译成java文件。
一. jsp三种脚本
1. 声明脚本:<%! %> (极少使用)
作用:在其中可以声明类属性、方法、静态代码块、内部类等,声明方式与java一样。
2. 表达式脚本:<%= %>
作用:在jsp页面上可以输出数据(整型、浮点型、字符串型、对象)
①所有表达式脚本都会被翻译到_jspService()方法中
②表达式脚本都会被翻译成为out.print()输出到页面上
③由于表达式脚本翻译到_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
④表达式脚本中的表达式不能以分号结束
3. 代码脚本:<% %>
作用:在jsp页面编写需要的功能(写的是java语句)
①所有代码脚本都会被翻译到_jspService()方法中
②由于代码脚本翻译到_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
③可以由多个代码脚本组合完成一个完整的java语句
④代码脚本可以和表达式脚本一起组合使用
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 声明属性 -->
<%!
private String name;
private int age;
private static Map<String,Object> map;
%>
<!-- 声明方法 -->
<%!
public int show(){
return 1;
}
%>
<!-- 声明静态代码块 -->
<%!
static {
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
}
%>
<!-- 声明内部类 -->
<%!
public static class User{
private String name;
private int age;
}
%>
<%= 12 %><br/>
<%= 12.13 %><br/>
<%= "字符串" %><br/>
<%= map %><br/>
<%= request.getParameter("username") %><br/>
<%
int i = 1;
if(i < 5){
System.out.println(i);
}
%>
<%
for(int j = 1; j <= 5; j++){
%>
<%= j %><br>
<%
}
%>
<%
String username = request.getParameter("username");
System.out.println(username);
%>
</body>
</html>
二. jsp中的注释
1. html注释:<!-- -->,会被翻译到java源代码中,在_jspService()方法中以out.writer输出到客户端
2. java注释:// 和 /* */,通常使用在表达式脚本和代码脚本中,会被翻译到java源代码中
3. jsp注释:<%-- %-->,可以注释jsp中的所有代码
三. jsp中的内置对象
jsp的内置对象是指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的9个对象
1. request:请求对象;2. response:响应对象;3. pageContext:jsp的上下文对象
4. session:会话对象;5. application:ServletContext对象;6. config:ServletConfig对象
7. out:jsp输出流对象;8. page:指向当前jsp的对象;9. exception:异常对象
四. jsp四大域对象
pageContext(PageContextImpl类):当前jsp页面范围内有效
request(HttpServletRequest类):一次请求响应内有效
session(HttpSession类):一次会话内有效
application(ServletContext类):整个web工程范围内有效
参考:https://blog.csdn.net/Archer__13/article/details/123775110
使用的优先顺序:按照从小到大的范围顺序(pageContext --> request --> session --> application)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>page1.jsp页面</h1>
<%
pageContext.setAttribute("key1","pageContext");
request.setAttribute("key2","request");
session.setAttribute("key3","session");
application.setAttribute("key4","application");
%>
<!-- 1.此时当访问page1.jsp页面时,都可以取到对应的值 -->
pageContext保存作用域的值:<%=pageContext.getAttribute("key1")%><br/>
request保存作用域的值:<%=request.getAttribute("key2")%><br/>
session保存作用域的值:<%=session.getAttribute("key3")%><br/>
application保存作用域的值:<%=application.getAttribute("key4")%><br/>
<!-- 2.此时当访问page1.页面时,此时取不到pageContext中的值-->
<%
request.getRequestDispatcher("/page2.jsp").forward(request,response);
%>
<!-- 3.此时当访问page1.jsp页面时,此时取不到pageContext和request中的值-->
<%
response.sendRedirect("http://localhost:8080/StudyJSP_war_exploded/page2.jsp");
%>
<!-- 4.当用其他客户端直接访问page2.jsp页面时,此时取不到pageContext、request和session中的值-->
<!-- 5.当重启服务器,然后直接访问page2.jsp页面时,此时取不到pageContext、request、session和application中的值-->
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>page2.jsp页面</h1>
pageContext保存作用域的值:<%=pageContext.getAttribute("key1")%><br/>
request保存作用域的值:<%=request.getAttribute("key2")%><br/>
session保存作用域的值:<%=session.getAttribute("key3")%><br/>
application保存作用域的值:<%=application.getAttribute("key4")%><br/>
</body>
</html>
五. jsp中的out输出和response.getWriter输出的区别
在响应时,首先将out缓冲区的数据追加在response缓冲区的末尾,最后将response缓冲区中的所有数据输出。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.write("out输出1 <br/>");
out.write("out输出2 <br/>");
response.getWriter().write("response输出1 <br/>");
response.getWriter().write("response输出2 <br/>");
%>
</body>
</html>
out.write()只能输出字符串,out.print()可以输出任意类型的数据(其本质是把数据都转化成字符串类型然后调用write方法输出)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.write("12");
out.write(12); //不会输出
out.print("12");
out.print(12);
%>
</body>
</html>
六. jsp常用标签
1. jsp静态包含(常用):<%@ include file="要包含的jsp页面路径"%>
会将要包含的页面的内容执行输出在当前页面,当修改包含页面时,当前页面也会随之变化
特点:①静态包含不会翻译被包含的jsp页面;②静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
主体内容<br>
<%@ include file="/page.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
包含的页面
</body>
</html>
2.jsp动态包含:<jsp:include page=" "></jsp:include>
动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置
特点:①动态包含会把包含的jsp页面翻译成java代码;②动态包含去调用被包含的jsp页面执行输出;③动态包含可以传递参数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
主体内容<br>
<jsp:include page="/page.jsp">
<jsp:param name="username" value="Tom"/>
<jsp:param name="password" value="root"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
包含的页面 <br/>
<%=request.getParameter("username")%>
</body>
</html>
3.jsp请求转发:<jsp:forward page="请求转发路径"></jsp:forward>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="page.jsp"></jsp:forward>
</body>
</html>