JavaEE三层架构

在这里插入图片描述


新建Web:

配置Tomcat服务器:

在这里插入图片描述

新建Web工程:

  • src:存放编写的java代码。
  • web:存放web工程的资源文件,比如html页面、css文件、js文件等。
  • WEB-INF:该目录受服务器保护,浏览器无法直接访问该目录。
  • web.xml:整个动态web工程的配置部署描述文件,可以在这里配置很多web工程的组件,比如Servlet、Filter、Listener…
  • lib:第三方jar包。

在这里插入图片描述


Servlet

  • Servlet 是 JavaEE 规范之一。规范就是接口
  • Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
  • Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端

通过实现Servlet接口实现 Servlet 程序

  • 编写一个类去实现 Servlet 接口
  • 实现 service 方法,处理请求,并响应数据
  • 到web.xml 中去配置 servlet 程序的访问地址
package com.xingyu.Servlet;

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //Service方法用于处理请求和响应
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello Servlet");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

<?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标签Servlet程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>

        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>com.xingyu.Servlet.HelloServlet</servlet-class>
    </servlet>

    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>

        <!--url-pattern标签配置访问地址,
         /:斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
         /hello :表示地址为:http://ip:port/工程路径/hello-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

Servlet 的生命周期

1、执行 Servlet 构造器方法

2、执行 init 初始化方法

  • 第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。

3、执行 service 方法

  • 第三步,每次访问都会调用。

4、执行 destroy 销毁方法

  • 第四步,在web 工程停止的时候调用。

GET 和 POST 请求的分发处理

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("3 service === Hello Servlet 被访问了");
    // 类型转换(因为它有getMethod()方法)
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    // 获取请求的方式
    String method = httpServletRequest.getMethod();
    if ("GET".equals(method)) {
        doGet();
    } else if ("POST".equals(method)) {
        doPost();
    }
}

public void doGet(){
    System.out.println("get 请求");
}

public void doPost(){
    System.out.println("post 请求");
}

通过继承HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

  • 编写一个类去继承 HttpServlet 类
  • 根据业务需要重写 doGet 或 doPost 方法
  • 到web.xml 中的配置 Servlet 程序的访问地址
public class HelloServlet2 extends HttpServlet {
    // doGet()在get请求的时候调用 * 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
                                            throws ServletException, IOException { 
        System.out.println("HelloServlet2 的 doGet 方法");
    } 
    
    // doPost()在post请求的时候调用 * 
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
                                            throws ServletException, IOException { 
        System.out.println("HelloServlet2 的 doPost 方法");
    }
}

同时不要忘记在web.xml中配置:

<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.xingyu.Servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

Servlet 类的继承体系

自定义的Servlet程序 ———— HttpServlet类 ———— GenericServlet类 ———— Servlet接口

其中:

  • Servlet接口负责定义Servlet程序的访问规范
  • GenericServlet类实现Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用及对ServletConfig类的使用方法
  • HttpServlet抽取类实现了Service方法,并实现了请求的分发处理(GET/POST)
  • 自定义的Servlet程序中,我们只需要根据需求去重写doGet()方法和doPost()方法即可

ServletConfig 类

ServletConfig 是 Servlet 程序的配置信息类。

Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。 Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。

ServletConfig 类的三大作用

  • 可以获取 Servlet 程序的别名 servlet-name 的值
  • 获取初始化参数 init-param
  • 获取 ServletContext 对象
<init-param> 
    <!--参数名--> 
    <param-name>username</param-name> 
    <!--参数值--> 
    <param-value>root</param-value>
</init-param> 
<!--init-param是初始化参数--> 
<init-param> 
    <!--参数名--> 
    <param-name>url</param-name> 
    <!--参数值--> 
    <param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>

对应地,Servlet中init()初始化方法可以获取其信息:

@Override 
public void init(ServletConfig servletConfig) throws ServletException { 
    //获取Servlet程序的别名servlet-name的值
	System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName()); 
    //获取初始化参数init-param
	System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username")); 	System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url")); 
    //获取ServletContext对象
	System.out.println(servletConfig.getServletContext());
}

ServletContext 类

  • ServletContext 是一个接口,它表示 Servlet 上下文对象
  • 一个 web 工程,只有一个 ServletContext 对象实例
  • ServletContext 对象是一个域对象
  • ServletContext 是在 web 工程部署启动的时候创建,在 web 工程停止的时候销毁

域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,整个web 工程。

存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

ServletContext 类的四个作用

  • 获取web.xml 中配置的上下文参数 context-param
  • 获取当前的工程路径,格式: /工程路径
  • 获取工程部署后在服务器硬盘上的绝对路径
  • 像 Map 一样存取数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    									throws ServletException, IOException {
    //获取web.xml中配置的上下文参数context-param
    ServletContext context = getServletConfig().getServletContext();
    String username = context.getInitParameter("username");
    String password = context.getInitParameter("password"));

    //获取当前的工程路径,格式: /工程路径
    String path = context.getContextPath();
        
    //获取工程部署后,在服务器硬盘上的绝对路径
    //斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录
    String realPath = context.getRealPath("/");
    String cssPath = context.getRealPath("/css");
    String imgPath = context.getRealPath("/imgs/1.jpg"));
}

web.xml中:

<!--context-param是上下文参数(它属于整个web工程)--> 
<context-param> 
    <param-name>username</param-name> 
    <param-value>context</param-value>
</context-param> 
<!--context-param是上下文参数(它属于整个web工程)-->
<context-param> 
    <param-name>password</param-name> 
    <param-value>root</param-value>
</context-param>

像Map一样操作数据:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
													ServletException, IOException {
	ServletContext context = getServletContext(); 
	System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));//null
	context.setAttribute("key1", "value1"); 
	System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));//value1
}

HTTP

HTTP 协议指客户端和服务器之间通信时,发送的数据,需要遵守的规则。 HTTP 协议中的数据又叫报文。

客户端给服务器发送数据叫请求。 服务器给客户端回传数据叫响应。

GET请求:

在这里插入图片描述

GET 请求有哪些:

  • form标签 method=get
  • a 标签
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车

POST请求:

在这里插入图片描述

POST 请求有哪些:

  • form标签 method=post

HTTP响应:

在这里插入图片描述

响应码:

  • 200:表示请求成功
  • 302:表示请求重定向
  • 404:表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
  • 500:表示服务器已经收到请求,但是服务器内部错误(代码错误)

MIME

MIME 是 HTTP 协议中数据类型。 MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。


HttpServletRequest 类

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

方法描述
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的 ip 地址
getHeader()获取请求头
getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)
getMethod()获取请求的方式 GET 或 POST
getRequestDispatcher()获取请求转发对象
setAttribute(key, value)获取域数据
getAttribute(key)设置域数据
<form action="http://localhost:8080/day14Web/hello2" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">Java
    <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                                        throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");//解决乱码
    System.out.println("用户名"+req.getParameter("username"));
    System.out.println("请求方法"+req.getMethod());
    System.out.println("爱好"+ Arrays.toString(req.getParameterValues("hobby")));
}

请求转发

请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。(注意请求转发和请求重定向的区别)

  • 浏览器地址没有变化
  • 一次请求
  • 共享Request域下的数据
  • 可以转发到WEB-INF目录下
  • 不可以访问工程以外的资源

在这里插入图片描述

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    							throws ServletException,IOException {
	// 获取请求的参数(办事的材料)查看 
    String username = req.getParameter("username"); 
    System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
	// 给材料盖一个章,并传递到Servlet2(柜台2)去查看 
    req.setAttribute("key1","柜台 1 的章");
	// 问路:Servlet2(柜台2)怎么走(请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录)
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2"); 
    //RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
	// 走向Sevlet2(柜台2) 
    requestDispatcher.forward(req,resp);
}

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说:我给你一些地址。你去新地址访问。叫请求
重定向(因为之前的地址可能已经被废弃)。(注意请求转发和请求重定向的区别)

  • 浏览器地址栏会发生变化
  • 两次请求
  • 不共享Request域中的数据
  • 不能访问WEB-INF下的资源
  • 可以访问工程外的资源
resp.sendRedirect("http://localhost:8080");

相对路径与绝对路径

在 javaWeb 中,路径分为相对路径和绝对路径两种。

  • 绝对路径: http://ip:port/工程路径/资源路径
  • 相对路径:. 表示当前目录; …表示上级目录; 资源名:表示当前目录/资源名

在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。

在web 中 / 斜杠 是一种绝对路径。

  • / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
  • / 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
  • 特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

客户端回传数据

public class ResponseIOServlet extends HttpServlet { 
	@Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        								throws ServletException,IOException { 
        resp.setContentType("text/html; charset=UTF-8");//解决相应乱码
    	//要求:往客户端回传字符串数据。
    	PrintWriter writer = resp.getWriter();
    	writer.write("response's content!!!");
	} 
} 


欢迎页和错误页

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
    <error-code>404</error-code>
    <location>/pages/error/error404.jsp</location>
</error-page>
<error-page>
    <error-code>505</error-code>
    <location>/pages/error/error500.jsp</location>
</error-page>

注意:1.根目录映射在IDEA代码中是web目录;2.在异常处理处一定要把异常抛出去(抛给tomcat服务器)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐