Servlet入门详解(包含Tomcat 的安装使用)

简单的JavaWeb工程

首先创建一个新工程:
在这里插入图片描述

选择:
在这里插入图片描述
输入工程名字后点击Finish
在这里插入图片描述

创建一个简单的Hello world文件
在这里插入图片描述
输入名字:
加粗样式

在文件中输入:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <p>Hello World</p>
</body>
</html>

点击右上角的浏览器图标,运行程序
在这里插入图片描述
也可以和其它程序一样,点击运行按钮
在这里插入图片描述

一.JavaWeb 的概念

JavaWeb 是指,所有通过Java语言编写可以通过浏览器访问的程序的总成,叫做JavaWeb
JavaWeb 是基于请求和响应来开发的

请求和响应
在这里插入图片描述
请求和响应是成对出现的,有请求就有响应

二.Web 资源的分类

web 资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种
静态资源: html css js txt mp4视频 jpg图片
动态资源:jsp 页面,servlet 程序

三.常用的Web 服务器

在这里插入图片描述

四.Tomcat 的使用

1) 安装
下载之后直接解压即可
相关目录作用

  • bin 专门用来存放 Tomcat 服务器的可执行程序
  • conf 专门用来存放 Tocmat 服务器的配置文件
  • lib 专门用来存放 Tomcat 服务器的 jar 包
  • logs 专门用来存放 Tomcat 服务器运行时输出的日记信息
  • temp 专门用来存放 Tomcdat 运行时产生的临时数据
  • webapps 专门用来存放部署的 Web 工程。
  • work 是 Tomcat 工作时的目录,用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码,和 Session 钝化的目录。
    2)启动

环境变量配置启动

在这里插入图片描述
然后在Path中点击新建,添加:
%CATALINA_HOME%\bin
在这里插入图片描述

环境变量配置好之后,进入Tomcat 目录下的bin文件夹,点击tomcat8w.exe
在这里插入图片描述

程序启动

找到 Tomcat 目录下的 bin 目录下的 startup.bat 文件,双击,就可以启动 Tomcat 服务器

命令行启动:

进入Tomcat 目录,点击上面的地址栏:输入cmd后回车
在这里插入图片描述
在这里插入图片描述
进入dos窗口,输入catalina run 启动
在这里插入图片描述

在idea 中配置tomacat:

方法一:

点击Run/Edit Configurations…
在这里插入图片描述
点击右上角的 + 号
在这里插入图片描述
点击Tomcat Server,根据自身情况选择本地还是远程。
在这里插入图片描述
填写配置信息:
在这里插入图片描述

方法二

进入File/Setting界面,
在这里插入图片描述

启动失败

原因一:jdk环境变量配置出错,重新配置jdk环境变量
原因二:8080端口被占用
我刚开始装就出现了:Cannot locate document: /
在这里插入图片描述
以管理员身份打开dos窗口
在这里插入图片描述

  1. 在cmd查找正在使用8080端口的进程:netstat -ano | findstr 8080
  2. 杀死正在使用8080端口的进程:taskkill -pid id -f(id是指进程的id)
  3. 重新启动的Tomcat,刷新页面即可

修改Tomcat 端口号

Tomcat 默认端口号
进入Tomcat 目录的conf文件夹中,打开server.xml
在这里插入图片描述
将端口号修改为自己想要的端口号
在这里插入图片描述
修改完端口号一定要重启Tomcat

IDEA 中动态 web 工程的操作

a)IDEA 中如何创建动态 web 工程

首先New 一个Module
在这里插入图片描述
然后进行配置,再输入模块名就可以了
在这里插入图片描述

b)在 IDEA 中部署工程到 Tomcat 上运行

建议修改 web 工程对应的 Tomcat 运行实例名称为自己工程对应的名字:
在这里插入图片描述
Edit Configurations 常用功能介绍
在这里插入图片描述

ROOT 的工程的访问,以及 默认 index.html 页面的访 问

当我们在浏览器地址栏中输入访问地址如下: http://ip:port/ ====>>>> 没有工程名的时候,默认访问的是 ROOT 工程。
当我们在浏览器地址栏中输入的访问地址如下: http://ip:port/工程名/ ====>>>> 没有资源名,默认访问 index.html 页面

五.Servlet

简介

a)什么是 Servlet

1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

b)手动实现 Servlet 程序

1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 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.amhu.yx.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 标签配置访问地址 <br/>
        / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
        <br/>
        /hello 表示地址为:http://ip:port/工程路径/hello
        hello会自动映射到HelleServlet中
        <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

运行文件,会发现:
在这里插入图片描述
而这正是index.jsp 文件中的内容:
在这里插入图片描述
如果输入:
在这里插入图片描述
界面上没有显示,在idea里面的日志栏里面有有显示,这就是HelloServlet 中的内容
在这里插入图片描述
对了,还需要在idea中配置tomcat相关信息,如:
在这里插入图片描述

Servlet 的生命周期

  • 执行Servlet构造器方法
  • 执行init 初始化方法
  • 执行service 方法
  • 执行destroy 方法

第一二步是在第一次访问,即创建Servlet程序的时候调用
第三步每次访问都会调用
第四步再web工程停止调用的时候调用

请求的分发处理

在这里插入图片描述
界面上添加一个表单,点击跳转到hello对应的HelloServlet文件中,如何判断是用get 或者 post 方法传递数据呢?
只需要在service 方法中获得就可以:
在这里插入图片描述
读取出来的请求方式一般是 GET, POST,可以根据请求方式的不同来进行相应的操作。

通过继承 HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法 ,(自己手动重写)
3、到 web.xml 中的配置 Servlet 程序的访问地址

添加HelloServlet2类:

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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.printf("HelloServlet2 收到了GET请求");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.printf("HelloServlet2 收到了POST请求");
    }
}

配置web.xml文件:
在这里插入图片描述
添加一个表单,点击跳转到hello2对应HelloServlet2
在这里插入图片描述
运行之后点击表单:
在这里插入图片描述

使用IDEA直接创建Servlet

在这里插入图片描述
配置信息
在这里插入图片描述

Servlet 的继承体系

在这里插入图片描述

ServletConfig 类

ServletConfig 类从类名上看,就是Servlet程序的配置信息类。

Servlet程序和ServletConfig 对象都是由Tomcat 负责创建,我们负责使用
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对
象。

作用:

  1. 可以获取 Servlet 程序的别名 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象
//1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
//2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
//3、获取 ServletContext 对象
System.out.println("Servlet 参数的ServletContest对象是:" + servletConfig.getServletContext());

在这里插入图片描述
在这里插入图片描述

ServletContext 类

什么是ServletContext

  1. ServletContext是一个接口,表示Servlet 上下文对象。
  2. 一个web工程只有一个ServletContext 对象实例。
  3. ServletContext 是一个域对象

域对象:可以向Map 一样存取数据的对象,叫域对象
这里的域指存取数据的操作范围。是整个web 工程

类型存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

常见作用:

  1. 获取 web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map 一样存取数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
	//1、获取 web.xml 中配置的上下文参数 context-param
	ServletContext context = getServletConfig().getServletContext();
	String username = context.getInitParameter("username");
	System.out.println("context-param 参数 username 的值是:" + username);
	System.out.println("context-param 参数 password 的值是:" +
	context.getInitParameter("password"));
	
	//2、获取当前的工程路径,格式: /工程路径
	System.out.println( "当前工程路径:" + context.getContextPath() );
	
	//3、获取工程部署后在服务器硬盘上的绝对路径
	/**
	*
	/ 斜杠被服务器解析地址为:http://ip:port/工程名/
	映射到 IDEA 代码的 web 目录<br/>
	*/
	System.out.println("工程部署的路径是:" + context.getRealPath("/"));
	System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
	System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
}

HttpServletRequest 类

  • HttpServletRequest 类有什么作用。
    每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
    然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
    信息。
  • HttpServletRequest 类的常用方法
    • getRequestURI() 获取请求的资源路径
    • getRequestURL() 获取请求的统一资源定位符(绝对路径)
    • getRemoteHost() 获取客户端的 ip 地址
    • getHeader() 获取请求头
    • getParameter() 获取请求的参数
    • getParameterValues() 获取请求的参数(多个值的时候使用)返回数组
    • getMethod() 获取请求的方式 GET 或 POST
    • setAttribute(key, value); 设置域数据
    • getAttribute(key); 获取域数据
    • getRequestDispatcher() 获取请求转发对象

在这里插入图片描述
在这里插入图片描述

获取请求参数:

添加表单:
在这里插入图片描述
在web.xml中配置信息
在这里插入图片描述
获取参数(当有多个参数时使用getParameterValues() ):
在这里插入图片描述

HttpServletResponse类

HttpServletResponse 类的作用

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置

两个输出流的说明。

  • 字节流 getOutputStream();
    常用于下载(传递二进制数据)

  • 字符流 getWriter();
    常用于回传字符串(常用)

两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。

往客户端回传数据

要求 : 往客户端回传 字符串 数据。

public class ResponseIOServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
	IOException {
		//要求 : 往客户端回传 字符串 数据。
		PrintWriter writer = resp.getWriter();
		writer.write("response's content!!!");
	}
}

响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
resp.getCharacterEndoding(),获取响应的字符类型

// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");

解决响应中文乱码方案二(推荐):
此方法一定要在获取流对象之前调用才有效

// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一个新地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
在这里插入图片描述
请求重定向的第一种方案:

// 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");

请求重定向的第二种方案(推荐使用):

resp.sendRedirect("http://localhost:8080");

中文乱码问题

GET请求出现中文乱码时:

// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");

POST请求出现中文乱码时:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
	// 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
	req.setCharacterEncoding("UTF-8");
	System.out.println("-------------doPost------------");
	// 获取请求参数
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	System.out.println("用户名:" + username);
	System.out.println("密码:" + password);

}

请求转发

请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发
在这里插入图片描述

public class Servlet1 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
	IOException {
	// 获取请求的参数(办事的材料)查看
		String username = req.getParameter("username");
		System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
		// 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
		req.setAttribute("key1","柜台 1 的章");
		// 问路:Servlet2(柜台 2)怎么走
		/**
		* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
		<br/>
		*
		*/
		RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
		//
		RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
		// 走向 Sevlet2(柜台 2)
		requestDispatcher.forward(req,resp);
	}
}

Servlet2 代码:

public class Servlet2 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
		IOException {
		// 获取请求的参数(办事的材料)查看
		String username = req.getParameter("username");
		System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
		// 查看 柜台 1 是否有盖章
		Object key1 = req.getAttribute("key1");
		System.out.println("柜台 1 是否有章:" + key1);
		// 处理自己的业务
		System.out.println("Servlet2 处理自己的业务 ");
	}
}

HTTP 协议

所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。
HTTP 协议中的数据又叫报文。

请求的HTTP协议格式

客户端给服务端发送数据叫请求。
服务器给客户端回传数据叫响应。

请求又分为GET 请求和POST请求。

GET请求

  1. 请求行
    • 请求方式 GET
    • 请求的资源路径 [+ ? + 请求参数]
    • 请i求的协议的版本号 HTTP/1.1
  2. 请求头
    • key: value 组成,不同的键值对表示不同的含义。

打开IE浏览器,按F12
在这里插入图片描述
找到网络对应的那一栏,然后在idea里面添加test.html 文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8081/servlettest_war_exploded/hello" method="get">
        <input type="submit">
    </form>
</body>
</html>

在IE浏览器上打开test.html
在这里插入图片描述
端口号等都是自己在idea里面配置的
点击提交查询内容,
在这里插入图片描述
在这里插入图片描述

POST 请求

  1. 请求行
    请求的方式 POST
    请求的资源路径[+?+请求参数]
    请求的协议的版本号 HTTP/1.1
  2. 请求头
  1. key : value 不同的请求头,有不同的含义
    空行
  1. 请求体===>>>就是发送给服务器的数据

常用请求头说明

Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号

哪些是 GET 请求,哪些是 POST 请求

GET 请求有哪些:

  • form 标签 method=get
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车

POST 请求有哪些:

  • form 标签 method=post

响应的 HTTP 协议格式

1、响应行

  1. 响应的协议和版本号
  2. 响应状态码
    200 请求成功
    302 表示请求重定向
    404 请求地址错误
    500 服务器已经收到请求,但是服务器内部错误(代码错误)
  3. 响应状态描述符
    2、响应头
    key : value 不同的响应头,有其不同含义
    空行
    3、响应体—>>>就是回传给客户端的数据

常见MIME类型

在这里插入图片描述

base标签的作用

<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base 标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
-->
<base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body>
这是 a 下的 b 下的 c.html 页面<br/>
<a href="../../index.html">跳回首页</a><br/>
</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值