标签: javaweb
JSP:Java Server Pages,一种动态web资源的开发技术
API文档
JSP 2.3 API - Apache Tomcat 8.0.30
JSP本质是一个servlet.
每个JSP页面在第一次被访问时,WEB容器会把请求交给JSP引擎(即一个JAVA程序)处理。JSP引擎先将JSP翻译成一个_jspServlet
(实质也是一个servlet),然后按照servlet的调用方式进行调用。
work
目录,这jsp类的父类是org.apache.jasper.runtime.HttpJspBase
,这个HttpJspBase
类继承自HttpServlet
_jspService
方法。_jspService
方法中通过out.write()
写出来;JSP中的Java代码会原封不动的搬到_jspService
方法中。_jspService
方法中提前准备好了一些对象供JSP调用,如:out,page,application,request,response
等等。下面以demo1.jsp
为例,展示对应的类%CATALINA_HOME%\work\Catalina\localhost\hello\org\apache\jsp\demo1_jsp.java
中的部分代码
示例1:demo1.jsp
<%@ page import="java.util.Date" %><%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/1/27 Time: 16:45 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo1</title>
</head>
<body>
当前时间时:
<% Date date = new Date(); out.write(date.toGMTString()); %>
</body>
</html>
示例2:_jspService
方法中代码片段
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>demo1</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("当前时间时:\r\n");
Date date = new Date();
out.write(date.toGMTString());
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
示例3:_jspService
方法中一些定义的对象
final javax.servlet.jsp.PageContext pageContext;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
<%=变量或表达式 %>
脚本表达式(无分号),用于输出数据。<% %>
中一样),单个片段可不完整。_jspService
方法外。语法:<%! java代码 %>
。<%-- 注释 --%>
,注释的内容不会发给浏览器。<%@ 指令 属性名="值" %>
。 request,response,session,application,config,page,exception,out,pageContext
关于上述语法的一些说明
page指令语法:
<%@ 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" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ]
%>
errorPage
:错误提示页面。也可在web.xml
的<error-page>
标签配置,异常处理页面。在page指令设置的优先级高于在web.xml
配置。pageEncoding
:JSP引擎以何种码表翻译JSP,该值需和JSP文件的保存编码一致,且若要在浏览器正确显示,还要和contentType
一致。动态包含(运行时包含):request.getRequestDispatcher("/public/head.jsp").include(request,response)
,涉及到的jsp会生成单独的servlet,即有多个servlet,在浏览器访问时包含。静态包含性能优于动态包含
JSP常用标签
<jsp:include>
:pageContext.include(),动态包含<jsp:forward>
<jsp:param>
JSP引擎在调用JSP对应的_jspServlet
时,会传递和创建9个web开发相关的对象供使用。后两者(out
和pageContext
)为JSP独有
out隐式对象:用于向客户端发送文本数据。通过调用pageContext
对象的getOut
方法返回,类型为JspWriter
,作用和ServletResponse.getWriter
返回的PrintWriter
对象相似。
JspWriter
相当于自带缓存功能的PrintWriter
,设置page指令的buffer属性课调整缓存大小。满足如下条件之一,out对象才调用ServletResponse.getWriter
方法,并通过返回的PrintWriter
对象将out对象的缓冲区的内容真正写入到servlet引擎提供的缓冲区中:
例子:
<%
out.write("out.write<br/>");
response.getWriter().write("response.getWriter.write<br/>");
%>
浏览器显示:
response.getWriter.write
out.write
可见,由于out有缓冲,所以后显示。
pageContext对象:是JSP技术中最重要的一个对象,它代表JSP页面的运行环境
Class PageContext的API文档
javax.servlet.jsp:Class PageContext
javaweb中的四个域:
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute(java.lang.String name)
查找各个域中的属性,是PageContext
从父类javax.servlet.jsp.JspContext
继承的,实现了父类的抽象方法。会依次从page,request,session,application
域中寻找相应的属性,找到为止。
jsp映射
在webxml
的<servlet>
标签中加<jsp-file>
标签,其他的和servlet映射一样
查找jsp页面中的错误
JavaBean是一个遵循特定写法的java类,JavaBean常用于封装数据,具有如下热点:
JSP中提供了三个关于JavaBean的标签:
<jsp:useBean>
:用于在JSP页面中查找或实例化一个JavaBean组件<jsp:setProperty>
:用于在JSP页面中设置一个JavaBean组件的属性<jsp:getProperty>
:用于在JSP页面中获取一个JavaBean组件的属性一些细节
<jsp:useBean>
标签的标签体只在实例化bean时才执行<jsp:setProperty>
可用请求参数给bean属性赋值,支持8种基本数据类型的转换(把客户机提交的字符串转成相应的8种基本类型赋到bean的属性上)property="*"
,用所有请求参数为bean赋值,请求参数名称和bean属性名称必须要一致<jsp:getProperty>
标签输出结果为“null”字符串作者@brianway更多文章:个人网站 | CSDN | oschina