Servlet基础语法
一. Servlet的基本认知
对于一个Servlet在每次请求访问时,Servlet引擎都会创建一个描述请求消息和一个描述响应消息的对象。其中描述请求消息的对象实现了HttpServletRequest接口,而描述响应消息的对象实现了HttpServletResponse接口。
Servlet引擎在创建了这2个对象之后,就会调用此Servlet对象的service方法来处理各种HTTP请求。
Servlet继承关系和生命周期
继承关系: Object----à[接口]ServletConfig(控制Servlet相关配置)+[接口]Servlet(控制Servlet基本动作)---àGernericServlet(适配器模式:不确定的方法开放)---àHttpServlet(模板模式:要执行的功能开放)
生命周期: 第一次使用Servlet才实例初始化init(),只有服务器关闭或者重启才会销毁Servlet实例。构造器----àinit()---àservice()---àdestroy();
二. HttpServletRequest常用方法和介绍
1. 获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
2.获得客户机请求头
getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法
3. 获得客户机请求参数(客户端提交的数据)
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
三. HttpServletResponse常用方法和介绍
我们可以使用HttpServletResponse对象产生3种HTTP响应消息:状态行、响应消息头、响应正文。
1.产生状态响应码
状态响应码存在于HTTP相应消息头的第一行,即状态行,如下所示:
HTTP/1.1 200 OK
状态行分为3部分:HTTP版本、状态代码、状态消息
HTTP协议的状态响应码为3位整数,分为5类:
100~199:表示服务器成功接收请求,但要求客户端继续提交下一次请求才能完成全部处理过程。
200~299:表示服务端已成功接收请求,并完成了全部处理过程。
300~399:表示客户端请求的资源已经转移到了别的位置,并向客户端提供一个新的地址,这个地址由HTTP响应消息头的location字段指定。
400~499:表示客户端的请求有错误。
500~599:表示服务端出现错误。
设置状态响应码:
1、setStatus(int sc)
sc表示状态码,它既可以直接使用整数形式,也可以使用在HttpServletResponse中定义的常量。
setStatus方法可以设置任何HTTP响应消息的状态码,并生成相应状态行。
由于响应状态行中的协议版本和状态消息是由服务器决定的,因此只需设置状态响应码就可以了。
2、sendRedirect(String location)
location指定重定向的URL,该URL既可以是绝对的(http://www.baidu.com),也可以是相对的。
该方法用更快捷的方式来设置响应状态吗302,表示需要客户端重定向URL。
3、sendError
public void sendError (int sc) throws IOException
public void sendError (int sc, String msg) throws IOException
该方法用于发送表示错误消息的状态码(也就是400~599之间的状态码),而且还可以设置状态消息。
2、设置响应消息头
addHeader与setHeader方法
注意:如果name所指定的字段名已经存在,setHeader会用value来覆盖旧的字段值,而addHeader会增加一个同名的字段(HTTP响应消息头允许存在多个同名的字段),name参数不区分大小写。
2、addIntHeader与setIntHeader方法;
3、addDateHeader与setDateHeader方法
HTTP响应头中的日期一般为GMT时间格式,这2个方法省去了将字1970年1月1日0时0分0秒开始计算的一个以毫秒为单位的长整形数值转换为GMT时间字符串的麻烦。
4、setContentType
该方法设置Content-Type字段的值。(即设置MIME类型)
如:response.setContentType("text/html;charset=UTF-8");
5、setCharacterEncoding
这个方法实际上是设置Content-Type字段的字符集部分。
6、setContentLength
该方法用于设置相应正文的大小,单位是字节。
Servlet引擎会根据向客户端实际输出的响应正文的大小自动设置Content-Length字段的值。
7、containsHeader
该方法用于检查某个字段是否在响应消息头中存在,如果存在,则返回true,否则返回false。
3、产生响应正文
为了向客户端返回响应正文,response提供了2个方法:getWriter()和getOutputStream()。
getWriter方法返回一个字符输出流对象,getOutputStream方法返回一个字节输出流对象。
这2个方法是互斥的,也就是说,调用一个方法后就不能再调用另一个方法。
如果响应正文全部是字符文本,并且需要进行编码转换,建议使用gatWriter方法。
从getWriter方法返回的PrintWriter对象不仅能很方便的向客户端返回相应正文,而且还会根据响应消息头的Content-Type所指定的字符编码格式自动转换响应正文(PrintWriter返回的响应正文是编码转换后的文本)。
response.setContentType("text/html;charser=utf-8");
PrintWriter out = response.getWriter();
out.println("中国");
注意:
如果不指定相应正文的编码格式,PrintWriter就会按ISO8859-1字符集编码格式进行转换,而ISO8859-1无法对中文进行编码,就会导致乱码。
建议尽量手动关闭PrintWriter对象(虽然Servlet引擎会自动关闭PrintWriter对象)。
getOutputStream
如果响应正文是非字符文本的数据或者是不需要进行编码转换的字符文本,建议使用字节输出流的方式返回响应正文。
使用ServletOutputStream返回字符文本:
1、将字符文本的响应正文转换为字节后返回
OutputStream out = response.getOutputStram();
out.write("中国".getBytes());
如果想用其他的字符编码格式发送响应正文,需要通过getBytes方法获得字符串的相应字符编码格式的字符流。
response.setContentType("text/html;charset=utf-8");
OutputStream out = response.getOutputStream();
out.write("中国".getBytes("utf-8"));
2、将字节流转换为OutputStreamWriter后直接输出字符文本。
OutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.write("中国");
writer.close();//这行必须写,否则无法输出响应正文
重点知识:GET和POST提交数据的区别
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
GET 方法
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制 2048
- GET 请求只应当用于取回数据
POST 方法
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
比较 GET 与 POST
下面的比较了两种 HTTP 方法:GET 和 POST。