fufu学JAVA之Servlet详解
什么是Servlet
Servlet是运行在Web服务器中的小型的java程序,Servlet通常通过Http(超文本传输协议)接收web客户端的请求
创建一个Servlet程序
- 手动创建
创建一个类去实现Servlet接口
package com.hsf.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/通过实现Servlet接口来实现Servlet/
public class MyFirstServlet implements Servlet {
/** * 当第一次访问该资源时,创建Servlet程序会调用此方法,且只会执行一次,和构造器一样 * @param servletConfig * @throws ServletException */
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化了一次");
}
public ServletConfig getServletConfig() {
return null;
}
/**每次在浏览器访问该资源都会执行该方法 * serviceF方法是专门用来处理请求和响应的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
System.out.println("HelloServlet,你又访问了一次");
if(method.equals("GET")){
System.out.println("发射了一个GET请求");
}else if(method.equals("POST")){
System.out.println("发射了一个POST请求");
}
}
/** * * @return */
public String getServletInfo() {
return null;
}
/** * 在web工程停止的时候销毁 */
public void destroy() {
System.out.println("啊,Mamak!我没了");
}
}
当客户端发送请求,会在重写的service中处理,可以在这里面写逻辑代码,一个Servlet类对应一个xml的配置,我们还需要在web.xml里配置它的访问路径
配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<!--servlet标签给tomcat配置servlet程序-->
<servlet>
<!--servlet-name标签给Servlet程序起一个别名,一般是类名-->
<servlet-name>MyFirstServlet</servlet-name>
<!--Servlet-class表情是Servlet程序的全类名-->
<servlet-class>com.hsf.servlet.MyFirstServlet</servlet-class>
</servlet>
<!--servlet-mapping表情给Servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>MyFirstServlet</servlet-name>
<!--url-pattern标签配置访问地址 / :斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 /hello :斜杠hello表示地址为:http://ip:port/工程路径/hello -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
注意这个url-pattern,当我们配置好xml之后启动Tomcat服务器就是通过该路径来访问请求你的Servlet类
通过继承HttpServlet类实现Servlet类
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
System.out.println("fufu真帅");
}
}
在HttpServlet类里,区分了不同请求的处理方法,有兴趣的可以去看看源码,HttpServlet继承了GenericServlet,GenericServlet实现了Servlet接口,这里我们主要说一下HttpServlet类里,通过继承关系我们可以得知,HttpServlet拥有Servlet接口的所有方法,在HttpServlet类里,重写了service()方法,在这个方法里对不同的请求做了处理,分别实现在不同请求对应的方法里,如doGet方法和doPost方法,分别对应Get请求和Post请求
Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
1.Servlet类初始化–>
2.Servlet调用init()方法–>
3.Servlet调用service()方法来来处理客户端的请求,无论get还是post或是其他请求,都在这里处理–>
4.Servlet 销毁前调用 destroy() 方法
5.最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
方法介绍:初始化和init()方法都只会执行一次,server每访问一次就执行一次,destory()在项目关闭是调用
Servlet的url定位到Servlet类的过程
客户端通过请求地址:localhost:8080 // 项目名/【web.xml里设置的url-pattern(后面这里以url简称)】,对Servlet类进行访问,接下来,我们对这个过程进行解析。
首先,我们需要先了解这个请求地址的组成成分:
localhost:服务器ip
8080:端口(这里的8080端口指的是tomcat程序)
//项目:告诉服务器你要找那个项目
/url:这里是在web.xml里配置的用来访问Servlet类资源的路径。
大家应该都知道,有了服务器ip就能定位到一台计算机,通过端口,可以定位到计算机里的某一个程序(这里指tomcat),然后通过我们设置的url定位到对应的Servlet类
如下:
Servlet请求的分发处理
通常我们请求Servlet的方式有:Post、Get、Put、Head、Delete、Connect、Options、Trace
在上面生命周期里提到,我们处理所有的请求都是在service()方法里,如果我们想要对不同的请求做不同的处理,可以在service()方法里做分类,如:
package com.hsf.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/*通过实现Servlet接口来实现Servlet*/
public class MyFirstServlet implements Servlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("HelloServlet,你又访问了一次");
//通过servletRequest的子类HttpServletRequest对象
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//获取到当前的请求方式
String method = httpServletRequest.getMethod();
//对应不同的请求作出相应的操作(分支)
if(method.equals("GET")){
System.out.println("发射了一个GET请求");
}else if(method.equals("POST")){
System.out.println("发射了一个POST请求");
}
}
}
(上面的代码若要引用切忌全部粘贴,只复制service方法里的代码就行了,当然全复制也行,补全一下代码即可);
通常情况下,我们不指定请求方式是默认为GET请求方式的
一般我们指定请求的方式有,
使用form表单,如下:
<form action="http://localhost:2233/Maven_01/hello" method="post">
<input type="submit"/>
</form>
当我们点击提交按钮就能发送一个指定的请求,这里如果我们指定请求方式,就如上面所说,默认为get,form表单里有两个属性
- action:Servlet类的访问路径(前面说到了)
- method:指定请求方式
使用IDEA工具快捷生成Servlet类
配置Servlet:
当我们点击生成 会在web.xml里自动生成一个
Servlet-mapping需要我们自己配置
还没有评论,来说两句吧...