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.