jsp生成頁面
訪問xxxx/xxx/hello.jsp?name=tom。
1.查找jsp對應的servlet存在,就直接訪問。
2.不存在,就解析jsp,翻譯成servlet源文件,編譯成servlet類,初始化運行。
只有第一次訪問,或者修改jsp或者編譯后的servlet文件刪除了才會重新解析編譯。
Jsp語法
Jsp指令
Jsp使用<%@ 指令名 屬性=“值”%>一般常用page,include,taglib。
1.Page指令
page指令用來指定使用的編程語言,導入的軟件包等等。
<%@ page 屬性1=“值1” 屬性2=“值2”%>2.include指令
用來包含其他文件內容,可以是jsp或html文件。靜態包含。
<%@ include file="xxx.jsp"%>Jsp聲明<%! int a=10;int b=20;%>java程序片段<% int a=10;if(a==10){%>a is 10.<%}else{%>a is not 10<%}%>Java表達式<%=request.getParameter("name");%><%-- 注釋 --%>隱含對象jsp可以使用固定的變量來訪問隱含對象。
請求轉發跟servlet一樣
<jsp:forward page="轉發的url"> 在這句話前后的顯示代碼都沒用(比如<p>hello world</p>)。跟servlet一樣,當前的響應結果是沒有用的,只有轉發到一個地址后的響應結果有用。轉發后的jsp里面可以使用request和response。因為轉發共用HttpServletRequest和HttpServletResponse。
<jsp:forwars page=""> <jsp:param name="" value=""/>//添加參數在<jsp:include>中也可以使用<jsp:param name="" value=""/></jsp:forward>包含<jsp:include page="">//跟include指令一樣都可以包含文件,但是指令是靜態包含,這個是動態包含靜態包含:就是解析的時候把代碼和jsp文件一起解析,然后編譯,加載。非首次訪問,沒更新就不重新解析。靜態包含更新了,有些容器(tomcat)會監測更新然后重新解析編譯。有些不會,只能刪除jsp生成的servlet文件和類文件,然容器重新解析。jsp更新了,應該重新解析。
動態包含:運行jsp時解析包含的文件。
flush屬性:true指在包含之前jsp就把響應結果發給客戶。默認為false。
一般不會變的內容用靜態包含,會變的內容用動態包含。
使用servlet或jsp要在web.xml中配置
<servlet> <!-- 聲明Servlet對象 --> <servlet-name>FirstServlet</servlet-name> <!-- 上面一句指定Servlet對象的名稱 --> <servlet-class>com.ningmeng.FirstServlet</servlet-class>或者使用<jsp-file>/xxx.jsp</jsp-file>用jsp來當servlet <!-- 上面一句指定Servlet對象的完整位置,包含包名和類名 --> </servlet> <servlet-mapping> <!-- 映射Servlet --> <servlet-name>FirstServlet</servlet-name> <!--<servlet-name>與上面<Servlet>標簽的<servlet-name>元素相對應,不可以隨便起名 --> <url-pattern>/FirsetServlet</url-pattern> <!-- 上面一句話用于映射訪問URL --> </servlet-mapping>Jsp預編譯第一次訪問可能會等待很長一段時間,所以可以進行預編譯。
..../hello.jsp?jsp_PRecompile=true就會生成class文件,刪除hello.jsp,在web.xml中配置路徑為生成的class文件。作用:
1.提高了響應速度。2.應用發布后,可以防止他人修改jsp文件或者查看。因為jsp文件刪除了。
PageContext
使用場合:jsp文件java程序片段中;jsp文件自定義標簽的處理類。
用法:
1.向各種范圍存取屬性。
2.得到其他對象的引用方法。
3.用于請求轉發和包含的方法。
1.存取屬性值。
getAttribute(String name);getAttribute(string name , int scope);在scope中取值setAttribute(String name , Object value, int scope);在scope中設置值removeAttribute(string name , int scope);移除scope中的值findAttribute(String name);依次從小到大的范圍查找,找到馬上返回。否則為null。int getAttributeScope(String name);返回屬性范圍,沒有返回0PageContext.PAGE_SCOPE取值為1,頁面范圍//scope屬性PageContext.REQUEST_SCOPE取值為2,請求范圍PageContext.session_SCOPE取值為3,會話范圍PageContext.application_SCOPE取值為4,應用范圍2.得到其他對象的引用getPage();getSession();getRequest();getResponse();getServletConfig();getServletContext();getOut()自定義標簽處理類中不能使用servletContext,request,response,可以使用pageContext來得到。3.請求轉發和包含
forward(String url),include(String url);
因為自定義標簽中無法使用<jsp:forward>和<jsp:include>.所以使用pageContext來實現。
編碼
request.setCharacterEncoding("utf-8");//對post有用,因為post數據在request域中.對get沒用,因為數據在header中 String a = request.getParameter("name"); String b= request.getParameter("value");//post和get都可以用。 String c = new String(b.getBytes("ISO-8859-1"),"UTF-8");//一般瀏覽器請求的都是iso-8859-1編碼。
新聞熱點
疑難解答