目录
【前言】
Servlet有以下两个缺陷:
- Servlet中编写嗯的HTML标签都必须在Java字符串中,使发送Http响应十分繁琐。
- 所有的文本和HTML都必须硬编码,只要修改,就需要重新编译。
JSP解决了这两个问题:
- JSP不是代替Servlet,而是对Servlet的补充。
- JSP页面是在JSP容器中运行的,Servlet容器一般也是JSP容器。
JSP实现过程
来自百度:JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,JSP 使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑,从而网页逻辑与网页设计的显示分离。支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
一个JSP页面可以被分为以下几部份:静态数据、JSP指令、JSP脚本元素和变量、JSP动作、用户自定义标签。
-
第一次请求JSP页面时,每个JSP页面会被自动转换为一个JSP页面的实现类。一般是实现了
javax.servlet.jsp.JspPage
接口或其子接口javax.servlet.jsp.HttpjspPage
的Java类。因为JspPage
是javax.servlet.Servlet
的子接口,所以,每个JSP页面也是一个Servlet。 -
如果转换成功,(转换成 java 代码)容器将会加载和执行它的字节码文件,它将有与servlet一样的生命周期。
-
在同一个JSP页面的后继请求中,Servlet/JSP容器会查看这个JSP页面是否被修改过,如果修改过,就会被重新转换和编译,如果没有,则会执行执行。因此,第一次调用JSP页面的时间总是会比后继调用耗费的时间久。
日期转化
//yyyy/mm/dd hh:mm:ss
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd hh:mm:ss");
//Date 类型 ——> 常用类型
String fdate = sdf.format(date);
System.out.println(date);
System.out.println(fdate);
//常用类型 ——> Date 类型
Date date2 = sdf.parse(fdate);
System.out.println(date2);
在JSP中加入Java代码
<%@page import="java.util.Date" %>
<%@page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello word</title>
</head>
<body>
<%
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd");
String s = df.format(new Date());
out.print(s);
%>
</body>
</html>
【注意】
- java代码要用<% 和 %>包起来,并且可以放在JSP页面中的任何位置。
- 为了导入一个JSP页面中要用到的Java类型,可以使用page指令的import属性
<%@page import="java.util.Date" %>
。如果没有导入则需要使用类的全名。
JSP注释
(1)JSP注释:以<%-- 开头,以 --%>结尾。JSP注释的内容不会被发送到浏览器,也不能进行嵌套。
(2)HTML注释:以< !-- 开头,以–>结尾。这部分注释不被容器处理,而是被浏览器处理。
JSP中的隐式对象:
隐式对象就是容器默认提供的对象,在jsp页面中,不需要实例化就可以随意使用的对象。
在Servlet中,我们可以使用容器中提供的HttpRequest、HttpResponse以及获取HttpSession等对象。在JSP中,我们可以通过下表中的隐式对象来使用相关对象。
pageContext(当前页面) < requestContext(在当前请求) < session(当前session中) < application(sevletContext)
- 从request对象中获取userName参数,直接用 request. 就行
<%
String username = request.getParameter("userName");
%>
-
pageContext对象代表了一个页面的全局环境。提供了一个页面有用的上下文信息。通过它,可以访问Servlet相关的各种对象。例如:
getRequest(); getResponse(); getServletContext(); getServletConfig(); getSession();
pageContext还提供了两个重要的存取属性的方法:
setAttribute()
和getAttribute();
属性可以保存在以上 4 种范围中:void setAttribute(String name, Object value, int scope);
pageContext.setAttribute("username", "zs", PageContext.APPLICATION_SCOPE);
如果调用:
pageContext.setAttribute("username", "zs");
则默认的存储范围是page。 -
隐式对象out是
javax.servlet.jsp.JspWriter
的一个实例。该方法类似HttpServletResponse
中调用调用getWriter()
获得的PrintWriter
对象,我们 可以使用它的print方法将信息发送给浏览器。
例如:
out.println("welcome");
out.println(session.getId());
-
默认情况下,JSP将页面内容设置为text/html。如果想发送不同类型的内容,就必须调用
response.setContentType()
设置内容类型。
例如:
response.setContentType("text/json");
指令
1 page指令
利用page指令可以就当前 JSP 页面的某些方面对 JSP 转换器提出指示。语法格式如下:
<%@ page attr="value" attr2="value2" ... %>
attr代表属性。page指令的属性列表如下:
import :指定导入的一种或多种Java类型。例如:import=“java.util.List”。例如通配符 还可以导入整个包。import=“java.util.*”,导入多种类型时,类型之间用逗号隔开。例如:import="java.util.List,java.io.PrintWriter"
。下面包中的所有类型都是隐式导入的:
java.lang;
java.servlet;
javax.servlet.jsp;
session:值为true时,表示页面参与session管理,否则不参与;默认值为true。如果之前还没有HttpSession实例,那么调用JSP页面将会创建一个。
pageEncoding:指定页面的编码方式。默认为ISO-8859-1。
isErrorPage:将一个jsp页面设置成一个错误处理页面。
errorPage:用来指明错误处理页面。
2 include指令
可以将另一个页面的内容放到当前的JSP页面中。
<%@ include file="url" %>
其中,url若是以“/”开头,则表示以服务器根节点开始的绝对路径,如果不以“/”开头,则表示相对于当前页面的相对路径。
脚本元素
脚本元素将java代码和jsp混合在一起。脚本元素包括:scriptlet、声明、表达式。
1 Scriptlet
Scriptlet 就是一个java的代码块,可以在里面写入java代码,以<%
开始,以%>
结束。
<%
for(int i = 0; i <10; i++) {
}
%>
注意:在一个Scriptlet中声明的变量,在其他的Scriptlet中是可见的。
2 声明
声明用来声明在JSP中使用的变量和方法。声明需要用<%!
和%>
包起来。例如:
<%!
public void printTT(){
System.out.print("TTTTTT");
}
%>
声明可以放在JSP中的任意位置,并且一个JSP页面可以有任意个数的声明。
我们还可以在jsp的声明中覆盖jsp的生命方法:jspInit
和jspDestory
<%!
public void jspInit(){}
public void jspDestory(){}
%>
3 表达式
表示式的运算结果会被隐式的填入到 out
的 print
方法中。表达式以<%=
开始,以%>
结束。
Today is <%=java.util.Calendar.getInstance().getTime() %>
注意:表达式的后面不需要分号。
动作
1 forward
forward用来跳转到不同的资源。
<jsp:forward page="/jsp/id.jsp">
<jsp:param name="text" value="请登录" />
<jsp:forward>
2 错误处理
可以使用page指令的isErrorPage指令,将一个jsp页面设置成一个错误处理页面。
<%@page isErrorPage="true" %>
错误信息:
<%
out.println(exception.getMessage());
%>
<%@page errorPage="err.jsp" %>
<%
Integer a = null;
a.toString();
%>