setvlet概念
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器
Servlet 类提供了五个方法,其中三个生命周期方法和两个普通方法
servlet的工作原理
客户端发送请求至服务器
服务器启动并调用servlet
servlet根据客户端请求生成响应并传给服务
服务器传送到客户端
实现servlet接口:
servlet生命周期:从Servlet被创建到Servlet被销毁的过程。
换句话说,servlet运行时在servlet容器中,其生命周期是由容器来管理的。servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。
servlet中的方法
Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。在编写实现Servlet的Servlet类时,直接实现它。在扩展实现这个这个接口的类时,间接实现它
public interface Servlet { void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
Servlet 容器
Servlet容器是运行Servlet,JSP,Filter,Listener,Tag等的软件环境,也叫JavaWeb应用容器,或者Servlet/JSP容器。 Servlet,JSP等的生命周期方法都由容器来调用,换言之,Servlet容器负责管理它们的生命周期 目前最流行的Servlet容器软件包括: Tomcat:一个免费的开源Servlet容器,它是Apache软件基金会的一个顶级项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与与支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现。
servlet生命周期包含了四个阶段:加载和初始化、初始化、请求处理、服务终止
加载和初始化:
Servlet容器负责加载和实例化Servlet。容器启动(web客户端发送请求时),创建Servlet实例。容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。
web服务器在于客户端交互时servlet的工作过程:
1、客户端向web服务器发送请求;
2、web服务器接受请求后将其发送给servlet;
3、servlet容器因此产生一个实例对象并调用ServletAPI中对应的方法来对客户端HTTP请求进行处理,然后将其处理的响应结果返回给web服务器。
4、web服务器将从Servlet实例对象中收到的响应结构发送给客户端。
Servlet 生命周期
servlet只会初始化一次,也就是创建一个servlet对象而且指挥进行一次即init()方法,调用这个方法时,Servlet容器会传入一ServletConfig对象进来从而对Servlet对象进行初始化。
然后,调用service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。后续的请求中,Servlet容器只会调用service方法了。
最后,调用destroy()方法,当要销毁Servlet时,Servlet容器就会调用这个方法在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
public class MyFirstServlrt implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet正在初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//专门向客服端提供响应的方法
System.out.println("Servlet正在提供服务");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet正在销毁");
}
}
编写一个Servlet
该html文件在最后点击提交按钮时,把表单所有数据通过Get方式发送到/form虚拟路径下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/form" method="get">
<span>用户名</span><input type="text" name="username"><br>
<span>密码</span><input type="password" name="password"><br>
<input type="submit" name="submit">
</form>
</body>
</html>
接下来,我们就开始写一个Servlet用来接收处理表单发送过来的请求,这个Servlet的名称就叫做FormServlet:
public class FormServlet extends HttpServlet { private static final long serialVersionUID = -4186928407001085733L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的编码格式为UTF-8编码,否则发生中文乱码现象
response.setContentType("text/html;charset=UTF-8");
//1.获得请求方式
String method = request.getMethod();
//2.获得请求的资源相关的内容
String requestURI = request.getRequestURI();//获得请求URI
StringBuffer requestURL = request.getRequestURL();
String webName = request.getContextPath();//获得应用路径(应用名称)
String querryString = request.getQueryString();//获得查询字符串
response.getWriter().write("<h1>下面是获得的字符串</h1>");
response.getWriter().write("<h1>method(HTTP方法):<h1>");
response.getWriter().write("<h1>"+method+"</h1><br>");
response.getWriter().write("<h1>requestURi(请求URI):</h1>");
response.getWriter().write("<h1>" + requestURI + "</h1><br>");
response.getWriter().write("<h1>webname(应用名称):</h1>");
response.getWriter().write("<h1>" + webName + "</h1><br>");
response.getWriter().write("<h1>querrystring(查询字符串):</h1>");
response.getWriter().write("<h1>" + querryString + "</h1>");
}
}
该Servlet的作用是,接收form登录表单发送过来的HTTP请求,并解析出请求中封装的一些参数,然后在回写到response响应当中去,最后在浏览器端显示。
最后一步,我们在XML中配置好这个Servlet的映射关系:
</servlet-mapping>
<servlet>
<servlet-name>FormServlet</servlet-name>
<servlet-class>com.javaee.util.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FormServlet</servlet-name>
<url-pattern>/form</url-pattern>
</servlet-mapping>