程序员不会JSP真的可以吗???
JSP
一、什么是JSP
JSP(Java Server Pages),java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在。
二、JSP的工作原理
Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。
以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>简单使用JSP</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
- **JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!**内置对象有:request、page、session、application、out、response、config、pageContext、exception
2.1 JSP生命周期
JSP也是Servlet,运行时只有一个实例,JSP初始化和销毁时也会调用Servlet的init()和destroy()方法。另外,JSP还有自己初始化和销毁的方法
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
2.2 JSP语法
JSP代码可以分为两部分:
- 模板数据:就是HTML代码
- 元素:JSP页面中的java代码、JSP指令、JSP标签
2.3 JSP脚本
-
JSP的脚本就是JSP页面中的java代码,也叫做scriptlet。JSP的脚本必须使用<%%>括起来,不然会被当成是模板数据的!
-
JSP脚本有三种方式:
-
- <%%>【定义局部变量,编写语句】
- <%=%>(也称之为表达式输出)【输出各种类型的变量,int、double、String、Object等】
-
如果过多地使用<%%>会导致代码混乱,JSP还提供了一种scriptlet标签,使用此标签和<%%>有相同的功能,只不过它更美观了一些
2.4 JSP注释
<%--这是JSP注释--%>
<%--%>
//这是java的当行注释
//
/*这是java的多行注释*/
/**/
2.5 JSP指令
JSP指令用来声明JSP页面的相关属性,例如编码方式、文档类型等等
语法:
<%@指令 属性名="值" %>
2.5.1 page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
page指令常见属性:
- language=“java”
- extends=“package.class”
- import="{package.class | package.*}, …"
- session="true | false"
- buffer=“none | 8kb | sizekb”
- autoFlush=“true | false”
- isThreadSafe=“true | false”
- info=“text”
- 我们上网的时候,如果我们操作不当,或者服务器出错了,页面都是会出现友好提示的!比如 404页面等等,这个也能通过page指令来实现跳转到友好提示页面上!
- 1.jsp出现了错误,通过page指令的errorPage属性跳转到error.jsp页面上
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>该页面出错了!</title>
</head>
<body>
<%--模拟页面出错了!!!--%>
<%
int result = 2 / 0;
%>
你好呀
</body>
</html>
我们可以在我们可以在web.xml文件中全局设置错误页,只要发生了404错误或者空指针异常的错误都会跳转到error.jsp页面上
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>
2.5.2 include指令
举例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页头</title>
</head>
<body>
我是页头
<br>
<br>
<br>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>页头</title>
</head>
<body>
我是页头
<br>
<br>
<br>
</body>
</html>
在1.jsp中把页头和页尾包含进来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>包含页头和页尾进来</title>
</head>
<body>
<%@include file="head.jsp" %>
<%@include file="foot.jsp" %>
</body>
</html>
include指令是静态包含。静态包含的意思就是:把文件的代码内容都包含进来,再编译!,看一下jsp的源代码就知道了!
2.6 行为
2.6.1 param行为
- 当使用和行为引入或将请求转发给其它资源时,可以使用行为向这个资源传递参数。
2.6.2 forward行为
- 我们使用
request.getRequestDispatcher(String url).forward(request,response
)进行跳转。其实forward行为就是对其封装!
举例:访问1.jsp页面就跳转到head.jsp页面中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>访问1.jsp就跳转到head.jsp</title>
</head>
<body>
<jsp:forward page="head.jsp"/>
</body>
</html>
-
如果我要传递参数,就要在forward行为嵌套param行为
-
如果我要传递参数,就要在forward行为嵌套param行为
<jsp:forward page="head.jsp">
<jsp:param name="username" value="zhongfucheng"/>
</jsp:forward>
- 在head.jsp页面中获取到传递过来的参数
<%
String ss = request.getParameter("username");
%>
获取到的参数是:
<%=ss%>
2.6.3 directive行为
-
directive的中文意思就是指令。该行为就是替代指令<%@%>的语法的
-
- 相当于<%@include file="" %>
- 相当于<%@page %>
- 相当于<%@taglib %>
<jsp:directive.include file="head.jsp"></jsp:directive.include>
<jsp:directive.include file="foot.jsp"></jsp:directive.include>
- 使用该指令可以让JSP页面更加美观!
- 使用scriptlet行为``替代<%%>是同样一个道理
三、九大内置对象
3.1 request
- 内置对象request其实就是HttpServletRequest
3.2 page
- 内置对象page是HttpJasPage对象,其实page对象代表的就是当前JSP页面,是当前JSP编译后的Servlet类的对象。也就是说:page对象相当于普通java类的this
3.3 session
- 内置对象session其实就是HttpSession。
3.4 application
- 内置对象application其实就是ServletContext对象
3.5 out对象
out对象用于向浏览器输出数据,与之对应的是Servlet的PrintWriter对象。然而这个out对象的类型并不是PrintWriter,是JspWriter
一般我们在JSP页面输出都是用表达式(<%=%>),所以out对象用得并不是很多!
out对象的API
- int getBufferSize()【得到缓存大小】
- int getRemaining()【得到未使用缓存的大小】
- boolean isAutoFlush()
- void println()
- void flush()
- void close()
- void clearBuffer()
- void clear()
3.6 response
- 内置对象response其实就是HttpServletResponse
3.7 config
- 内置对象config其实就是ServletConfig
3.8 pageContext
pageContext是内置对象中最重要的一个对象,它代表着JSP页面编译后的内容(也就是JSP页面的运行环境)!
**pageContext作为域对象
-
类似于request,session,ServletContext作为域对象而言都有以下三个方法:
-
- setAttribute(String name,Objcet o)
- getAttribute(String name)
- removeAttribute(String name)
-
当然了,pageContext也不例外,pageContext也有这三个方法!
-
pageContext本质上代表的是当前JSP页面编译后的内容,作为域对象而言,它就代表着当前JSP页面(也就是page)!也就是说:pageContext域对象只在page范围内有效,超出了page范围就无效了!
-
pageContext本质上代表着编译后JSP的内容,pageContext还可以封装了访问其他域的方法!
-
上面的pageContext默认是page范围的,但pageContext对象重载了set、get、removeAttribute这三个方法
-
- getAttribute(String name,int scope)
- setAttribute(String name,Object value,int scope)
- removeAttribute(String name,int scope)
-
多了一个设置域范围的一个参数,如果不指定默认就是page。当然了,pageContext把request、session、application、page这几个域对象封装着了静态变量供我们使用。
-
- PageContext.APPLICATION_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.PAGE_SCOPE
**4种属性范围
到目前为止,我们已经学了4种属性范围了。
- page【只在一个页面中保存属性,跳转页面无效】
- requet【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】
- session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】
- application【在整个服务器中保存,所有用户都可以使用】
- 4个内置对象都支持以下的方法:
- setAttribute(String name, Object o )
- getAttribute(String name)
- removeAttribute(String name)
应用场景
- request:如果客户向服务器发请求,产生的数据,**用户看完就没用了,**像这样的数据就存在request域,像新闻数据,属于用户看完就没用的
- session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐
- servletContext:如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在servletContext域中,像聊天数据
3.9 exception
- **内置对象exception是java.lang.Exception类的对象,exception封装了JSP页面抛出的异常信息。**exception经常被用来处理错误页面
下一篇: Python 3 基础
推荐阅读