1.什么是Servlet?
是一个可以运行在Tomcat服务器的java小程序,可以处理客户端的请求,响应数据
2.Servlet的主要使用结构
自定义类继承 HttpServlet 继承 GenericServlet 实现 Serlet
GenericServlet抽象类
前面我们编写Servlet一直是通过实现Servlet接口来编写的,但是,使用这种方法,则必须要实现Servlet接口中定义的所有的方法,即使有一些方法中没有任何东西也要去实现,并且还需要自己手动的维护ServletConfig这个对象的引用。因此,这样去实现Servlet是比较麻烦的。
HttpServlet抽象类
HttpServlet抽象类是继承于GenericServlet抽象类而来的。使用HttpServlet抽象类时,还需要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。
HttpServletRequest接口扩展于javax.servlet.ServletRequest接口,HttpServletResponse接口扩展于javax.servlet.servletResponse接口。
3.Servlet的生命周期
3.1.Servlet的构造器 创建Servlet对象
3.2. Servlet的init()方法 当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化
3.3Servlet的service( ) 每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
3.4Servlet的destory()方法 当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
4.Servlet 的其它两个方法
getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。
getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。
5.什么是ServletConfig接口
6.ServletContext对象
ServletContext对象表示Servlet应用程序。每个Web应用程序都只有一个ServletContext对象。在将一个应用程序同时部署到多个容器的分布式环境中,每台Java虚拟机上的Web应用都会有一个ServletContext对象。
通过在ServletConfig中调用getServletContext方法,也可以获得ServletContext对象。
那么为什么要存在一个ServletContext对象呢?存在肯定是有它的道理,因为有了ServletContext对象,就可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象。前者将对象保存在ServletContext中的一个内部Map中。保存在ServletContext中的对象被称作属性。
ServletContext中的下列方法负责处理属性:
Object getAttribute(String var1);
Enumeration<String> getAttributeNames();
void setAttribute(String var1, Object var2);
void removeAttribute(String var1);
7.编写第一个Servlet
首先,我们来写一个简单的用户名,密码的登录界面的html文件:
<form action="/form" method="get">
(action的请求地址就是web项目的请求路径)
该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>
接下来,启动tomcat,在浏览器中输入登录表单的地址:
填入用户名为:root,密码为:123,最后点击提交:
提交之后,表单数据将会发送到相应的Servlet进行处理,此时,浏览器的地址变成如下所示:
我们会发现,在地址栏中,多了后面的“?username=root&password=123&提交=提交”字符串,这其实就是我们开始填写的参数,以Get的方法发送过去,所以查询字符串会直接加在链接后面,如果采用的是Post方式则不会出现在链接中,因此,登录表单为了安全性大多采用Post方式提交。
我们来看看Servlet给我们返回了什么东西:
正如我们在Servlet中写的那样,Servlet把HTTP请求中的部分参数给解析出来了。
因此,可以再翻到上面的Servlet重新去理解一遍Servlet的工作原理,可能会有更清晰的认识。