Servlet介绍与配置

Servlet的介绍与配置

Servlet 是 Java 语言官方推出一个 web 容器,是用来构建web应用程序的框架
Servlet 编写的代码是需要运行在web服务器上的, 不能通过main方法进行调用

Web 服务器

tomcat: 是一个非常轻量级的服务器、通常用来部署java的中小型web应用型,普通被企业认可
jboss : 是一个商用的 web应用服务器,主要应用与大型java应用程序
weblogic : 是Oracle提供的基于java的web应用服务器、支持大型的java应用程序、多用于银行、政府项目
apache : 是一个开源的优秀的web服务器,不能直接部署java服务,主要可以做 web代理服务器来使用
IIS : 是微软提供的一个基于 .net 的 web服务器

安装与配置Tomcat

Tomcat 官方下载解压后的目录结构

apache-tomcat-9.X
    bin :  内置了tomcat的一些命令
    conf : 内置了tomcat 的配置文件
    lib: 存放tomcat 需要的第三方库依赖库
    logs : 存放tomcat 运行产生的日志(通过分析日期、可以解决项目中的问题)
    temp : 存放系统运行产生的临时文件
    webapps : 存放多个java web项目, 用来做项目部署
    work : web应用程序在运行过程中jsp转换后的java字节码文件

修改 tomcat端口号

tomcat 端口号默认是 8080
配置文件是 conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

URIEncoding="UTF-8"是解决WEB服务器在进行GET请求传入中文参数乱码的、在Tomcat8之后的版本可以不在设置

搭建一个基于 Servlet的 web 项目

怎么编写一个 Servlet 类

  • 引入 Servlet 相关的依赖包
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>9.0.65</version>
</dependency>
  • 编写一个 java 类 、继承 HttpServlet

  • 重写 HttpServlet 中的 service 方法

  • 在 类上使用 @WebServlet 设置请求路径

Servlet 的生命周期

  • init() : 初始化Servlet , 该方法中编写的代码只会被执行一次,且在第一次使用servlet的时候,加载

可以给 Servlet 初始化一些数据、如果想让 init 在 tomcat 启动完成后就执行, 那么需要在该Servlet添加一个配置
@WebServlet(value = “/xxx”, loadOnStartup = 1) , loadOnStartup默认值 -1

  • service() : 提供服务的方法,每次请求 都会被 执行的代码

  • doXxx() : (doGet, doPost, doPut, doDelete) : 和请求方式相关的方法、如果是 get 请求,则会在调用service之后,自动调用 doGet

  • destroy() : 销毁, 当销毁(web服务关闭的时候)servlet对象的时候,会执行的代码,只会被执行一次

HttpServletRequest 请求对象

浏览器 -> 服务器 封装的 对象 就被称为 请求对象
请求对象 通常可以用来 获取 从浏览器 携带的 信息

  • getScheme() :获取请求的协议, 例如返回 http
  • getServerName() : 获取服务的域名、例如返回 localhost
  • getServerPort() : 获取服务的端口、例如返回 8080
  • getContextPath() : 获取项目名,例如返回 /servlet
  • getRequestURI() : 获取请求地址(端口号后面的内容,问号前面的内容)
  • getRequestURL() : 获取网址(不包含请求参数)
  • getHeaderNames() : 获取所有的请求头、返回一个枚举对象
  • getHeader(name) : 根据请求头、获取请求头的值,请求头信息的键都是小写的
  • getCookies() : 获取浏览器存储的所有Cookie, 如果没有,返回 null
  • getMethod() : 获取请求的方法(大写表示),例如返回 GET, POST

获取页面请求的参数

  • getParameter(String key) : 根据请求参数的名 获取 请求参数值(单值)

如果 传入 key ,则 返回一个 字符串, 如果没有传 key, 则返回 null
如果 key 传入了多个,只会获取到第一个值

  • getParameterValues(String key) : 根据请求参数的名、获取请求参数值(多值)

  • request.getParameterNames() : 获取所有的请求参数名,返回一个枚举对象 (了解)

  • request.getParameterMap() : 获取所有的请求参数,返回一个 Map<String, String[]> 对象

乱码解决访问

POST 传参中文乱码解决方案

request.setCharacterEncoding("UTF-8")

Idea 控制台输出的内容乱码解决方案

-Dfile.encoding=UTF-8

GET 参数中文乱码解决方案

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

响应的数据在浏览器中乱码解决方案

response.setCharacterEncoding("UTF-8")

// 响应 网页 乱码解决方案
response.setContentType("text/html;charset=UTF-8"); 

// 响应 JSON 乱码解决访问
response.setContentType("application/json;charset=utf-8");

JSP 页面乱码解决方案

<%@page pageEncoding="UTF-8" contentType="text/html; utf-8" %>

页面跳转

  • 转发 forward
  • 重定向 redirect

使用 request 实现 页面的 转发 跳转

request.getReqeustDispatcher(urlpattern).forward(request, response);

整个跳转是 1 次请求
地址栏的地址不会发生变化(从请求开始的地址 — > 响应的结束地址 地址没有发生改变)
可以通过 request 向页面传递 数据 request.setAttribute(key ,val)
可以在跳转的页面中,通过 request.getAttribute(key) 来获取数据
request 只能在 自身服务器提供的 服务中 进行跳转
转发到的请求 和 原请求的 请求方式 是一致的

jsp页面通常不允许直接访问,转发的操作通常推荐跳转到jsp页面中

使用 response 实现 页面的 重定向 跳转

response.sendRedirect(requestURI|URL); 

整个跳转是 2次 请求
地址栏的地址发生了变化(从请求开始的地址 — > 响应的结束地址 地址没有发生改变)
不能通过 request 向页面传递数据
可以跳转到任意的网址
重定向的请求地址 一定是采用 GET 请求访问的

将 JSP 页面 进行保护

在 web开发中,通常不允许用户直接访问到 jsp 页面,1.会暴露网站的开发技术、2.经过转发可以携带数据,更方便网页的展示、3.路径更优雅
WEB-INF 是一个非常特殊的目录、该目录下存储的所有内容不能直接访问,但可以通过转发来获取

Servlet 三大作用域容器

可以进行数据存储
数据的格式是键值对格式的数据,键是字符串格式、值是任意数据类型
可以在JSP页面中获取对应的数据
setAttribute(key, val) : 用来存储数据
getAttribute(key) : 获取存储的数据
removeAttribute(key) : 移除存储的数据

  • request (HttpServletRequest)
  • session (HttpSession)
request.getSession() ;
  • application (ServletContext)
request.getSession().getServletContext()

存储在request作用域中的数据 只能在同一个请求中才能够使用,会随请求的结束而销毁

存储在session作用域中的数据 当 session没有过期(默认30分钟) 或者 浏览器没有关闭 的时候,可以在任何位置使用,可以跨请求传递数据
session是基于用户(浏览器) 的、所以存储在session中的数据在不同用户间是隔离的

存储在application作用域中数据 整个 web应用程序都可以访问和使用、会随web应用程序的关闭而销毁。

Session 的工作原理

Cookie : 是存储在浏览器中的一段字符串、Cookie可以用来做登录的标识 , Cookie是基于浏览器的技术
Session : 是存储服务器中的数据的、也是用来存储登录的标识、Session是基于服务器的技术

当用户访问session的时候、服务器会获取浏览器中的Cookie信息找到一个 Cookie的键为 jsessionid 的Cookie

如果找不到 jsessionid 对应的Cookie , 那么 服务器 会创建一个 Session对象,并将 session对象的唯一标记ID 存储到 浏览器的Cookie中
键是 jsessionid , 值 为 session的唯一标记ID

如果找到了jsessionid对应的Cookie, 则 获取 对应的 Cookie value值(session的ID) , 并根据 value 值 从 SessionStore 容器中,获取管理的
session对象, 并返回 session对象

如果浏览器禁用了Cookie、 那么要使用session的时候,需要在地址上拼接一个 ;jsessionid=XXXXXXXXXXXXXXXXXXX

在 JSP 中使用 脚本指令

  • <% … %> : 可以编写 java 代码,支持多行代码, 每行代码必须以 ; 结尾

  • <%= … %> : 输出结果、= 后面只能写 java 表达式 、且 不用使用 ; 结果

on对象, 并返回 session对象

如果浏览器禁用了Cookie、 那么要使用session的时候,需要在地址上拼接一个 ;jsessionid=XXXXXXXXXXXXXXXXXXX

在 JSP 中使用 脚本指令

  • <% … %> : 可以编写 java 代码,支持多行代码, 每行代码必须以 ; 结尾

  • <%= … %> : 输出结果、= 后面只能写 java 表达式 、且 不用使用 ; 结果

  • <%! … %> : 用来定义 内部类 、 成员变量和方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值