JavaWeb4-Servlet

一、基础概念

1、作用

运行在服务端的小程序,负责接收客户端的信息并响应。(是一个最顶端的接口)

2、体系结构

Servlet(顶端接口)=>GenericServlet(抽象类)=>HttpServlet(抽象类)

  • GenericServlet(抽象类):将接口中的其他方法做了默认空实现,只将service()方法作为抽象方法;在调用Servlet时,只需继承GenericServlet,实现其方法即可;
  • HttpServlet(抽象类):对Http协议进行了封装,简化操作:定义类继承httpServlet;复写doGet/doPost()方法;
3、Servlet实现接口方法
  • init()
  • getServletConfig()
  • service()
  • destroy()
4、生命周期

1.创建:执行init方法,只能执行一次;(在第一次访问时被创建)

2.提供服务:执行servlet方法,可执行N次;

3.被销毁:执行destroy方法,只执行一次;

二、快速入门

1、创建Javaee项目
2、定义一个类去实现Servlet接口
3、实现接口中的抽象方法

public class HttpServletText1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

4、配置Servlet

(1)在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>
        <servlet-name>test</servlet-name>
        <servlet-class>servlet.HttpServletText1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

(2)在创建的类中注解:@webServlet(“资源路径”)

@WebServlet("/text")
public class HttpServletText1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

总结:
① 一个servlet可以定义多个访问路径;但指向的是同一个对象(@webServlet({“/s”,"/sw"}))

② 路径定义规则:

  • */XXX
  • */XXX/XXX
  • *.do:扩展名匹配

三、运行原理

1.当服务器接收到客户端浏览器的请求后,会解析url路径,获取访问Servlet的资源路径

2.查找web.xml文件,是否有对应的标签体内容;

3.如果有则在找到对应的全类名;

4.tomcat会将字节码文件加载到内存,创建其对象;

5.调用其方法

四、HTTP

1、简介

Hyper Text Transfer Protocol 超文本传输协议(传输协议:定义了,客户端和服务器端通信时,发送数据的格式)

2、特点
  • 基于TCP/IP的高级协议
  • 默认端口号:80
  • 基于请求/响应模型的:一次请求对应一次响应
  • 无状态的:每次请求之间相互独立,不能交互数据
3、分类
请求消息
响应消息
4、请求消息

1、作用

客户端发送给服务器端的数据

2、数据格式

(1)请求行

请求方式    请求url     请求协议/版本:
 GET       /login.html   HTTP/1.1

请求方式:

HTTP协议有7中请求方式,常用的有2种get和post
    GET
		1. 请求参数在请求行中,在url后。
		2. 请求的url长度有限制的
		3. 不太安全
	POST
		1. 请求参数在请求体中
		2. 请求的url长度没有限制的
		3. 相对安全

(2)请求头

作用:客户端浏览器告诉服务器一些信息
格式:请求头名称: 请求头值
	常见的请求头
		User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息( 可以在服务器端获取该头的信息,解决浏览器的兼容性问题)
		Referer:http://localhost/login.html
		* 告诉服务器,我(当前请求)从哪里来?
		* 作用:
				1. 防盗链:
				2. 统计工作

(3)请求空行

空行,就是用于分割POST请求的请求头,和请求体的。

(4)请求体

作用:封装POST请求消息的请求参数的
5、响应消息

1、作用
服务器端发送给客户端的数据

2、数据格式
(1)响应行

组成:协议/版本 响应状态码 状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

(2)响应头

格式:头名称: 值
常见的响应头
	Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
	Content-disposition:服务器告诉客户端以什么格式打开响应体数据

(3)响应空行

(4)响应体:传输的数据

五、获取客户端信息:request

1、request对象和response对象的原理

  • request和response对象是由服务器创建的。我们来使用它们
  • request对象是来获取请求消息,response对象是来设置响应消息

2、体系结构

ServletRequest  ---HttpServletRequest ---org.apache.catalina....(tomcat类 )

3、功能

3.1、获取请求数据

(1)获取请求行数据

  • String getMethod() 获取请求方式
  • String getServletPath() 获取Servlet路径
  • String getContextPath() 获取Servlet路径
  • String getQueryString() 获取get方式的请求参数
  • String getRequestURL() 获取请求URL
  • String getProtocol() 获取协议及版本
  • String getRemoteAddr() 获取客户机的IP地址

(2)获取请求头数据

  • String getHeader(String name)通过请求头的名称获取请求头的值;
  • Enumeration getHeaderName()获取所有请求头名称;

(3)获取请求体数据(POST请求方式有)
获取流对象

  • BufferedReaader getReader():获取字符输入流,只操作字符数据
  • ServletInputStream getInputStream() 获取字节输入流,操作所有

(4)其他功能
获取请求参数

  • String getParameter(String name):根据参数名获取参数值
  • String[] getParameterValues(String name):根据是参数名获取参数数组
  • Eumeration getParameterNames():获取所有参数的名称
  • Map<String,String[]> getParameterMap():获取所有参数的map集合
  • 中文乱码问题:
    get方式:tomcat8已经将get方式的乱码问题解决了;
    post方式:在获取参数前,设置request的编码为:request.setCharacterEncoding(“uft-8”);

4、请求转发
(1)概念
一种在服务器内部的资源跳转方式
(2)步骤

  • 通过request对象获取请求转发器对象:RequestDispacher getRequestDispacher(String path)
  • 使用RequestDispatcher对象来进行转发:forward(ServletRequest
    request,ServletResponse response)

(3)特点

  • 浏览器地址栏路径不发生变化
  • 只能转发到当前服务器内部资源中
  • 转发是一次请求

六、响应客户端消息:response

1、功能(设置响应消息)

(1)设置响应行

格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sc) 

(2)设置响应头

setHeader(String name, String value) 

(3)设置响应体

1.获取输出流
	字符输出流:PrintWriter getWriter()
	字节输出流:ServletOutputStream 
2. 使用输出流,将数据输出到客户端浏览器

2、完成重定向(资源跳转的方式)

(1)实现步骤

  • 设置状态码为302: response.setStatus(302);
  • 设置响应头location: response.setHeader(“location”,"/day15/responseDemo2");
  • 简单的重定向方法: response.sendRedirect("/day15/responseDemo2");

(2)重定向和转发的特点

重定向redirect

  • 地址栏发生变化
  • 重定向可以访问其他站点(服务器)的资源
  • 重定向是两次请求。不能使用request对象来共享数据

转发forword

  • 转发地址栏路径不变
  • 转发只能访问当前服务器下的资源
  • 转发是一次请求,可以使用request对象来共享数据

3、路径分类:相对路径和绝对路径

  • 相对路径:通过相对路径不可以确定唯一资源

     如:./index.html
     不以/开头,以.开头路径
     规则:找到当前资源和目标资源之间的相对位置关系( ./:当前目录;../:后退一级目录)
    
  • 绝对路径:通过绝对路径可以确定唯一资源

    如:http://localhost/day15/responseDemo2/day15/responseDemo2
     以/开头的路径
     规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
    

4、服务器输出字符数据到浏览器

(1)步骤

  • 获取字符输出流
  • 输出数据

(2)注意乱码问题

  • PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
  • 设置该流的默认编码
  • 告诉浏览器响应体使用的编码的形式,设置编码,是在获取流之前设置
    response.setContentType(“text/html;charset=utf-8”);

七、ServletContext对象

1、概念
代表整个web应用,可以和程序的容器(服务器)来通信
2、获取

  • 通过request对象获取: request.getServletContext();
  • 通过HttpServlet获取: this.getServletContext();

3、功能
(1)获取MIME类型

概念: MIME类型:在互联网通信过程中定义的一种文件数据类型
		* 格式: 大类型/小类型   text/html		image/jpeg
获取:String getMimeType(String file)

(2)域对象共享数据

setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据

(3)获取文件的真实(服务器)路径

  • String getRealPath(String path)
@WebServlet("/text3")
public class HttpServletText3 extends HttpServlet {

    //doGet()在 get 请求的时候调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServletText1的doGet方法");
        //1、获取 web.xml 中配置的上下文参数 context-param
        ServletContext context=getServletConfig().getServletContext();
        System.out.println("context-param 参数 username 的值是:" +context.getInitParameter("username"));

        //2.获取当前工作路径
        System.out.println("当前工程路径"+context.getContextPath());

        //3、获取工程部署后在服务器硬盘上的绝对路径
        /**
        * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
        */
        System.out.println("工程部署的路径:"+context.getRealPath("/"));
        System.out.println("工程下web-inf目录的绝对路径是:"+context.getRealPath("/WEB-INF"));

        //4、像 Map 一样存取数据
        //获取servletcontext对象
        ServletContext context1=getServletContext();
        System.out.println(context1);
        System.out.println("保存之前,context1获取key的是:"+context1.getAttribute("key"));

        context1.setAttribute("key","value");

        System.out.println("context1中获取key的值:"+context.getAttribute("key"));

        System.out.println("------------------------------------");
        System.out.println("url="+req.getRequestURI());//获取请求资源路径
        System.out.println("ip地址:"+req.getRemoteHost());//获取其客户端IP
        System.out.println("User-Agent:"+req.getHeader("User-Agent"));//获取请求头
        System.out.println("请求方式:"+req.getMethod());//获取请求方式
        System.out.println("------------------------------------");

        resp.setContentType("text/html;charset=UTF-8");//解决中文乱码
        PrintWriter writer=resp.getWriter();//获取流对象
        writer.write("你好,我是响应之后写入的数据!");//写入数据

    }

    //doPost()在 post 请求的时候调用
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServletText1的post方法");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);//重写一定要调用父类的init(config)操作
        System.out.println("这是重写的init初始化方法");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值