JavaWeb -- Jsp
1. Jsp原理
work/Catalina/localhost/WebTest4/org/apache/jsp# 看到源码, JSp就是Servlet
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
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;
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
2. Jsp 语法
JSP模版元素
语法:<%= 变量或表达式%>
举例:当前时间:<%= new java.util.Date() %>
<%
多行java代码
%>
举例:
<%
int x = 10;
out.println(x);
%>
<p>这是JSP页面文本</p>
<%
int y = 20;
out.println(y);
%>
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.it315.org</H1>
<%
}
%>
<%!
java代码
%>
<%--注释信息--%>
<%@ 指令 属性名="值" %>
举例:<%@ page contentType="text/html;charset=gb2312"%>
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以写作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
<%@ 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="relative_url" ] //指定错误处理页面, 必须为相对路径“/”代表当前Web应用
[ isErrorPage="true | false" ] //翻译为Servlet的时候 会传递异常对象
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] //翻译到的Servlet 控制浏览器以什么码表来显示
[ pageEncoding="characterSet | ISO-8859-1" ] //通知服务器以什么码表来翻译Jsp
[ isELIgnored="true | false" ]
%>
<error-page> <exception-type>java.lang.NullPointerException</exception-type> //可以配置异常统一处理 <location>/errors/error_null.jsp</location> </error-page> <error-page> <error-code>404</error-code> //可以配置错误代码统一处理 <location>/errors/error_404.jsp</location> </error-page>
include指令
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的相对路径。 file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
<body> <font size="8"> <% String str = ""; out.write(str); %> <%@include file="/public/head.jsp" %> 中间内容!! <br/> //head.jsp foot.jsp 编译时也会合成一个,所以里面不需要其他标签,直接写内容即可!! <%@include file="/public/foot.jsp" %> </font> </body>
静态包含和动态包含的区别:
静态包含用: <%@include file="/public/head.jsp" %> 编译时包含,全被编译为一个Servlet文件
动态包含用: 转发 request.getRequestDispatcher("/public/head.jsp").include(request, response)运行时包含,每个Jsp都会有单独的Servlet,性能较差。
3. JSP运行原理和九大隐式对象
每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
-----------------------------------------------------------------
传递给这些方法的资源路径都只能是相对路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径
4. Jsp标签<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
<jsp:forward page="relativeURL | <%=expression%>" />
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>