Servlet学习笔记
【尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版-哔哩哔哩】https://b23.tv/YSlRBr
1. Servlet 技术
a) 什么是 Servlet
1、Servlet是JavaE规范之一。规范就是接口
2、Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
3、Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
b)手动实现 Servlet 程序
1.编写一个类去实现Servlet接口
1.新建一个简单的java工程06_servlet
2.导入web application
3.在src下新建一个包com.servlet,包下新建类HelloServlet
2.实现Servlet方法,处理请求,并响应数据
4.HelloServlet后implements Servlet,实现方法
5.如果Servlet标红,在web/WEB-INF下新建lib文件夹,导入servlet-api.jar包(在Tomcat/lib下有)右键选择add as library
HelloServlet
package com.servlet; import javax.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } /** * service 方法是专门用来处理请求和响应的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet 被访问了"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
6.创建Tomcat实例,点击Edit Configurations...
点击+
名字命名为06_servlet
- 到web.xml中配置Servlet程序的访问地址
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>HelloServlet</servlet-name> <!-- servlet-class 标签 Servlet程序的全类名 --> <servlet-class>com.servlet.HelloServlet</servlet-class> </servlet> <!-- servlet-mapping 标签给 Servlet 程序配置访问地址 --> <servlet-mapping> <!-- servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用 --> <servlet-name>HelloServlet</servlet-name> <!-- url-pattern 标签配置访问地址 / 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径 /hello 表示地址为: http://ip:port/工程路径/hello --> <url-pattern>/hello</url-pattern> <!--注意hello前面有 / --> </servlet-mapping> </web-app>
- 点击运行“绿三角”
在地址后加hello,回车
在IDEA控制台上可以看到如下输出语句
常见的错误1:url-pattern 中配置的路径没有以斜杠打头。
常见错误2: servlet-name配置的值不存在:
常见错误3: servlet-class标签的全类名配置错误:
c) url 地址到Servlet 程序的访问
d) Servlet 的生命周期
- 执行Servlet 构造器方法
- 执行init 初始化
第一、二步,是在第一次访问的时候,创建Servlet程序会调用。 - 执行 service 方法
第三步,每次访问都会调用 - 执行 destroy 销毁方法
第四步,在web工程停止的时候调用
验证
HelloServlet
package com.servlet; import javax.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { public HelloServlet() { System.out.println("1 构造方法"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2 执行init 初始化"); } @Override public ServletConfig getServletConfig() { return null; } /** * service 方法是专门用来处理请求和响应的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3 service === hello Servlet 被访问了"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("4 执行 destroy 销毁方法\n"); } }
e) GET 和 POST 请求的分发处理
HelloServlet
package com.servlet; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class HelloServlet implements Servlet { public HelloServlet() { System.out.println("1 构造方法"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2 执行init 初始化"); } @Override public ServletConfig getServletConfig() { return null; } /** * service 方法是专门用来处理请求和响应的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3 service === hello Servlet 被访问了"); //类型转换(因为它有getMethod()方法) HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest; //获取请求的方式 String method = httpServletRequest.getMethod(); // System.out.println(method); if ("Get".equals(method)){ doGet(); }else if("POST".equals(method)){ doPost(); } } /** * 做get请求的操作 */ public void doGet(){ System.out.println("get请求"); System.out.println("get请求"); } /** * 做post请求的操作 */ public void doPost(){ System.out.println("post请求"); System.out.println("post请求"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("4 执行 destroy 销毁方法\n"); } }
在web下建a.html
a.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <from action="http://localhost:8080/06_servlet_war_exploded/hello" method="GET"> <input type="submit"> </from> </body> </html>
f) 通过继承HttpServlet 实现 Servlet 程序
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序。
- 编写一个类去继承HttpServlet类
- 根据业务需要重写doGet或doPost方法
- 到web.xml中的配置Servlet程序的访问地址
HelloServlet2
package com.servlet; 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 HelloServlet2 extends HttpServlet { /** * doGet() 在get请求的时候调用 * @param req * @param resp * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloServlet2 的doGet方法"); } /** * doPost() 在post请求的时候调用 * @param req * @param resp * @throws ServletException * @throws IOException */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloServlet2 的doPost方法"); } }
web.xml中的配置:
<servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.servlet.HelloServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping>
g) 使用IDEA创建Servlet程序
配置一下servlet-mapping