了解 Tomcat 到上手 Servlet --- 看本文就够了

Tomcat 是一个 HTTP 服务器,基于 TCP socket 实现的,可以处理 HTTP 请求也可以发送 HTTP 响应,基于Java实现的运行在JVM上

类似的 HTTP 服务器有很多,Tomcat 属于比较知名的一个。

Tomcat 会提供一组 API,让我们可以处理 HTTP 请求,

Tomcat 下载链接:Apache Tomcat® - Welcome! 下载 Tomcat 8.5.x,小版本号无所谓

目录结构

bin 二进制文件,可执行文件,服务器启动程序就在这里, windows startup.bat,linux startup.sh

conf 相关的配置文件

lib Tomcat 需要的一些库

logs 日志文件,记录中间状态

temp 临时文件

webapps 存放我们的代码,编译后的 class文件

work 会将 jsp 编译成 java文件,再编译成 class 文件存放在这儿

Tomcat 启动

双击 bin 目录底下的startup.bat,如果失败,将 startup.bat 托拽到 cmd 中启动,如果启动失败就会出现报错信息

在 webapps/ROOT 下放一个 html 文件 例如 文件名为 test.html,启动Tomcat之后,我们可以直接 127.0.0.1:8080/test.html,访问到该文件。在 ROOT 底下的文件访问的时候 URL 不用加 ROOT,在webapps 底下的其他目录则需要加上,例如 webapps 底下有个 test11 目录,test11 底下有一个 test.html,我们访问URL 应该是 test11/test.html

静态页面:页面结构和内容都是不变的

动态页面:页面结构不变,但是内容会改变

初识

Servlet 是 Tomcat 提供的一组 API,用于实现动态页面开发

七大步

创建 Maven 项目

什么是 Maven

Maven 是一个项目管理工具,管理代码中的依赖关系,从 Maven 中央仓库中下载项目所需要的库文件到本地仓库中并且

可以使用模板创建,也可以不使用

引入依赖

引入 Servlert 依赖
https://mvnrepository.com/ 进去后直接搜 servlet 因为 Tomcat 版本是 8.5.x,所以 servler API 版本选择 3.1.x

版本对应关系网址:Apache Tomcat® - Which Version Do I Want?

创建目录

main 底下创建 java 文件夹 和 resources 文件夹 和 webapp 文件夹

webapp 文件夹下创建 WEB-INF 文件夹

WEB-INF 底下创建 web.xml 文件

注意:java代码放在 java文件夹下,静态资源如 图片,html 文件,js 文件,css 文件放在 webapp 底下

web.xml 文件复制固定内容

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

编写代码

Java 文件夹下创建类 继承自 HttpServlet,重写doGet,doPost 方法

@WebServlet("/hello1")
    public class Demo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            resp.getWriter().write("我很好");
        }
    }
  • HttpServletRequest 表示 HTTP 请求,Tomcat 会把 以字符串形式发送过来的 HTTP 请求 转换成一个 HttpServletRequest对象
  • HttpServletResponse 表示 HTTP 响应
  • resp.getWriter 获得 输出流,会将数据写入 响应的 Body 部分,Tomcat 会将响应以字符串的形式通过Socket 发送给浏览器

打包

会将代码进行编译,生成一个压缩包,后缀名是 jar 或者 war

Tomcat 会识别 war 包,所以我们需要将 打包格式者为 war,在 pom.xml 文件中新增 packaging 标签

修改包格式

<packaging>war</packaging>		

修改包名

<build>
  <finalName>name</finalName>
</build>

部署

将包拷贝到 Tomcat 的 wepapps 目录底下,启动 Tomcat 时,Tomcat 会自动将 包解压缩

验证程序

启动 Tomcat 后,打开浏览器进行验证

常见错误

  • url 路径出错 404,少写 Context Path 或者 少写 Servlet Path
  • 请求方法没有实现,路径是对的,但是没有相应方法,例如 只重写 doGet 方法,那么如果请求是 Post,那么就会报 405(方法未实现)
  • 报 500(内部服务器错误),服务器代码运行中抛异常了
  • 无法访问此网站,或许是 Tomcat 没有启动

Servlet API

HttpServlet 是 父类

HttpServlet

方法

  • init HttpServlet 实例化之后调用此方法
  • destroy HttpServlet实例销毁前调用
  • service 每次收到 Http 请求时候调用
  • doGet/doPost/doDelete...

注意

使用 ajax 发送 请求的时候 url 部分可以使用相对路径和绝对路径,如果使用绝对路径,需要包含 Context Path,因为 此处绝对路径从 域名后开始

HttpServletRequest

重要方法

方法

作用

String getProtocol()

获取 Http 请求的协议名称和版本

String getMethod()

获取 Http 请求的方法名称

String getRequestURI()

假如请求是 http://localhost:8080/test1/hello1,则

返回值是 /test1/hello1

String getContextPath()

获取 上下文路径

String getQueryString()

返回 查询字符串 例如:http://localhost:8080/myapp/page.jsp?name=John&age=25 返回:name=John&age=25

String getParameter(String name)

根据请求参数返回请求参数的值,如果没有参数不存在

返回 null

String[] getParameterValues(String name)

假如 请求路径是http://localhost:8080/myapp/page.jsp?color=red&color=blue&color=green,则执行request.getParameterValues("color")会返回一个字符串数组,其中包含"red", "blue"和"green"

String getHeader(String name)

根据请求头返回请求头的值

String getCharacterEncoding()

String getContentType()

返回请求的 body 部分使用的 编码格式

返回 MIME 类型

例如:请求头中包含Content-Type: application/json; charset=UTF-8,则执行request.getCharacterEncoding()会返回"UTF-8",而执行request.getContentType()会返回"application/json"。

InputStream getInputStream()

获取 body 的输入流(字节流)

Reader getReader()

获取 输入流(字符流)

获取 post 请求的参数

  1. 如果 Body 中的值是通过 form 表单构造的,可以通过 getParameter("String name")
  2. 如果 Body 中数据格式是 json,可以通过 Jackson 库来进行解析,首先需要写一个类,这个类的成员变量的名字需要跟 Json 中的 key 一致,然后 实例化一个 ObjectMapper(Jackson 核心类) 对象,使用这个对象的 readvalue 方法,传入 json 字符串 或者 Body 输入流 和 构造的类的类对象,readValue 方法会进行赋值然后返回构造的类的实例化对象

将对象转换成 json 字符串

使用 ObjectMapper 中的 writeValue() 方法

注意

如果要获得 Body 中的值,

设置 header 值时候,尽量在 body之前,不然可能导致 header 设置不生效

Tomcat 通过 Socket API 将 Http 请求(字符串),按照 Http 格式 将字符串解析成 HttpServletRequest 对象

URI 和 URL

URI:唯一资源标识符
URL:唯一资源定位符
假设 有个网页 URL 是 www.baidu.com/example/test.html,可以通过这个 URL 可以访问到这个网页。此时 UR
可以是 www.baidu.com/example/test.html,也可以是 urn:example:test,urn 是某个资源我们给他定的名字,
需要能唯一标识这个资源就行,不要求 定位

HttpServletResponse

重要方法

方法

作用

void setStatus(int st)

设置响应状态码

void setHeader(String name, String value)

设置 header 的值,会覆盖原有的 header 的值

void addHeader(String name, String value)

增加 header,不会覆盖已有 header

void setContentType(String type)

设置 body 类型

void setCharacterEncoding(String type)

设置编码类型 例如 utf8

void sendRedirect(String location)

设置重定向 URL,响应增加一个 Location header

PrintWriter getWriter()

获取输出流(字符流)

OutputStream getOutputStream()

获取输出流(字节流)

设置 响应 的 Refresh 字段可以控制浏览器的刷新时间,Refresh 的值的单位是 秒。Date 类的 getTime() 方法可以获取到当前时刻的毫秒级时间戳。System.currentTimeMillis() 也可以获取到毫秒级时间戳

Cookie 和 Session

出于安全的考虑,浏览器不让页面直接访问文件系统,而 cookie 是给 Http 协议提供的一套持久存储数据的方案

cookie 在客户端只能存储键值对,不能存储对象,只能存字符串,并且是按照域名进行分类的,意思就是百度有专门的cookie,谷歌有另外的cookie

服务器为用户分配 session 后会生成一个随机的 sessionId,类似于 hash表,然后将sessionId 发送给 客户端,以后客户端的请求中就会带上 sessionId,服务器就可以验证用户身份

误区

  • session 和 cookie 经常会搭配使用但不是必须的
  • sessionId 也不一定就非得要 cookie 传输

相关方法

HttpServletRequest

方法

作用

HttpSession getSession()

当参数是 空 或者 true 时,如果没有会话会新建一个

当 参数是 false 如果没有会话会返回 null

Cookie[] getCookies()

根据请求中的 cookie,返回所有的 cookie 对象


HttpServletResponse

方法

作用

void addCookie(Cookie cookie)

在响应报文中添加一个 cookie 对象


Cookie

方法

作用

String getName()

获取 key

String getValue()

获取 value

void setValue(String newValue)

设置新的 value

HttpSession

方法

作用

Object getAttribute(String name)

根据 key 获取 sesson 中相应的 value

void setAttribute(String name, String value)

设置一组新的键值对

Boolean isNew()

判断是否是新建的会话

上传文件功能

HttpServletRequest

方法

作用

Part getPart(String name)

获取指定名字的文件,不是文件真实名字而是 form 表单的 name 属性的值

Collection<Part> getParts()

获取请求中所有文件

Part

方法

作用

String getSubmittedFileName()

获取文件真实名字

String getContentType()

获取文件类型 MIME 类型,形如 image/jpeg

long getSize()

获取文件大小

void write()

将文件写入磁盘

注意

要想使用 getPart() 方法需要在 类上加上注解 @MultipartConfig

JSP 文件存放位置

在 Servlet 中,JSP 文件通常放在 webapp 目录下的 jsp 文件夹中,而不是放在 java 文件夹下


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值