JAVA学习笔记18——Tomcat,Servlet

Tomcat

web服务器软件

1. 基本操作

1.1 配置

部署项目方式:
1.直接将项目放到webapps目录下即可
简化部署:将项目打成一个war包,再将war包放置到webapps下
2.配置conf/server.xml文件
在Host标签体中配置
< Context doBase=“项目存放路径” path=“虚拟目录”/ >
3.在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
< Context doBase=“项目存放路径” >
虚拟目录即使xml文件的文件名

静态项目和动态项目:
Java动态项目的目录结构:
项目根目录->
WEB-INF目录->
web.xml:web项目核心配置文件
classes目录:放置字节码文件的目录
lib目录:放置依赖jar包

Tomcat集成到IDEA:

Servlet

1. 基本概念

Server Applet,运行在服务器端的小程序,本质上Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则

2. 快速入门

在web.xml中配置Servlet

    <!--配置Servlet-->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>demo01.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

使用注解进行配置:
@WebServlet("/demo")

实现Servlet接口

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
    
        System.out.println("Hello World");
    }

3. Servlet执行原理

1.当服务器接收到客户端浏览器的请求后,会解析请求url路径,获取访问Servlet的资源路径
2.查找web.xml文件,是否有对应的< url-pattern >标签体内容
3.如果有,则在找对应的< servlet-class >全类名
4.Tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法

4. Servlet生命周期

4.1 创建

默认情况下,第一次被访问时Servlet被创建
public void init(ServletConfig servletConfig) :初始化方法。在Servlet被创建时执行,只会执行一次
第一次被访问时创建:< load-on-startup >值为负数
服务器启动时创建:< load-on-startup >值为0或者负数

4.2 服务

每次访问Servlet方法都会被调用一次
public void service(ServletRequest servletRequest, ServletResponse servletResponse):提供服务方法,每一次Servlet被访问时执行,执行多次

4.3 销毁

Servlet被销毁时执行。服务器关闭时,Servlet被销毁。只有服务器正常关闭才会执行destroy方法。destroy方法在Servlet被销毁之前执行,一般用于释放资源
public void destroy():销毁方法,在服务器被正常关闭时执行一次

4.4 其他

public ServletConfig getServletConfig():获取ServletConfig对象
public String getServletInfo():获取Servlet的信息,版本,作者等

5. 体系结构

5.1 接口

Servlet–接口
GenericServlet–抽象类
将Servlet接口中其他方法做了空实现,只将service()作为抽象
将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

@WebServlet("/demo2")
public class ServletDemo02 extends GenericServlet {
    
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
    
        System.out.println("demo2");
    }
}

HttpServlet–抽象类
推荐使用
对http协议的封装,简化操作
1.定义类继承HttpServlet
2.复写doGet/doPost

@WebServlet("/demo3")
public class ServletDemo03 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("doPost");
    }
}

HTTP

1. 基本概念

Hyper Text Transfer Protocol超文本传输协议
传输协议:定义了客户端和服务器端通信时传输模式
特点:
1.基于TCP/IP的高级协议
2.默认端口号80
3.基于请求/响应模型:一次请求对应一次响应
4.无状态的:每次请求之间相互独立,不能交互数据

2. 数据格式

2.1 请求消息数据格式

请求行
请求方式 请求url 请求协议/版本
Get
1.请求参数在请求行中,在url后
2.请求的url长度有限制
3.不太安全
Post
1.请求方式在请求体中
2.请求的url长度没有限制
3.相对安全
请求头
请求头名称:请求头值
请求空行
作为分隔作用
请求体
请求参数

3. Request

3.1 Request与Response原理

1.Tomcat服务器会根据请求yrl中的资源路径,创建对应的ServletDemo对象
2.Tomcat服务器会创建Request与Response对象,Request对象中封装请求和消息数据
3.Tomcat将Request和Response两个对象传递给Service方法并且调用
4.程序员可以通过Request对象获取请求消息数据,通过Response对象设置响应消息数据

3.2 获取请求消息

3.2.1 获取请求行数据

获取请求方式:String getMethod()
获取虚拟目录:String getContextPath()
获取Servlet路径:getServletPath()
获取get方式请求参数:String getQueryString()
获取请求uri:String getRequestURI()
获取协议与版本:String getProtocol()
获取客户机IP地址:String getRemoteAddr()

3.2.2 获取请求头数据

String getHeader(String name):根据请求头的名称获取请求头的值
Enumeration< String > getHeaderNames():获取所有的请求头名称

3.2.3 获取请求体数据

获取流对象,从流对象中获取数据

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取请求消息体
        //获取字符流
        BufferedReader br = request.getReader();
        //读取数据
        String line=null;
        while ((line=br.readLine())!=null){
    
    
            System.out.println(line);
        }
    }

3.3 其他功能

3.3.1 获取请求参数通用方式

String getParameter(String name):根据参数名称获取参数值
String[] getParameter(String name):根据参数名称获取参数值的数组
Enumeration< String > getParameterNames():获取所有请求的参数名称
Map< String,String[] > getParameterMap():获取所有参数的Map集合

3.3.2 请求转发

一种在服务器内部的资源跳转方式
步骤:
1.通过Request对象获取请求转发器对象
2.使用对象进行转发

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("Hello Servlet demo2");
        //转发到RequestDemo3
        request.getRequestDispatcher("/requestDemo3").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

特点:
1.浏览器地址栏路径不会发生变化
2.只能转发到当前服务器内部资源中
3.转发是一次请求

3.3.3 数据共享

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:一次请求的范围,一般用于请求转发的多个资源中共享数据
setAttribute(String name,Object obj):存储数据
getAttribute(String name):通过键获取值
removeAttribute(String name):通过键移除键值对

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("Hello Servlet demo2");
        //存储数据到request域中
        request.setAttribute("msg","hello");
        //转发到RequestDemo3
        request.getRequestDispatcher("/requestDemo3").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取数据
        Object msg = request.getAttribute("msg");
        System.out.println(msg);
        System.out.println("Hello Servlet demo3");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

3.3.4 获取ServletContext

getServleContext()

4. Response

4.1 响应消息数据格式

1.响应行
组成:协议/版本 响应码状态 状态吗描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
2.响应头
3.响应空行
4.响应体

4.2 功能

4.2.1 设置响应行

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

4.2.2 设置响应头

setHeader(String name,String value)

//完成重定向
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("demo1");
/*        //访问这个资源会自动跳转到Demo2
        //设置状态吗为302
        response.setStatus(302);
        //设置响应头为location
        response.setHeader("location","/Day20/responseDemo2");*/
        response.sendRedirect("/Day20/responseDemo2");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

重定向特点:
1.地址栏发生变化
2.重定向可以访问其他站点的资源
3.重定向是两次请求。不能使用request对象共享数据

转发的特点:
1.转发栏路径不变
2.转发只能访问当前服务器下的资源
3.转发是一次请求。可以使用request对象来共享数据

动态获取虚拟目录:
request.contextPath()
设置编码:
response.setContentType(“text/html;charset=utf-8”)

4.2.3 设置响应体

使用步骤:
1.获取输出流
2.使用输出流,将数据输出到浏览器

5. ServeletContext

5.1 基本概念

代表整个web应用,可以和程序的容器进行通信

5.2 获取对象

通过request获取:getServletContext();
通过HttpServlet获取:getServletContext();

5.3 功能

1.获取MIME类型
String getMimeType(String file)
2.域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
3.获取文件真实路径
getRealPath(String name)

猜你喜欢

转载自blog.csdn.net/qq_44708714/article/details/107434728