一、创建HelloServlet类
Servlet是一个运行在Web服务器中的Java小程序,Servlet会接收和响应来自Web客户端的请求,使用HTTP进行通信。除非某些过滤器提前中止了客户端的请求,否则所有的请求都将会发送到某些Servlet中。
1、选择要继承的Servlet
大多情况下,Servlet都继承至GenericServlet,GenericServlet是一个不依赖具体协议的Servlet,它包含了一个抽象的service()方法以及几个辅助方法用于日志操作和从应用、Servlet配置中获取信息。
作为响应HTTP请求的HttpServlet,它继承了GenericServlet,并实现了只接受http请求的service()方法,然后它提供了响应每种http请求的方法的空实现。
import javax.servlet.http.HttpServlet;
public class HelloServlet extends HttpServlet {
}
2、添加对HTTP GET方法的支持
这个Servlet已经可以接受任何HTTP请求,但它并没有重写HttpServlet中的方法,所以会返回一个HTTP状态405作为响应。现在我们重写doGet()方法,添加对HTTP GET方法的支持,如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("Hello World");
}
}
3、使用初始化方法和销毁方法
@Override
public void init() throws ServletException {
System.out.println(this.getServletName() + "has started");
}
@Override
public void destroy() {
System.out.println(this.getServletName() + "has stopped");
}
如果将Servlet配置为在Web应用程序部署和启动时自动启动,那么它的init()方法也将会调用。否则,init()方法将在第一次请求访问Servlet时调用。
destroy()方法在Web应用程序被停止或卸载、关闭时立即调用,它不需要等待垃圾回收器进行
二、配置可部署的Servlet
1、向部署描述符中添加Servlet并映射URL
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>f1.chapter3.servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup><!--让servlet在Web应用程序启动之后立即启动,数字越大启动越晚-->
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name><!--这应该跟servlet-name保持一致-->
<url-pattern>/getting</url-pattern>
</servlet-mapping>
</web-app>
如果两个或多个Servlet的<load-on-startup>相同,那么将按照它们在描述符文件中的出现顺序启动,其他Servlet仍按照大小顺序进行启动。
2、运行和调试Servlet
如果tomcat没有设置为根目录的话,应该在getting前加上项目名,如:http://localhost:8080/xxx/getting
如果希望命中destroy的断点,需要在命令行关闭Tomcat,如果在IDE中关闭Tomcat,则Tomcat将在断点被命中之前断开与调试器的连接。
三、了解doGet、doPost和其他方法
1、获取请求参数
HttpServletRequest最重要的功能是从客户端发送的请求中获取参数。请求参数有两种不同的形式:查询参数(也称为URL参数)和post变量。
//请求url为http://localhost:8080/getting?name=alex&name=zhangsan&age=25,请求类型为get
String name = req.getParameter("name");//当参数有多个值时只返回第一个值
System.out.println(name);//alex
String[] names = req.getParameterValues("name");//返回参数值的数组
System.out.println(names[0] + "==" + names[1]);//alex==zhangsan
Map map = req.getParameterMap();//返回参数和值的key-value
String[] s = (String[]) map.get("name");//alex==zhangsan
System.out.println(s[0] + "==" + s[1]);
Enumeration names1 = req.getParameterNames();//返回参数名字的枚举
Object o1 = names1.nextElement();
Object o2 = names1.nextElement();
System.out.println(o1 + "==" + o2);//name==age
resp.getWriter().print("Hello World");
2、确定与请求内容相关的信息
//请求内容为age=8,请求类型为post,Request Body为Empty
String contentType = req.getContentType();//返回请求的MIME内容类型(多用途互联网邮件扩展)
System.out.println(contentType);//application/x-www-form-urlencoded; charset=GBK
int length = req.getContentLength();//返回请求正文的长度,以字节为单位
System.out.println(length);//5
String encoding = req.getCharacterEncoding();//返回请求内容的字符编码
System.out.println(encoding);//GBK
resp.getWriter().print("Hello World");
3、读取请求的内容
//请求内容为zhangsan,请求类型为post,Request Body为Text
String contentType = req.getContentType();//返回请求的MIME内容类型(多用途互联网邮件扩展)
System.out.println(contentType);//*/*; charset=UTF-8
int length = req.getContentLength();//返回请求正文的长度,以字节为单位
System.out.println(length);//8
String encoding = req.getCharacterEncoding();//返回请求内容的字符编码
System.out.printl