javascript
jsp技术通过java_JavaWeb之JSP技术总结
剛接觸JSP技術的時候讓我想起了在大學學的Asp+VBScript,記得當時我還用aspstudy做了一個小的新聞發布系統作為期末作品,也正是在那時候在盧哥盧老師的指導下走向編程的道路,對編程越來越感興趣。為什么會讓我想起asp呢?因為Jsp和它還挺類似的,asp本身就是把vbscript都放在asp頁面,沒有像asp.net那樣界面與邏輯分離,這樣更加清楚。
一、工作原理與生命周期
JSP編譯之后也是一個繼承HttpServlet的類,所以也能完成HttpServlet能完成的所有事。只是工作方式和Servlet不一樣,Servlet是先編譯后部署,而jsp是先部署后編譯。jsp是一個Servlet那它的生命周期也和Servlet一樣,只是它有自己的初始化和銷毀方法。
public void_jspInit() {}public void _jspDestroy() {}
我們可以查看下它生成的java類是什么樣的。在工作空間下找到下面的路徑.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp,會出現兩個文件,一個是.java文件,一個是.class文件,當客戶端第一次請求時Tomcat先將test.jsp文件轉化為.java文件,并將.java文件編譯成.class文件,該.class便是jsp對應的Servlet,編譯完之后再運行.class文件來響應客戶請求,以后客戶訪問會直接調用.class來響應,下面的代碼是.java的代碼。
/** Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.9
* Generated at: 2017-03-18 03:41:35 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.*/
packageorg.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;importcom.test.cyw.Person;public final class test_jsp extendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {private static final javax.servlet.jsp.JspFactory _jspxFactory =javax.servlet.jsp.JspFactory.getDefaultFactory();private static java.util.Map_jspx_dependants;private static final java.util.Set_jspx_imports_packages;private static final java.util.Set_jspx_imports_classes;static{
_jspx_imports_packages= new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes= new java.util.HashSet<>();
_jspx_imports_classes.add("com.test.cyw.Person");
}private volatilejavax.el.ExpressionFactory _el_expressionfactory;private volatileorg.apache.tomcat.InstanceManager _jsp_instancemanager;public java.util.MapgetDependants() {return_jspx_dependants;
}public java.util.SetgetPackageImports() {return_jspx_imports_packages;
}public java.util.SetgetClassImports() {return_jspx_imports_classes;
}publicjavax.el.ExpressionFactory _jsp_getExpressionFactory() {if (_el_expressionfactory == null) {synchronized (this) {if (_el_expressionfactory == null) {
_el_expressionfactory=_jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}return_el_expressionfactory;
}publicorg.apache.tomcat.InstanceManager _jsp_getInstanceManager() {if (_jsp_instancemanager == null) {synchronized (this) {if (_jsp_instancemanager == null) {
_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}return_jsp_instancemanager;
}public void_jspInit() {
}public void_jspDestroy() {
}public void _jspService(final javax.servlet.http.HttpServletRequest request, finaljavax.servlet.http.HttpServletResponse response)throwsjava.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method =request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,"JSPs only permit GET POST or HEAD");return;
}finaljavax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session= null;finaljavax.servlet.ServletContext application;finaljavax.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;try{
response.setContentType("text/html; charset=UTF-8");
pageContext= _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
_jspx_page_context=pageContext;
application=pageContext.getServletContext();
config=pageContext.getServletConfig();
session=pageContext.getSession();
out=pageContext.getOut();
_jspx_out=out;
out.write("\r\n");
out.write(""-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("\r\n");
out.write("
\r\n");out.write("\r\n");
out.write("
Insert title here\r\n");out.write("\r\n");
out.write("
\r\n");out.write("\r\n");
Person person=new Person("CuiYW",25);
out.write('\r');
out.write('\n');
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("");
}catch(java.lang.Throwable t) {if (!(t instanceofjavax.servlet.jsp.SkipPageException)){
out=_jspx_out;if (out != null && out.getBufferSize() != 0)try{if(response.isCommitted()) {
out.flush();
}else{
out.clearBuffer();
}
}catch(java.io.IOException e) {}if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);else throw newServletException(t);
}
}finally{
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
View Code
二、JSP指令
JSP的語法這塊比較簡單,就此略過。在新建jsp頁面時會在頁面的第一行會有類似下面的一行代碼,它就是jsp指令,
jsp指令主要來聲明jsp頁面的一些屬性,格式為,*表示一個或多個屬性。JSP最常見的有3種指令:Page,include,taglib.
1.Page指令
Page指令一般生命頁面屬性,多個屬性可以寫在一個Page指令或多個Page指令中。不過屬性只能出現一次,除了import屬性除外。Page指令中常見屬性如下:
說明語法格式
language屬性
language屬性主要用來聲明所使用的腳本語言種類,目前暫時只能使用Java語言。不過不排除以后可以使用如C、C++或其他語言的可能。language屬性的默認值也是java。
extends屬性
extends屬性用來指定該JSP頁面生成的Servlet是繼承于哪個父類,設定時必須指定該類的全名,即包名加類名。一般很少使用,而且必須慎重的使用,否則可能限制到JSP的編譯能力。
import屬性
import屬性用來指定導入的Java包,和Java語言基礎中的import語句作用類似。不過有些包在JSP編譯時就已經導入了,可以不用再進行導入
session屬性
session屬性用來指定該JSP頁面中是否可以使用session對象。如果設置為true,則表示該JSP頁面中可以使用session對象;如果設置為false,則表示該JSP頁面中不可以使用session對象。session屬性的默認值為true。
buffer屬性
buffer屬性用來指定輸出流是否具有緩沖區,以及設置緩沖區大小。如果設置為none,則表示輸出流不具有緩沖功能;如設置為具體的數據,如“40KB”,則表示設置的緩沖區大小為40KB。其默認值為8KB。
autoFlush屬性
autoFlush屬性用來指定緩沖區是否自動進行強制輸出。如果設置為true,那么當緩沖區滿的時候仍然能夠輸出正常;如果設置為false,那么當緩沖區滿的時候,將會產生異常。如果buffer屬性設置為none,那么就不能將autoFlush屬性設置為false。autoFlush屬性的默認值為true。
isThreadSafe屬性
isThreadSafe屬性用來指定該JSP文件是否支持多線程使用。如果設置為true,則表示該JSP文件支持多線程的使用,也就是表示該JSP文件能夠同時處理多個用戶的請求;如果設置為false,則表示該JSP文件不支持多線程的使用,也就是表示該JSP文件只能一次處理一個用戶的請求。isThreadSafe屬性的默認值為true。
info屬性
info屬性用來設置該JSP文件的相關信息,可以是任何的信息字符串,并通過Servlet.getServletInfo方法來取得該信息。
errorPage屬性
errorPage屬性用來設置如果當前JSP文件發生異常錯誤時,網頁重新跳轉到能夠處理異常的JSP文件。
isErrorPage屬性
isErrorPage屬性用來指定該JSP文件是否為能夠處理異常的JSP文件,其默認值為false。
contentType屬性
contentType屬性用來指定該JSP文件的MIME格式,以及網頁編碼格式。
pageEncoding屬性
pageEncoding屬性用來制定網頁的編碼格式
isELIgnored屬性
isELIgnored屬性用來指定該JSP文件是否支持EL表達式。如果設置為true,則表示JSP文件講忽略EL表達式,也就是EL表達式不會被執行;如果設置為false,則表示EL表達式不會被忽略,該EL表達式將會被執行。
下面來做個實驗主要使用下errorPage、isErrorPage屬性。
首先新建一個錯誤頁面error.jsp,isErrorPage="true"
Insert title herethisis error page
View Code
在test.jsp制造一個錯誤 1/0,拋出異常 errorPage="/error.jsp"
Insert title hererequest.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");%>
View Code
瀏覽器請求test.jsp時會跳轉到錯誤頁面error.jsp
2.include指令
include指令格式:,relativeURL可以是本應用的jsp或html文件路徑,用它可以將復用的頁面分離出來,類似模板頁的功能。
還是接著上面的demo,新建一個jsp頁面,part.jsp
Insert title hereView Code
在error.jsp中使用include指令引入part.jsp
this is error page
總結
以上是生活随笔為你收集整理的jsp技术通过java_JavaWeb之JSP技术总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: import的用法python_Pyth
- 下一篇: linux下mysql数据库目录迁移_l