3.JSP入门
本章目标
- JSP技术简介
- JSP执行原理
- 内置对象
- 四大作用域
本章内容:
一、 JSP技术简介
1、什么是JSP
JSP是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP、PHP的一个通病——脚本级执行。Sun公司借助自己在Java上的不凡造诣,在Java应用程序和Java Applet之外又有了新的硕果,这就是JSP——Java Server Page
技术。JSP可以在Servlet和JavaBean的支持下,完成功能强大的站点程序。
2、JSP的特点
- 将内容的生成和显示相分离
- 强调可重用的组件
- 采用标识简化页面开发
3、JSP与ASP、PHP的比较
由于只看JSP的特点很难直观的发现JSP的优势,下面我们对三种目前常用的Web开发技术的性能做一个比较。
我们为这三种语言分别做循环性能测试及存取Oracle数据库数据的测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000 * 20000的循环。而ASP、PHP测试的是2000* 2000循环(少一个数量级),却分别用了63秒和84秒(参考PHPLIB)。
数据库测试中,三者分别对Oracle8i进行1000次的添加(Insert)、更改(Update)、查找(Select)和删除(Delete)操作,JSP需要13秒,PHP需要69秒,ASP则需要73秒。
二、JSP执行原理
1、JSP入门
下面是一个简单的jsp入门示例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>
欢迎光临
</title>
</head>
<body bgcolor="#ffffff">
<%
java.util.Date now = new java.util.Date();
out.println("当前时间是:"+now);
%>
<h1>
你好,这就是一个JSP页面,简单不?
</h1>
</body>
</html>
2、JSP执行原理
JSP 页面(.jsp)—->Servlet源文件(.java)—->Servlet类(*.class)———>执行service方法给客户端进行响应
3、JSP页面组成
JSP页面包含以下内容
动作元素、指令元素无须掌握
3、指令(page)
page 指令用于设置 JSP页面的属性
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- contentType=“text/html; charset=UTF-8”:设置响应内容的编码
- pageEncoding=“UTF-8”:指jsp页面的编码
4、脚本(声明 小脚本 表达式)
JSP脚本元素是JSP代码中使用的最频繁的元素,特别是Scriptlets。脚本元素把JSP中所有的一切都集中在一起,它通常是用Java编写的脚本代码。
脚本元素有三种格式:
-
表达式 <%= expression %>
-
声明 <%! declaration; [ declaration; ]+ … %>
-
Scriptlets <% 代码段 %>
<%–声明–%> <%! String msg=“abcde”; public void test(){ } %> <%–代码段–%> <% Date d=new Date(); //out.print(d); test(); %> <%–表达式–%> <%=d%>
4.1、表达式
表达式元素表示的是一个在脚本语言中被定义的表达式,在运行后被自动转化为字符串,然后插入到这个表达式所在JSP文件中的位置。因为表达式的值已经被转化为字符串,所以能在一行文本中插入这个表达式。
其语法为: <%= expression %>
<%@ page contentType="text/html; charset=GBK" %>
<%=new java.util.Date().toLocaleString() %>
<%="银行卡密码:" %>
<%=123456%>
4.2、声明
声明用来在JSP程序中声明变量和方法,可以一次性声明多个变量和方法,声明语句要使用“;”结尾,当然声明要符合Java编程规范。
其语法为: <%! declaration; [ declaration; ]+ … %>
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
4.3、代码段
JSP允许将编写的Java代码块嵌入到JSP中。具体做法是:将Java代码段置于“<%”和“%>”之间。其用法与表达式类似,只不过在标记开始处没有等号,在标记结尾之前要有分号。
<%
Date d=new Date();
//out.print(d);
test();
%>
5、注释
//写在java代码中
/**/写在java代码中
<!--客户端注释--> 在浏览器中能看到
<%--服务器端注释--%>在浏览器中看不到
6、实例
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
String msg="abcde";
public void test(){
}
%>
<%
Date d=new Date();
//out.print(d);
test();
%>
<%=d%>
</body>
</html>
三、内置对象
1、什么是内置对象
JSP 内置对象是 Web 容器加载的一组类它不像一般的Java对象那样用”new”去获取实例,而是可以直接在JSP页面使用的对象, 内置对象的名称是 JSP 的保留字,JSP 使用 Java 定义的内置对象来访问网页的动态内容。
2、九大内置对象
这些对象,我们在页面可以直接拿使用,无须创建
内置对象 | 类型 | 作用域 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | request |
response | javax.servlet.http.HttpServletResponse | response |
pageContext | javax.servlet.jsp.PageContext | page |
session | javax.servlet.http.HtpSession | session |
application | javax.servlet.jsp.ServletContext | application |
out | javax.servlet.jsp.JspWriter | page |
config | javax.servlet.ServletConfig | page |
page | java.lang.Object | page |
exception | java.lang.Throwable | page |
-
request:HttpServletRequest类型,代表的请求对象
request.setAttribute("re", "request"); <%=request.getAttribute("re")%>
-
response:HttpServletResponse类型,代表的响应对象
response.sendRedirect("two.jsp");
-
out:JSPWriter类型,jsp页面的输出流对象
out.print("hello");
-
pageContext:PageContext类型,大管家,可以得到其他的内置对象,可以给四个范围存取数据
pageContext.setAttribute("pa", "page");//将数据放到page范围 <%=pageContext.getAttribute("pa")%> //可以指定范围放数据 pageContext.setAttribute("goods", "土豆", PageContext.REQUEST_SCOPE); pageContext.setAttribute("goods", "土豆", PageContext.SESSION_SCOPE); pageContext.setAttribute("goods", "土豆", PageContext.APPLICATION_SCOPE);
-
session:HttpSession,代表了一次会话,会话,相当于客户端和服务器的一次通讯过程
Http协议:无状态,本次请求过程中服务器并不会记忆前一次请求的时候传递给服务器的数据
会话建立:第一次向服务器发送请求的时候
会话结束:浏览器关闭的时候
服务器会为每一个会话维护一个session对象,session对象中的数据可以在一次会话的多个请求之间共享,只要在每一次请求的时候将数据存放到session中,那么后续请求都能得到session中的数据,前提是多个请求隶属于一个会话
<% session.setAttribute(“name”, “admin”); %>
获取数据
<% if(session.getAttribute(“name”)!=null){ String name=(String)session.setAttribute(“name”); } %>
-
application:ServletContext类型,和整个web应用关联
-
生命周期开始与应用启动,结束于应用停止或者web应用重新加载的时候
-
在web项目运行期间只有一个,全局共享,在Servlet中可以按照如下方式得到
ServletContext context=req.getServletContext();
-
底层是一个map结构,可以存放数据,存放的数据全局共享,可以实现多个Servlet之间的通信 存数据
ServletContext context=req.getServletContext(); context.setAttribute(“online”, “1”);
取数据
ServletContext context=req.getServletContext(); String str=(String)context.getAttribute(“online”); System.out.println(str);
jsp页面使用
application.setAttribute(“app”, “application”); <%=application.getAttribute(“online”)%>
-
-
page:Object 相当于this。指的jsp页面转换之后的java类的对象
-
exception:Exception类型
第一步:要在page指令使用errorPage中指定错误页面(当前页面发生异常的时候会请求转发到错误页面)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" errorPage="err.jsp"%>
第二步,在错误页面中可以使用exception接收前一个页面产生的异常对象
注意:page指令中指定isErrorPage=“true”
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> please wait..... <%=exception%> </body> </html>
-
config:ServletConfig,读取jsp页面的初始化配置信息
<%=config.getInitParameter(“code”)%>
<servlet> <servlet-name>js</servlet-name> <jsp-file>/three.jsp</jsp-file> <init-param> <param-name>code</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>js</servlet-name> <url-pattern>/js.do</url-pattern> </servlet-mapping>
注意事项:必须使用配置的路径访问jsp页面,才能读到初始化配置信息,用jsp的原始路径访问,就得不到
四、作用域
1、作用域范围
里面放的数据的作用域范围不同
2、page范围
数据当前页面有效:pageContext.setAttribute(“page”, “page”);
此处用到了
<jsp:forward>
这属性动作元素中的内容,由于这块内容我们已经砍掉了,大家知道他属于服务器端跳转就可以,无须延伸。
3、request范围
一次请求中有效。由a请求转发到b,a中存,b中可以取出来,但是如果由a重定向到b,b中取不出来 requset.setAttribute()
前提必须是服务器端跳转才能起作用
4、session范围
一次会话中有效,一次会话中的多个请求需要共享数据,可以放到session中 session.setAttribute()
5、application范围
web项目运行期间全局有效 application.setAttribute()
思维导图
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18843137