JSP
原理
客户端访问服务器,无论是访问servlet,.jsp文件或者.html文件,其实都是在访问servlet。
对于html和图片:http://blog.csdn.net/hjjk123/article/details/5459268。
.jsp在服务器中被访问的时候,服务器会先把jsp文件翻译成一个servlet,然后再去访问它。
比如Tomcat服务器,会把翻译好的jsp文件对应的servlet放在其work的Catalina目录下的:
F:\Tomcat 7.0\work\Catalina\localhost\jsp\org\apache\jsp\index_jsp.java
localhost是一个主机名,jsp是这个web应用的名,org\apache\jsp这个目录结构是固定的,index_jsp.java名字中间的"_"相当于"."。
JSP页面中的HTML内容称之为JSP模板元素。
<%= %>专门用来输出数据,称为脚本表达式。对应源码out.print();
<% %>脚本片段,只能出现java代码,不能出现其他的模板元素,代码会被原封不动的放到Servlet的_jspService方法中。
<%! %>JSP声明会被放在service方法外面,service方法所属类中,可以定义方法,声明成员变量,写静态代码块等等。还可以覆盖类的方法,如public void jspInit(),public void jspDestroy()。
<%-- --%>JSP注释 用JSP注释的东西不会发送给浏览器,而用HTML注释的内容会发送给浏览器。
服务器中将JSP翻译成servlet的程序,我们称之为JSP引擎
JSP指令(directive)是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。JSP2.0规范中共规定了三个指令:
page,include,taglib
其基本语法格式<%@ %>
举例:<%@ page contentType="text/html;charset=gb2312" %>
同一个指令有多个属性,可以分开写也可以在一个指令中写。
page指令:
无论page指令出现在JSP页面中什么位置,都是作用整个JSP页面。
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ] 置为false才是线程安全的implements singleThreadModel
[ info="text" ] 可以通过info属性带的信息
[ errorPage="relative_url" ] 指定当页面出问题了,比如脚本片段里面有1/0…跳到哪个页面。errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,error-code也可以,<location>元素指定以“/”开头的错误处理页面的路径。
如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
[ isErrorPage="true | false" ] 如果这个页面是错误处理页面显式声明为true。
设为true,jsp对应的servlet中会添加类似:
Throwable exception = org.apache.jasper.ruantime.JspRuntimLibrary.getThrowable(request);
if(exception != null){
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
这样的代码,把excepiton传进来。我们可以直接在jsp中拿出来excepiton。
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语句。
page指令的contentType属性还具有说明JSP源文件的字符编码的作用。控制浏览器以什么格式打开
[ pageEncoding="characterSet | ISO-8859-1" ] 服务器以什么格式翻译当前页面。
[ isELIgnored="true | false" ] 是否忽略EL表达式,false不不忽略。EL表达式可以很方便的获取域里面数据。
%>
JSP 引擎自动导入下面的包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
include指令
静态包含 编译时包含
包含页头页脚用。
<%@include file=”/public/foot.jsp” %>静态包含包含的所有JSP会被翻译成一个servlet。
注意页头页尾文件不要乱写东西。
动态包含 运行时包含
<% request.getRequestDispacher(“/public/head.jsp”).include(request,response); %>
动态包含,每次都要重新去加载,速度慢一些。被包含的JSP会被翻译成多个servlet。
taglib指令
用于导入标签库
<%@taglib uri="/struts-tags" prefix="s" %>
这句就是导入struts标签库,并使用别名s,以下就是使用示例。
<s:fielderror fieldName="name" theme="simple"/>
修改eclipse中jsp模板参考目录:F:\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\templates\velocity\welcome