什么是servlet?

1.什么是servlet?
在 JavaWeb 项目中,处理请求和发送响应的过程是由一种叫做 Servlet 的程序来完成的,并且 Servlet 是为了解决实现动态页面而衍生的东西。

简单来讲:Servlet其实就是一个遵循Servlet开发的java类,Serlvet是由服务器调用的,运行在服务器端。

一张图描述 Servler 在 B/S 中的作用点:

https://images2015.cnblogs.com/blog/874710/201702/874710-20170214192940050-671180063.png
2. Tomcat 和 Servlet 的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器。 Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户,而 Servlet 是一种运行在支持 Java 语言的服务器上的组件。

Servlet 最常见的用途是扩展 Java Web 服务器功能,提供非常安全的、可移植的、易于使用的 CGI 替代品。

从 Http 协议中的请求和响应可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。但是在上面这个图中,并不知道是如何转变的,只知道浏览器发送过来的请求也就是 request,我们响应回去的就用 response。忽略了其中的细节,现在就来探究一下。

①:Tomcat 将 Http 请求文本接收并解析,然后封装成 HttpServletRequest 类型的 request 对象,所有的 Http 头数据读可以通过request 对象调用对应的方法查询到。

②:Tomcat 同时会要响应的信息封装为 HttpServletResponse 类型的response 对象,通过设置 response 属性就可以控制要输出到浏览器的内容,然后将 response 交给 Tomcat,Tomcat 就会将其变成响应文本的格式发送给浏览器。

Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了Serlvet 的各种方法,还定义了 Servlet 容器传送给 Servlet 的对象类,其中最重要的就是 ServletRequest 和 ServletResponse 。所以说我们在编写Servlet时,需要实现 Servlet 接口,按照其规范进行操作。

3 Servlet 接口主要方法
Servlet 接口主要的 3 个方法:

init()方法:只会调用一次,只是在创建servlet实例的时候才会创建。
service()方法:是进行数据处理的,只要接受了一次请求,就会被调用一次
destroy()方法:销毁 Servlet 对象的时候调用。停止服务器或者重新部署 Web 应用时销毁 Servlet 对象,同样也是调用一次
4. 编写 Servlet
首先说明一点疑惑,有时候我们在一些资料上看到别人这样写:

public class TestServlet implements Servlet {

init()...

service()...

getServletConfig()...

...

}
而在这我们要继承 HttpServlet类 那么问题来了,继承HttpServlet 和实现Servlet 有什么区别?

首先,直观的不同,Servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法。

而 HttpServlet 实现了 Servlet 接口,并把 Servlet 接口中的方法实现了。
继承 Httpservelt,实际上也就实现了 Servlet 接口。

但是我们没必要再去实现 Servlet 中定义的生命周期方法,因为在 Httpservlet 中已经有了默认实现,并且这些默认实现也挺规范和实用, doget 和 dopost 是执行用户请求的终点,get 请求会调用 doget 方法,post 请求会执行 dopost 方法,我们可以在这2个方法中定义我们自己的业务逻辑。

最后,HttpServlet 在实现 Servlet 接口的时候,已经实现了 Servlet 中所有的方法,因此继承自 HttpSrvlet 的类,不需要再去覆写相应的生命周期等方法。

4.1 编写Java类,继承HttpServlet
创建一个 MyServlet java 类,继承 HttpServlet 实现 service 方法:

public class MyServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //设置字符编码
    request.setCharacterEncoding("utf8");
    //从 request 对象中获取username,password
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    request.setAttribute("username",username);
    request.setAttribute("password",password);
    request.getRequestDispatcher( "/index2.jsp").forward(request, response);;
}

}
4.2 配置web.xml文件
web.xml 配置 Servlet 访问路径,能让别人通过链接访问到你的 Servlet:

Archetype Created Web Application

    MyServlet
    club.sscai.demo.MyServlet



    MyServlet
    /MyServlet

4.3 jsp 界面显示 index2.jsp:

2222222

username: <%=request.getParameter("username") %>
password: <%=request.getParameter("password") %> 访问:http://localhost:8080/MyServlet?password=1111&username=222 效果如下:

5.总结
前台界面附带的参数,可以通过 request 获取,这也证实了前面 HttpServletRequest 封装了 request对象,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。

关于 request\response,在实际项目开发中,request 是非常常用的,毕竟你要拿到用户请求的信息,才能知道用户要什么,但是,像上文中这种继承自 HttpServlet 是不会出现的,例如,采用 Spring MVC 框架后,自动帮我们实现了 request 请求到 Controller 的骚操作。

你可能感兴趣的:(tomcat,服务器,java)