Javaweb基础入门(十二)之Servlet

1.简介

用于开发动态web项目的技术
运行在web服务器中的小型java程序
Servlet :Server+Let服务端的一个应用程序
Applet : Application + let 客户端的一个应用程序

注意:

修改了 web.xml /servlet 必须重启服务器
修改了 html/css/js 不用重启 刷新即可

2.三种创建方式

1.继承 HttpServlet 类

(1)创建一个类,继承于HttpServlet
(2)重写doGet()方法 和doPost()方法

2.继承GenericServlet类

(1)创建一个类,继承于GenericServlet类
(2)重写service()方法
3.实现Servlet接口
(1)创建一个类实现Servlet接口
(2)重写getServletConfig()方法、getServletInfo() 方法、init(ServletConfig arg0)方法、service(ServletRequest request, ServletResponse response)方法、destroy()方法

3.Servlet的生命周期

实例化(构造函数) –> 初始化(init) –> 服务(service) –> 销毁(destroy)
出生:实例化(构造函数) –> 初始化(init) 第一次访问Servlet 就 出生
活着:服务(service) 应用活着的 Servlet就活着
死亡:销毁(destroy) 应用卸载了 Servlet就销毁

4.web.xml配置

 <servlet>
  <!--名称  -->
    <servlet-name>hello2</servlet-name>
    <!--Servlet的全称类名  -->
    <servlet-class>com.abc.web.servlet.HelloServlet</servlet-class>
    <!--启动的优先级,数字越小越先起动  -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!--映射配置  -->
  <servlet-mapping>
  <!--名称  -->
    <servlet-name>hello2</servlet-name>
    <!--资源的匹配规则:精确匹配  -->
    <url-pattern>/hello2</url-pattern>
  </servlet-mapping>

在web.xml中 一个servlet标签 可以对应多个servlet-mapping 标签 可以设置多个路径 访问到同一个servlet
优先级:
从高到低
绝对路径 –> /开头匹配 –> 扩展名方式匹配
url-pattern : /demo_01
url-pattern : /abc/*
url-pattern : *.do 扩展名匹配 前面不要加/
* 通配符 代表任意字符串

匹配规则:
(1)精确路径匹配

例如 servletA 的url-pattern 为/a
servletB 的url-pattern 为/b
url-pattern 为/*
如果访问地址为 http://localhost:8080/项目名/a –>servletA

(2)最长路径匹配

例如 servletA 的url-pattern 为/test/*
servletB 的url-pattern 为/test/b/*
如果访问地址为 http://localhost:8080/项目名/test/b –>servletB

(3)扩展匹配

如果url最后一段包含扩展 会根据扩展 选择合适的servlet 例如 servletA的
url-pattern 为 *.php

5.ServletConfig的使用

用于封装Servlet的配置信息
代表当前Servlet在web.xml中的配置信息 (用的不多)
从一个Servlet被实例化后 对任何客户端在任何时候访问都有效

作用:

(1)获取Servlet配置信息
(2)获取ServletContext对象

获取ServletConfig 的三种方式

(1)重写 GenericServlet 的init方法 得到 ServletConfig 对象 调用
getInitParameter方法 根据名字 获取值
(2)通过 祖先 Servlet 的 getServletConfig()方法 获取 ServletConfig 对象
(3)HttpServlet 已经实现了 ServletConfig 接口

常用方法:

String getServletName() 获取当前servlet在web.xml中配置的名字
String getInitParameter(String name)获取当前servlet在web.xml的初始化参数值
Enumeration getInitParameterNames() 获取所有初始化参数名字组成的枚举
ServletContext getServletContext() 获取 代表当前web应用的 ServletContext 上下文作用域

6.Servlet三大域对象

(1)ServletContext 整个web项目 上下文作用域
(2)HttpSession 一次会话 会话作用域
(3)ServletRequest 一次请求 请求作用域

ServletContext 上下文作用域

ServletContext: Servlet上下文

当Web服务器启动时 会为每一个web应用程序创建一个共享的存储区域
ServletContext也叫作 “公共区域” 在服务器启动时创建 服务器关闭时销毁 容器在启动的时候 会为每一个web应用创建一个唯一的对象 该对象 一般称之为 “Servlet上下文” 一个应用程序 只有一个ServletContext对象

获取方式:

(1)通过 ServletConfig 获取 ServletContext getServletContext() 获取
(2)在HttpServlet中直接获取 this.getServletContext()
(3)通过HttpRequest获得request.getSession().getServletContext()

常用方法:

void setAttribute(String name,String value) 向ServletContext对象中添加数据
Object getAttribute(String name)从ServletContext中获取数据
void removeAttribute(String name)从ServletContext中移除数据
String getRealPath(String path) 根据资源名称 得到资源的绝对路径 可以得到当前应用 任何位置的任何资源

Servlet上下文的特点

作用:
1、获取真实路径       获取当前项目的发布路径

    request.getSelectContext().getRealPath("/");

2、获取容器的附加信息

    System.out.println(request.getServletContext().getServerInfo());
    System.out.println(request.getServletContext().getContextPath());

3、全局容器
//设置信息到全局容器中

    request.getServletContext().setAttribute("msg", "共享信息");

//获取数据

    System.out.println(request.getServletContext().getAttribute("msg"));

//移除数据

    request.getServletContext().removeAttribute("msg");

请求转发
理解:我借钱 这叫请求 他向别人借 叫转发
前端页面向后台服务器发送一个请求 然后利用方法 将请求转发出去 跳转到另一个Servlet/jsp中

getRequestDispatcher(String path)转发到某个地址 参数 必须以 斜杠(/)开始
forward(request,response)将请求和响应带过去

特点:地址栏不发生改变 还是原来的地址

7.请求 和 响应

HTTP协议 封装了 请求 和 响应

请求部分:

(1)请求消息行 GET/POST 请求方式

浏览器默认请求方式GET
URI:去掉 协议 IP地址 端口
协议/版本

(2)请求消息头

Accept:浏览器可以接收的MIME类型
告诉服务器客户端能够接收什么类型的文件
Accept-Encoding:浏览器嫩够进行解码的数据解码方式
Accept-Language:浏览器所希望的语言类型
Host:初始URL中主机及端口号
Referer:包含一个URL用户从该URL代表的页面出发 访问当前的请求页面
Content-Type:内容类型
User-Agent:浏览器类型
Content-Length:表示请求消息正文的长度
Cookie:这是最重要的
Date:请求时间

(3)请求正文

当请求方式是Post的时候 才能看到请求消息正文

(4)响应部分:
响应消息行

HTTP/1.1 200 ok
协议版本 响应状态码 一切正常

响应消息头

Location:通常 和 302/307一起使用 完成请求重定向
Server:显示服务器类型
Content-Encoding:服务器发送的数据采用的编码集
Content-Length 告诉浏览器正文的长度
Content-Language 服务器发送的文本语言 zh-cn

响应正文

和 网页 右键 “查看页面源代码”看到的内容一样

8.HttpRequest 请求作用域

web服务器收到客户端的http请求 会针对每一次请求 分别创建一个 request对象 和一个response对象

获取请求行中的信息常用方法:

getMethod() 获取请求方式
getRequestURL() 获取客户端发送请求时的完整URL地址
getRequestURI() 获取请求行中的资源名部分
getContextPath() 获取当前应用的虚拟目录
getQueryString() 获取请求行中的参数部分

获取请求头中的信息常用方法:

String getHeader(String name)根据头名称 得到头信息
Enumeration getHeaderName() 得到所有头信息
Enumeration getHeaders(String name)根据头名称 得到信息

获取请求正文与获取表单数据相关的方法

String getParameter(String name)根据表单中name属性 获取value值
String[] getParameterValues(String name)根据表单中复选框名字 获取值的数组
Map<String,String[]> getParameterMap()得到表单提交的所有值
Enumeration getParameterNames() 得到表单提交的所有name属性
ServletInputStream getInputStream()以字节流的形式获取所有表单数据
当表单提交方式为post时 请求消息正文有内容 可以使用getInputStream()来获取

9.BeanUtils

Apache公司提供的 用来专门进行javaBean操作的 在web层各种框架中都可
以被使用

步骤:

1.下载BeanUtils的jar包
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
2.web项目 下 lib目录 导包

常用方法:

BeanUtils.populate(Object obj,Map map)

因为该方法需要Map集合 所以必须先使用 request getParameterMap()方法 获取前端表单数据的Map集合
注意事项:

  1. 前端 表单项名 name 属性 必须 和 javaBean中的属性名保持一致
  2. String –> java.util.Date 不支持我们需要自定义转换器
    自定义转换器:
    1.实现Converter接口
    2.注册转换器
    ConvertUtils.register(转换器,目标类型.class);
    结论: 一般不需要自定义转换器 只有Date需要

与请求转发相关的方法

RequestDispatcher getRequestDispatcher(String path)

ServletContext 和 HttpRequest 域对象的getRequestDispatcher()区别:

ServletContext 中的方法 参数 必须以 斜杠(/)开头被解释为相对于当前上下文根的路径
HttpRequest 中的方法 参数 可以写(/)也可以不写 如果路径以(/)开始 则被解释为相对于当前上下文根的路径 如果没有(/)开始 则被解释为相对于当前Servlet的路径

RequestDispatcher

forward(request,response) 转发
include(request,response) 包含

与操作非表单数据相关的方法

void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);

与请求编码相关的方法
前端是 post 方式请求

setCharacterEncoding("编码集")

前端是 get 方式请求

username = new String(username.getBytes("iso-8859-1"),"utf-8");

10.HttpServletResponse

响应

1.响应行

setStatus(int sc) 设置响应状态码

2.响应头

sendRedirect(String location)请求重定向
setHeader(String name,String value)设置响应头信息

3.响应正文

getWriter() 字符输出流
getOutputStream() 字节输出流
setCharacterEncoding(String charset)设置响应编码集
setContentType(String type)

转发 和 重定向的区别

Servlet中 页面的跳转有两种方式 转发 和 重定向
1.转发 是 服务器行为 , 重定向 是客户端行为
2.转发 是浏览器发送了一次请求 ,重定向至少两次请求
3.转发 的地址栏不会发生改变, 重定向地址栏中的地址发生改变
4.转发 因为是一次请求 两次跳转之间 传输数据不会丢失
  重定向是两次跳转 数据会丢失
5.转发 只能将请求跳转到同一个web应用中的页面
  重定向可以指向任意页面 包括同一个web应用 同一个站点 其他网站
6.转发 是request域的方法
  重定向 是 response对象的方法
  req.getRequestDispatcher("response6").forward(req, resp);
  resp.sendRedirect("response6");

servlet综合案例
链接:https://pan.baidu.com/s/1zmcff3aDeDs-WFeh_TWRLw 密码:mysh

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值