Servlet基础
Tomcat
- Tomcat是Apache软件基金会旗下一款免费的开放源代码的Web应用服务器
- Tomcat是运行Servlet(服务器小程序)的容器
Servlet
- Servlet(Server Applet)服务器小程序,主要功能用于生成动态Web内容
- Servlet是J2EE最重要的组成部分
Tomcat与Servlet的关系

Tomcat的安装与运行
tomcat.apache.org官网下载Tomcat。
目录结构说明
下方的.md和.txt等文件是一些说明性文件,不参与Tomcat的运行。
bin文件夹
保存了所有启动文件。
conf文件夹
保存了所有配置文件。特别是server.xml文件是核心配置文件。

lib文件夹
保存了Tomcat第三方依赖组件包,Tomcat运行时将其加载。

logs文件夹
Tomcat运行中的一些日志数据。如果程序出现问题,方便查看。
temp文件夹
运行中产生的中间临时文件
webapps文件夹
存放自己开发应用程序的目录。
works目录
jsb编译后的源代码或者字节码文件。(现在通常为空)
环境配置
环境变量
安装JDK1.8及以上版本,然后环境变量中增加JAVA_HOME的值.然后把PATH环境变量也加入.
启动
双击bin文件夹下的startup.bat文件。
出现上图一句话表示启动成功。
启动之后,Tomcat会默认占用8080端口。如图:(localhost:8080)
当然,我们也可以修改Tomcat占用端口,在conf文件夹的server.xml文件,找到如下位置。将其8080端口改为自己想要的端口号即可。
创建Java Web工程
使用Maven创建Java Web工程。

Maven工程创建完毕。
然后在main目录下创建webapp目录用于存放网页,css,js等资源。
相关设置
- 让IDEA知道webapp目录的功能。


- 设置Web Resource Dictorires和Web应用的映射路径.


- 设置Web应用的启动方式


利用上面目录保存Web应用最终运行目录。
Tomcat绑定
点击AddConfigurations ,然后点击Templete

然后找到Deployment(程序部署方式),点击+号。
第二个红框修改为:first/
然后再次点击AddConfigurations,然后点+号找到Tomcat -> Local出现
回到IDEA。
运行Tomcat出现:

Servlet
创建过程
在java目录下创建FirstServlet文件。
在pom.xml文件中添加:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc</groupId>
<artifactId>servlet-first</artifactId>
<version>1.0.0-RELEASE</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>
FirstServlet文件
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class FirstServlet extends HttpServlet {
public FirstServlet() {
System.out.println("正在创建FirstServlet");
}
@Override
public void init() throws ServletException {
System.out.println("正在初始化FirstServlet");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
System.out.println("返回给浏览器的响应内容为:" + html);
PrintWriter out = resp.getWriter();
out.println(html);
}
@Override
public void destroy() {
System.out.println("正在销毁FirstServlet");
}
}
然后在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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.imooc.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>
<servlet-mapping> 主要是对servlet-name进行url映射。
然后启动Tomcat:
编译生成对应字节码文件。
但是Tomcat加载的是下面的目录文件:
浏览器输入localhost:8080/hi?name=Jackson :

图解执行流程

Java Web 工程标准结构


Servlet开发步骤
- 创建Java类,继承HttpServlet
- 重写service方法,处理请求,生成响应
- 配置web.xml,绑定访问地址
示例:
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SampleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.处理请求中的用户数据
String name = req.getParameter("name");
String mobile = req.getParameter("mobile");
//2.通过响应返回结果(返回响应文本)
PrintWriter out = resp.getWriter();
out.println("<h1>name:" + name + "</h1>");
out.println("<h1>mobile:" + mobile + "</h1>");
}
}
然后web.xml文件绑定servlet:
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>com.imooc.servlet.SampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/sample</url-pattern>
</servlet-mapping>

Servlet访问方法
格式:http://IP地址:端口号/上下文/Servlet映射地址
示例:http://192.168.31.106:8080/xproject/sample
上下文在开发时已不推荐使用,建议默认使用" / "
请求参数
- 请求参数是指浏览器通过请求向Tomcat提交的数据
- 请求参数通常是用户输入的数据,待Servlet进行处理
- 参数名=值1&参数名2=值2& 参数名3=值3& 参数名n=...
Servlet接收请求参数
- request.getParameter() - 接收单个参数
- request.getParameterValues() - 接收多个同名参数
示例:
student.html
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class StudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String mobile = request.getParameter("mobile");
String sex = request.getParameter("sex");
String[] specs = request.getParameterValues("spec");
PrintWriter out = response.getWriter();
out.println("<h1>name:" + name + "</h1>");
out.println("<h1>mobile:" + mobile + "</h1>");
out.println("<h1>sex:" + sex + "</h1>");
for(String spec:specs){
out.println("<h2>spec:" + spec + "</h2>");
}
}
}
web.xml中增加:
<servlet>
<servlet-name>student</servlet-name>
<servlet-class>com.imooc.servlet.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>student</servlet-name>
<url-pattern>/student</url-pattern>
</servlet-mapping>

Get和Post请求方法
Get方式是将数据通过URL附加数据显性向服务器发送数据。
- http://localhost:8080/FirstServlet/sample?name=zhangsan
Post方式会将数据存放在“请求体”隐性向服务器发送数据
- http://localhost:8080/FirstSevlet/sample
- 请求体:name=zhangsan
应用场景
Get常用于不包含敏感信息的查询功能
- 例如:https://www/baidu/com/s?wd=imooc&rsv_spt=1
Post请求用于安全性要求较高的功能或者服务器的“写”操作
- 用户登陆
- 用户注册
- 更新公司账目
示例:
Get:
Post:
Get与Post处理方式
- 所有请求 - service()方法
- Get请求 - doGet()方法
- Post请求 - doPost()方法
示例:
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class RequestMethodServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
PrintWriter out = response.getWriter();
out.println("<h1>GET:name:" + name + "</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
PrintWriter out = response.getWriter();
out.println("<h1>POST:name:" + name + "</h1>");
}
}
web.xml中绑定servlet:
<servlet>
<servlet-name>requestMethod</servlet-name>
<servlet-class>com.imooc.servlet.RequestMethodServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requestMethod</servlet-name>
<url-pattern>/request_method</url-pattern>
</servlet-mapping>
Servlet生命周期
- 装载 - web.xml
- 创建 - 构造方法
- 初始化 - init()
- 提供服务 - service()
- 销毁 - destory()
示例:
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class FirstServlet extends HttpServlet {
public FirstServlet() {
System.out.println("正在创建FirstServlet");
}
@Override
public void init() throws ServletException {
System.out.println("正在初始化FirstServlet");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
System.out.println("返回给浏览器的响应内容为:" + html);
PrintWriter out = resp.getWriter();
out.println(html);
}
@Override
public void destroy() {
System.out.println("正在销毁FirstServlet");
}
}
启动Tomcat,在第一次访问时才创建FirstServlet对象(单例)
关闭Tomcat
使用注解配置Servlet
- Servlet 3.x之后引入了“注解Annotation”特性
- 注解用于简化Web应用程序的配置过程
- Servlet核心注解:@WebServlet
示例:
package com.imooc.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/anno")
public class AnnotationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("I'm annotation servlet!!");
}
}
在类上添加注解,就不需要在web.xml绑定servlet的Url.

浙公网安备 33010602011771号