Servlet入门
基本概述
servlet=server+applet:运行在服务器端的java程序
Servlet是一个接口,一个类要想通过浏览器被访问到,那么这个类必须直接或间接的实现Servlet接口
Servlet快速入门
代码实现Servlet的步骤
- 创建web项目
- 编写普通java类,实现接口
- 配置web.xml文件
- 部署web项目
- 启动测试
package cn.itcast.a_quick;
import javax.servlet.*;
import java.io.IOException;
//编写普通的java类,实现servlet接口
public class QuickServelt implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*对外提供服务
request:请求
response:响应
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//向浏览器输出一句话
servletResponse.getWriter().write("QuickServlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
<?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_3_1.xsd"
version="3.1">
<!--
把刚刚写的QuickServelt交给tomcat管理
<servlet-name>:当前servlet的别名(使用类名即可)
<servlet-class>:全限定类名
-->
<servlet>
<servlet-name>QuickServelt</servlet-name>
<servlet-class>cn.itcast.a_quick.QuickServelt</servlet-class>
</servlet>
<!--
给servlet设置一个网络的访问地址(路径)
<servlet-name>:给指定别名的servlet配置映射
<url-pattern>:网络访问地址(必须以/开头)
-->
<servlet-mapping>
<servlet-name>QuickServelt</servlet-name>
<url-pattern>/quickServelt</url-pattern>
</servlet-mapping>
</web-app>
Servlet执行原理图
Servlet的生命周期
生命周期:指的是一个对象从生(创建)到死(销毁)的一个过程
Servlet生命周期相关的方法
// 1. servlet对象创建时,调用此方法
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();
代码实现
- LifeServlet
public class LifeServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifeServlet创建了....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifeServlet的service方法执行了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("LifeServlet销毁了...");
}
}
- 配置web.xml文件
<!--servlet的生命周期-->
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>cn.itcast.b_api.LifeServlet</servlet-class>
<!--tomcat启动时,创建servlet对象,执行init方法 -->
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
Servlet的体系结构
GenericServlet
① 编写普通java类,继承GenericServlet抽象类
public class ServletDemo1 extends GenericServlet {
@Override
public void init() throws ServletException {
System.out.println("ServletDemo1 创建了...");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
super.getServletConfig(); // 调用父类的配置对象
servletResponse.getWriter().write("ServletDemo1 extends GenericServlet");
}
@Override
public void destroy() {
System.out.println("ServletDemo1 销毁了..");
}
}
② 配置web.xml
<!--servlet继承genericServlet-->
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.itcast.c_inherit.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>
HttpServlet
① 编写前端html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h3>用户登录</h3>
<form action="http://localhost:8080/day08_servlet_xml/servletDemo2" method="get">
<input type="submit" value="提交表单..">
</form>
</body>
</html>
② 编写普通java类,继承HttpServlet抽象类
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("get....");
}
@Override
protcted void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("post...");
}
}
③ 配置web.xml
<!--servlet继承httpServlet-->
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.itcast.c_inherit.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>
响应状态码405
请求方法没有重写,如果子类没有重写doPost方法,那么父类也不知道怎么办,所以会抛出一个错误信息
响应状态码500
java代码写错了,根据异常信息提示,找到修改即可
Servlet的路径
url-pattern配置
作用:将一个请求网络地址和servlet类建立一个映射关系
Servlet3.0
通过注解配置Servlet,简化web.xml配置Servlet复杂性,提高开发效率,几乎所有的框架都在使用注解
创建web工程【注解】
编写普通java类,继承HttpServlet
public class QuickServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("QuickServlet....3.0");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("QuickServlet....3.0");
}
}
配置@WebServlet
// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
}