JSP简介
JSP(Java Server Pages)一种Java servlet,主要实现Java
web应用程序的用户界面部分。标签通常以<%开头 以%>结束。
JSP是一种Java servlet,主要实现Java
web应用程序的用户界面部分,结合HTML、XML元素来编写。
JSP可以通过网页获取用户输入数据、访问数据库以及其它数据源,然后动态创建网页。
JSP与JavaScript相比,JavaScript很难与服务器交互,所以不能提供复杂的服务(访问数据库、图像处理)。
JSP结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AeBU60ul-1617925538821)(media/0fe4da520f46d487e238fc6250130adb.png)]
网络服务器需要一个JSP引擎(容器)来处理来自客户端的JSP页面的请求。
JSP处理流程
浏览器发送一个HTTP请求给服务器。
web服务器识别出这是一个对JSP网页的请求,将该请求交给服务器的JSP容器来处理。
JSP容器从磁盘中载入JSP文件,然后将其转换为Servlet,并且将所有的JSP元素转换成Java代码。
JSP容器将Servlet编译成可执行的类,并且将原始请求传递给Servlet引擎。
web服务器某组件会调用Servlet引擎,然后载入并执行Servlet类。之后Servlet产生HTML格式的输出嵌入HTTP
response中交给服务器。
web服务器以静态HTML网页形式将HTTP response返回给浏览器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vnW26gLm-1617925538827)(media/8d400a1d79bf769296a3f586a292215e.png)]
JSP生命周期
JSP生命周期就是从创建到销毁的过程:1.编译阶段:servlet容器编译servlet源文件;2.初始化阶段:加载JSP对应的servlet类,创建实例,并调用方法;3.执行阶段:调用JSP对应的servlet实例的服务器方法;4.销毁阶段:调用与JSp对应的servlet销毁方法,然后销毁实例。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7nPj02U-1617925538830)(media/ec3b3ae43f0928b39bdde49e0e3538ac.png)]
JSP编译:当浏览器请求JSP页面时,JSP容器会检查是否要编译这个页面,如果这个文件没有编译过或者上次编译被修改过,那么就会编译这个文件。
编译步骤:
1.解析JSP文件
2.将JSP文件转换为servlet
3.编译servlet
JSP初始化:容器载入JSP文件后,JSP容器调用jspInit方法。如果需要自行执行自定义的JSP初始化任务,则覆盖jspInit()方法就可以了。
public void jspInit( ){
//初始化代码
//可以初始化数据库连接,打开文件和创建查询
}
JSP执行:JSP容器将会调用_jspService()方法,该方法需要一个HttpServletReques对象和一个HttpServletResponse对象作为参数。
void _jspService(HttpServletReques a, HttpServletResponse b){
//服务器处理代码
}
JSP清理:JSP网页从容器中被移除,调用jspDestroy()方法等价于servlet中的销毁方法,你也可以自定义覆盖该方法。
public void jspDestory( ){
//清理代码
}
实例:
<%@pagelanguage=」java」contentType=」text/html」;charset=UTF-8」pageEncoding=」UTF-8」%>
<html>
<head>
<title>life.jsp</title>
</head>
<body>
<%!
priavte int initVar=0;
priavte int serviceVar=0;
priavte int destroyVar=0;
%>
<%!
public void jspInit( ){
initVar++;
System.out.println(「jspInit( ):JSP被初始化了」+initVar+」次」);
}
public void jspDestroy( ){
destroyVar++;
System.out.println(「jspDestroy( ):JSP销毁了」+destroy+」次」);
}
%>
<%
serviceVar++;
System.out.println(「_jspService():JSP共响应了」+serviecVar+」次请求」);
String content1=」初始化次数:」+initVar;
String content2=」响应客户请求次数:」+serviceVar;
String content3=」销毁次数:「+destroyVar;
%>
<h1>JSP测试</h1>
<p><%=content1 %></p>
<p><%=content1 %></p>
<p><%=content1 %></p>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivJJWDzk-1617925538834)(media/a126d7f49bdf291193a9361f82a0eaf7.png)]
JSP语法
脚本程序:包含任意量的Java语句、变量或表达式。任何文本、HTML标签、JSP元素必须写在脚本程序外面。
格式:
<% 代码片段 %>
或者
<jsp:scriptlet>
//代码片段
</jsp:scriptlet>
<% out.println(「你的IP地址」+request.getRemoteAddr( )); %>
JSP声明:在JSP文件中必须先声明变量和方法后,才能使用它们。
格式:
<%! declaration; [ declaration; ]+ … %>
或者
<jsp:declaration>
//代码片段
</jsp:declaration>
<%! int i = 0 %>
JSP表达式:在JSP页面执行的语法;先转化成String,然后插入到表达式出现的地方。
格式:
<%= 表达式 %>
或者
<jsp:expression>
//表达式
</jsp:expression>
<%= (new java.util.Date()).toLocaleString( )%>
JSP注释:为代码作注释以及将某段代码注释掉
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDFUqQuo-1617925538836)(media/c25202ef7c859669fb421f7a5bca796e.png)]
JSP指令:用来设置JSP页面的属性
格式:
<%@ directive attribute=」value」%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGH9GMQm-1617925538839)(media/120bae09c20f0acd3a4cc2dd33ea0704.png)]
JSP字面量:JSP定义了布尔类型:true和false;整型(int);浮点型(float);字符串(string)以单引号或者双引号结束。
JSP指令
Page指令:为容器提供当前页面使用说明,一个JSP页面可以包括多个page指令。
格式:
<%@ page attribute=」value」%>
或者
<jsp:directive.page attribute=」value」/>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VVsVAeP-1617925538840)(media/526a153900e483efe162bc99d61caa97.png)]
include指令:被包含的文件可以是JSP文件、HTML文件或文本文件
格式:
<%@ include file=」文件相对url 地址」%>
Taglib指令:JSP API允许用户自定义标签,引入自定义标签(库路径、自定义标签)
格式:
<%@ taglib url=」uri」prefix=」prefixofTag」%>
JSP动作元素
JSP动作元素:在请求处理时起作用,利用JSP动作元素可以动态插入文件、重用JavaBean组件、用户重定向到另外的页面、为Java插件生成HTML代码。
格式:
<jsp:action_name attribute=」value」/>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jRFgrx3p-1617925538842)(media/959d86b4ca8d2afc414ba5c65d844e89.png)]
常见的属性:所有的动作要素都有两个属性:id属性和scope属性。
id属性:动作元素的唯一标志,可以在JSP页面中引用
scope属性:识别元素的生命周期,scope属性定义了相关联id对象的寿命。具体体现在(a)page
(b)request ©session (d)application
JSP隐式对象
JSP隐式对象:JSP容器为每个页面提供的Java对象,开发者可以直接使用它们。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qILgoBFW-1617925538844)(media/c385a33443f69f6c72dc246057716b87.png)]
JSP客户端请求
JSP客户端请求:当浏览器请求一个网页时,会向网络服务器发送HTTP
request请求,JSP容器会产生request对象来获取HTTP的信息表头,包括表单数据、cookies、HTTP方法。
<%
Enumeration headerNames = request.getHeaderNames( );
while(headerNames.hasMoreElements( ){
String paramName = (String)headerNames.nextElement( );
out.print(「<tr><td>」+paramName+」</td>\n」);
String paramValue = request.getHeader(paramName);
out.print(「<td>」+paramValue +」</td></tr>\n」);
}
%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvSRznwr-1617925538846)(media/ecb6603a5a83321119050017250be012.png)]
JSP服务器响应
JSP服务器响应:JSP容器处理后结果传回到客户端,可以通过response变量设置HTTP状态和客户端发送数据。JSP容器会创建response对象来处理创建HTTP信息头的接口,通过使用这个对象,开发者可以添加新的cookie或时间戳,还有HTTP状态码。
<%
//设置每隔5秒自动刷新
response.setIntHeader(「Refresh」,5);
//获取当前时间
Calendar calendar = new GregorianCalendar( );
String am_pm;
int hour=calendar.get(Calendar.HOUR);
int minute=calendar.get(Calendar.MINUTE);
int second=calendar.get(Calendar.SECND);
if(calendar.get(Calenndar.AM_PM)==0)
am_pm = 「AM」;
else
am_pm=」PM」;
String CT = hour+」: 」+second+」: 」+am_pm;
out.println( 「当前时间:」+CT+」\n」);
%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y0cLnLyN-1617925538847)(media/f24f2ccea1a4d1bc96f9ffe7d1774d07.png)]
JSP过滤器:可以动态地拦截请求和响应。具体体现在1.在客户端的请求后访问后端资源之前,拦截请求
2.在服务器的响应发送客户端之前,处理响应。
根据类型区分可以为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orqxVDQp-1617925538849)(media/1267ec3b2181e6d0bfb78bcd9a766514.png)]
过滤器通过Web部署描述符(web.xml)中的XML标签来声明。然后映射到各个部署的Servlet名称或URL模式。当web容器启动web应用程序时,会通过web.xml中的声明来为每一个过滤器创建一个实例。过滤器(Filter)的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有Servlet之前。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v89Sxdpe-1617925538850)(media/c98e604d363f660c49046b024851d8f2.png)]
FilterConfig使用:
Filter的init方法提供一个FilterConfig对象。
web.xml配置
定义过滤器,映射到一个URL或Servlet。
<filter>//指定一个过滤器
<file-name>LogFilter</file-name>//为只当过滤器指定一个名字
//指定过滤器完整的限定类名
<file-class>com.runoob.test.LogFilter</file-class>
//为过滤器指定初始化参数
<init-param>
<param-name>Site</param-name>//指定参数名字
<para-value>测试</para-value>//指定参数的值
</init-param>
</filter>
<!–Servlet映射–>
//设置一个Filter所负责拦截的资源;通过Servlet名称或者访问的请求路径
<filter-mapping>
//设置filter注册名称,过滤器的名字
<filter-name>LogFilter</filter-name>
//设置filter所拦截的路径
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<!–类名–>
//过滤器所拦截的Servlet名称
<servlet-name>DisplayHeader</servlet-name>
<!–所在包–>
<servlet-class>com.runoob.test.DisplayHeader</servlet-class>
</servlet>
//将URL模式映射到某个Servlet,即该Servlet处理的URL
<servlet-mapping>
//servlet名字
<servlet-name>DisplayHeader</servlet-name>
<!–访问网址–>
//指定相对于Servlet的URL的路径
<url-pattern>/TomcatTest/DisplayHeader<url-pattern>
</servlet-mapping>
在init方法使用FilterConfig对象获取参数:
public void init(FilterConfig config) throws ServletException {
//获取初始化参数
String site = config.getInitParameter(「Site」);
//输出初始化参数
System.out.println(「网站名称:」+site);
}
JSP XML数据处理
使用JSP发送XML
格式:
<%@ page contentType =」text/xml」%>
使用JSP处理XML
格式:
book.xml文件
<books>
<book>
<name>Padam History</name>
<author>ZARA</author>
<price>100</price>
</book>
<book>
<name>Great Mistry</name>
<author>NUHA</author>
<price>2000</price>
</book>
</books>
main.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml” %>
<html>
<head>
<title>JSTL x:parse Tags</title>
</head>
<body>
<h3>Books Info:</h3>
<c:import var=“bookInfo” url=“http://localhost:8080/books.xml”/>
<x:parse xml="${bookInfo}" var=“output”/>
<b>The title of the first book is</b>:
<x:out select="$output/books/book[1]/name" />
<br>
<b>The price of the second book</b>:
<x:out select="$output/books/book[2]/price" />
</body>
</html>
JSP JavaBean
JavaBean是特殊的Java类:提供一个默认的无参构造函数;需要被序列化并且实现了Serializable接口;可能有一系列可读写属性;可能有一系列的getter()或setter()方法。
JSP自定义标签
JSP自定义标签:用户自定义的JSP语言元素。当JSP页面包含一个自定义标签时,转换为servlet,标签转化为tag
handler的对象操作。JSP标签扩展可以让创建的新标签插入到一个JSP页面。
创建一个自定义标签。格式:
<ex:Hello />
要想创建自定义的JSP标签,首先必须先创建处理标签的Java类。
package com.runoob;
import javax.servlet.jsp.tagext;
import javax.servlet.jsp.*;
import java.io;
public class HelloTag extends SimpletagSupport {
public void doTag( )throws JspException ,IOException {
JspWriter out = getJspContext( ).getOut( );
out.println( “Hello Custom Tag!”);
}
}
重写了doTag( )方法,该方法使用了getJspContext(
)方法获取JspContext对象,并将“Hello Custom Tag!”传给JspWriter对象。
编译以上类,就必须将其复制到环境变量CLASSPATH目录中,在webapps\ROOT\WEB-INF\custom.tld,创建标签库。
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.runoob.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
这个时候,就可以在JSP文件中使用Hello标签了。
<%@ taglib prefix=”ex”uri=”WEB-INF/custom.tld”%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello />
</body>
</html>
输出结果:Hello Custom Tag!