Servlet
- 1、简介
- 2、快速入手
- 2.1servlet jar包导入
- 2.2 Content-type
- 2.3 Servlet-url 写法
- 2.4 注解方式配置servlet
- 2.5 servlet 生命周期
1、简介
资源包括静态资源和动态资源。
对于服务器响应,有时候我们需要根据客户的不同请求返回不同的数据和页面。此时就需要一个java类来接收该请求,但是并不是所有的类都能接收,只有实现Servlet接口的java类才能接收和响应请求。Servlet运行在服务端。每当有请求时,Servlet会在服务端运行对应的java代码生成对应的数据返回给浏览器端。
流程:
①每当客户浏览器像服务器进行请求一个动态资源时,tomcat会创建一个HttpServletRequset对象来接收该请求,同时也会生成一个HttpServletResponse对象,用于返回数据。
②之后会根据请求行的内容找到我们要执行的Servlet类,实例化该类并运行其中的service方法。
③将数据封装给response对象,并返回。
我们只需要填写Service方法中要执行的内容即可。
2、快速入手
开发流程
①创建web项目,将tomat添加为当前项目的依赖
②重写service方法
③在web.xml文件中,配置servlet的映射路径
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first</title>
</head>
<body>
<form method="get" action="userservlet">
用户名: <input type="text" name="username"> <br>
<input type="submit" value="校验">
</form>
</body>
</html>
Userservlet
package com.cky.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name=req.getParameter("username");
String info="NO";
if (name.equals("cky")){
info="Yes";
}
PrintWriter writer = resp.getWriter();
writer.println(info);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.cky.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userservlet</url-pattern>
</servlet-mapping>
</web-app>
2.1servlet jar包导入
对于servlet jar包,我们可以创建一个lib将其放入lib下添加到当前项目依赖,但是这样会让我们打包之后的项目也包含该jar包,但是该jar包其实时tomact自带的,对于在tomcat上跑的项目就会有。我们只需要在项目构建时,将其添加为项目依赖即可。
我们可以看到这是Provided的,即只会在编码时存在,在项目编译和打包时就不会存在了。在项目编译和打包之后,在tomcat上运行时,项目会自动调用tomcat lib下的servlet jar包。
项目编码时是需要jar包的,不然报错,无法编译。
2.2 Content-type
告诉客户端 以什么形式 编码该返回类型。
我们访问servlet时,会自动以html形式返回。
但是不显示,我们可以手动设置
package com.cky.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name=req.getParameter("username");
String info="NO";
if (name.equals("cky")){
info="Yes";
}
resp.setHeader("Content-Type","text/html");
PrintWriter writer = resp.getWriter();
writer.println(info);
}
}
2.3 Servlet-url 写法
①精确匹配 比如
/servlet
②模糊匹配
/ 匹配全部 但不包含.jsp
/* 匹配全部 包含jsp
前缀模糊 比如
*.action 前面是什么都可以 只要是.action 结尾
后缀模糊
/a/*
2.4 注解方式配置servlet
package com.cky.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"})
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name=req.getParameter("username");
String info="NO";
if (name.equals("cky")){
info="Yes";
}
resp.setHeader("Content-Type","text/html");
PrintWriter writer = resp.getWriter();
writer.println(info);
}
}
注意
:web.xml方式 和注解方式 只能使用一个,不要同时使用。
2.5 servlet 生命周期
servlet是单例的,即在服务器中只会实例化一次,即使是多线程,也是使用这一个对象,所以并不支持在service中修改成员变量,多个线程对一个成员变量进行修改,就会引起线程冲突。