图解请求和响应的过程
我们知道Servlet本身是单例模式的,每类Servlet在工作过程中只有一个对象参与响应请求,而每次Servlet对象对客户端的请求进行响应时是通过下面这个过程的:
响应 Response
response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体,
通过response设置响应行
- 设置响应行的状态码
setStatus(int sc)
通过response设置响应头
-
addHeader(String name, String value)
addIntHeader(String name, int value)addDateHeader(String name, long date)
setHeader(String name,String value)
setDateHeader(String name, long date)
setIntHeader(String name, int value)
其中,add表示添加键值对(允许存在重复的键),而set表示设置
通过response设置响应体
- 响应体设置文本
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
关于设置中文的乱码问题
- 解决方法一:
response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset) 设置response的编码,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。 - 解决方法二:
通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8:
response.setContentType(“text/html;charset=UTF-8”);
上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写response.setContentType(“text/html;charset=UTF-8”);就可以解决页面输出中文乱码问题。
请求 Request
request代表请求,所以我们可以通过该对象分别获得Http请求的请求行、请求头和请求体。(几乎没办法设置请求体,并且这也没必要,因为在服务端接受到请求后去修改它意义不大)。
通过request获得请求行
获得客户端的请求方式:
String getMethod()
获得请求的资源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() — web应用的名称如/WebAppName
String getQueryString() — get提交url地址后的参数字符串如:username=zhangsan&password=123
注意:
request获得客户机(客户端)的一些信息
request.getRemoteAddr() — 获得访问的客户端IP地址
通过request获得请求头
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
request.getHeader(“referer”)
//作用:执行该此访问的来源,做防盗链。
通过request获得请求体
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
以上面参数为例,通过一下方法获得请求参数:
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String, String[]> getParameterMap()
注意:get请求方式的请求参数,上述的方法一样可以获得。
解决post提交方式的乱码:
request.setCharacterEncoding(“UTF-8”);
解决get提交的方式的乱码:
parameter = new String(parameter.getbytes(“iso8859-1”),“utf-8”);