7,HttpServletRequest
使用HttpServletRequest取得HTTP請求中的信息
(1)getParameter():指定請求參數名稱來取得對應的值;
(2)getParameterValues():當同一個請求參數名稱具有多個值,使用其返回一個String數組;
getParameterNames():獲得請求中有多少個參數;
(3)getParameterMao()將請求參數以Map對象返回;
獲取HTTP的標頭信息:
(1)getHeader():指定標頭名稱後可返回字符串值;
(2)getHeaders():制定標頭名稱返回Enumeration,元素爲字符串;
(3)getHeaderNames():取得所有標頭名稱,以Enumeration返回,內含所有標頭字符串名稱。
8,getReader()&getInputStream()
getInputStream 方法用於返回的一個代表實體內容的輸入流對象,其類型爲javax.servlet.ServletInputStream。
getReader方法用於返回的一個代表實體內容的BufferedReader對象,返回的BufferedReader對象將實體內容中的字節數據按照請求消息中指定的字符集編碼轉換成文本字符串。
在調用getReader方法之前,可以調用ServletRequest的setCharacterEncoding方法指定其返回的BufferedReader對象所使用的字符集編碼。
9,getPart,getParts取得上傳文件
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@MultipartConfig
@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
Part part=req.getPart("photo");//使用getPart()取得part對象
String filename=getFilename(part);
writeTo(filename,part);
}
private String getFilename(Part part){//取得上傳文件名
String header=part.getHeader("Content-Disposition");
String filename=header.substring(header.indexOf("filename=\"")+10,header.lastIndexOf("\""));
return filename;
}
private void writeTo(String filename,Part part)throws IOException,FileNotFoundException{
InputStream in=part.getInputStream();
FileOutputStream out=new FileOutputStream("/workpace/"+filename);
byte[] buffer=new byte[1024];
int length=-1;
while((length=in.read(buffer))!=-1){
out.write(buffer,0,length);
}
in.close();
out.close();
}
}
@MultipartConfig設置Servlet處理上傳文件相關信息,@MultipartConfig可用屬性如下。
(1)fileSizeThreshold:整數設置,若上傳文件大小超過設置門檻,會先寫入緩存文件,默認值爲0;
(2)location:字符串設置,設置寫入文件時的目錄,如果設置這個屬性,則緩存文件寫到指定目錄,也看了搭配Part的write方法使用。默認爲空字符串;
(3)maxFileSize:限制上傳文件大小,默認值-1L,表示不限制大小;
在Tomcat中要在Servlet上設置@MultipartConfig才能取得Part對象,否則getPart()時得到null.
multipart/from-data發送的每個內容區段,必定會有以下標頭信息:
Content-Disposition:form-data;name="filename";filename="caterpillar.jpg" Content-type:image/jpeg
...
若有多個文件需要上傳,可以使用getParts()方法,這會返回一個Collection<Part>,其中爲每個上傳文件的Part對象。
10,RequestDispatcher調派請求
<<interface>>
RequestDispatcher
+forward(request:ServletRequest,response:ServletResponse):void
+include(request:ServletRequest.response:ServletResponse):void
RequestDispatcher的include()方法,可以將另一個Servlet的操作流程包括至目前Servlet中。
HttpServletREquest上與請求範圍屬性有關的幾個方法:
(1)setAttribute():指定名稱與對象設置屬性。
(2)getAttribute():指定名稱取得屬性。
(3)getAttributeNames():取得所有屬性名稱。
(4)removeAttribute():指定名稱移除屬性。
使用include()時,被包含的Servlet中任何對請求標頭的設置都會被忽略。被包含的Servlet中可以使用getSession方法取得HttpSession對象。
RequestDispatcher有個forward()方法,調用時傳入請求與響應對象,意味着將請求處理轉發給別的Servlet.
若要調用forward()方法,目前的Servlet不能有任何響應確認,如果在目前的Servlet中通過相應對象設置了一些響應但未確認(響應緩衝區未滿或未調用
任何清楚方法),則所有的響應設置會被忽略,如果已經有響應確認且調用了forward方法,則會拋出IllegalStateException.
11,關於HttpServletResponse
關於所有響應的標頭設置,必須在響應確認之前,在響應確認之後設置的標頭,會被容器忽略。
容器默認對響應進行緩衝,操作HttpServletResponse以下有關緩衝的幾個方法:
(1)getBufferSize
(2)setBufferSize
(3)isCommitted()
(4)reset()
(5)resetBuffer()
(6)flushBuffer()
在緩衝區未滿之前,設置的響應相關的內容不會真正傳至客戶端,可以使用isCommited()看看是否響應已確認。如果想要重置所有響應信息,可以調用reset()方法,
這會連同已設置的標頭一併清除,調用resetBuffer會重置響應內容,但不會清除已設置的標頭內容。
HttpServletResponse對象若被容器關閉,則必須清除所有的響應內容,響應對象被關閉的時機點有以下幾種:
Servletde service()方法已經結束,響應的內容長度超過HttpServletResponse的setContentLength()所設置的長度;
調用了sendRedirect()方法;;
調用了sendError()方法;
調用了AsyncContext的complete()方法;
11,使用getOutputStream()輸出二進制字符
有時需要對瀏覽器進行字節輸出,這時就可以使用HttpServletResponse的getOutputStream()方法取得ServletOutputStream實例,其爲
OutputStream的子類。
爲了取得Web應用程序中的文件串流,可以使用HttpServlet的getServletContext()取得ServletContext對象,這個對象代表目前Web應用程序
可以使用ServletContext的getResourceAsStream()方法以串流程序讀取文件。
例如:InputStream in=getServletContext().getResourceAsStream("/WEB-INF/jdbc.pdf");
12,使用sendRedirect(),sendError()
可以使用HttpServletResponse的sendRedirect()要求瀏覽器重新請求另一個URL,又稱爲重定向(Redirect),使用時可指定絕對URL或相對
URL。例如:response.sendRedirect("http://openhome.cc");
這個方法會在響應中設置HTTP狀態碼301以及Location標頭,瀏覽器接收到這個標頭,會重新使用GET方法請求指定的URL,
因此地址欄上會發現URL的變更。
由於利用HTTP狀態碼與標頭信息,要求瀏覽器重定向網頁,因此這個方法必須在響應未確認輸出前執行,否則會拋出IllegalStateException.
如果在處理請求的過程中發現一些錯誤,而你想要傳送服務器默認的狀態與錯誤信息,可以使用snedError()方法。
response.sendError(HttpServletResponse.SC_NOT_FOUND);
如果想使用自定義的信息來取代默認的信息文字,則可以使用sendError()的另一版本:
response.sendError(HttpServletREsponse.SC_NOT_FOUND,"Hello world!");
由於利用HTTP狀態碼與標頭信息,要求瀏覽器重定向網頁,因此同樣的這個方法必須在響應未確認輸出前執行,否則會拋出IllegalStateException.