JavaWeb三大组件

一.Servlet(server applet)
1.概念:运行在服务端的小程序
Servlet就是一个接口,定义了java类被浏览器访问到(webServer识别)的规则
将来我们自定义一个类,实现Servlet接口,复写方法,那么这个类就是Servlet
2.快速入门
创建JavaEE项目
定义一个类,实现Servlet接口
实现接口的抽象方法
配置Servlet
eg
编写一个Servlet类

package cn.itcast.web.servlet;

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

public class ServletDemo1 implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    //提供服务的方法
    @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() {

    }
}

同时在web.xml配置Servlet

<?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_3_1.xsd"
         version="3.1">
    <!--配置Servlet-->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

效果通过浏览器访问/demo1就会输出Hello Servlet

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

4.Servlet中的方法
(1)init方法
初始化方法,在Servlet被创建时(第一次访问到这个Servlet时)执行,只会执行一次
(2)service方法
每次Servlet被访问时执行
(3)destroy方法
在Servlet被杀死时会执行,在服务器正常关闭时,执行,只会执行一次
(4)getServletConfig方法(了解)
获取Servlet的配置对象
(5)getServletInfo方法(了解)
获取Servlet的一些信息,如版本,作者等等

5.Servlet的生命周期
(1)被创建:执行init方法,只执行一次
Servlet什么时候会被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Servlet的创建时机

<servlet>
    <servlet-name>demo2</servlet-name>
    <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
    <!--指定Servlet的创建时机,分
    1.第一次被访问时,创建
        当<load-on-startup></load-on-startup>值为负数是第一次被访问时创建,默认值为-1
    2.在服务器启动时,创建
        <load-on-startup></load-on-startup>值为0或正整数
    -->
    <load-on-startup></load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>demo2</servlet-name>
    <url-pattern>/demo2</url-pattern>
</servlet-mapping>

(2)提供服务:执行service方法,会执行多次
(3)被消耗:执行destroy方法,只执行一次
服务器只有在正常关闭才会执行

6.Servlet是单例的
由于是单例的,多线程访问时存储安全隐患,由于并发访问时多个线程共享Servlet类的成员变量,所以存储数据不要用成员变量,而方法不是共享的,因此可以把数据存在方法的局部变量中

7.Servlet3.0 基于注解开发
好处:
支持注解配置。可以不需要web.xml了
步骤:
(1).创建JavaEE项目,选择Servlet的版本3.0以上
在这里插入图片描述
(2).定义一个类,实现Servlet接口
(3).重写方法
(4).在类上使用@WebServlet注解,进行配置
@WebServlet("/demo2") 注解接收参数是url匹配地址
注解配置详解
一个Servlet对应多个url @WebServlet({"/url1", “/url2”, “url3”})

8.Servlet的体系结构
自己编写Servlet实现类时,每次都要实现Servlet接口的5个方法,而常用的方法只有service方法
因此,想要寻求有没有现成的Servlet实现类

(1)GenericServlet(实现Servlet接口) – 抽象类
将Servlet接口中的其他的方法做了默认空实现,只将service()方法作为抽象

(2)HttpServlet(继承GenericServlet) – 抽象类
里面做了简单的判断,会自动根据前台的提交方法(get or post)进行分发到 doGet,doPost,因此继承HttpServlet之后主要重写前面两种方法

9.HttpServlet中request和response对象讲解
request中封装有请求消息数据,可以通过request对象获取请求消息数据
response 对象是用来设置响应消息数据

request功能分

(1)获取请求消息数据
	1.获取请求行数据
		* 	GET /day14/demo1?name=zhangsan HTTP/1.1
		*  方法:
		 			获取请求方式	String getMethod()  
		 			获取虚拟目录  /day14   String getContextPath()
		 			获取Servlet路径  /demo1  String getServletPath()
		 			获取get方式请求参数 name=zhangsan  String getQueryString()
		 			获取请求URI	/day14/demo1  String getRequestURI()
		 			获取请求URL  http://localhost/day14/demo1  String getRequestURL()
		 			获取协议及版本  HTTP/1.1  String getProtocol()
		 			获取客户机的IP地址	
	2.获取请求头数据
	   * 方法 
	   				通过请求头key获取value String getHeader(String name)
	   				获取所有的请求头名称 getHeaderNames()
	3.获取请求体数据
		*  请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的参数
		*  步骤
			1.获取流对象
				* BufferedReader getReader() 	获取字符输入流,只能操作字符数据
				* ServletInputStream getInputStream()	获取字节输入流,可以操作所有类型数据
			2.再从流对象中拿数据
(2)其他功能
	1.获取请求参数的通用方式
		1. String getParameter(String name) 根据参数名称获取参数值  
			关于post提交中文乱码的问题
			只需在获取参数前加一行 request.setCharacterEncoding("utf-8");
		2. String[] req.getParameterValues(String name) 根据参数名称获取参数值的数组
		3. getParameterNames() 获取所有请求参数key
		4. Map<String, String[]> getParameterMap() 获取请求参数key及value的数组
	2.请求转发:一种在服务器内部的资源跳转方式
		1.步骤:
			1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
			2.使用RequestDispatcher对象来进行转发 :调用 forward(ServletRequest request, ServletResponse response)
	3.共享数据
		* 域对象:一个有作用范围的对象,可以在范围内共享数据
		* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
		* 方法:
				1.setAttribute(String name, Object obj)  存储数据
				2.Object getAttribute(String name) 通过键获取值
				3.removeAttribute(String name) 通过键移除值
	4.获取ServletContext
			getServletContext()

response功能分

(1)设置响应行
	1.格式: HTTP/1.1 200 ok
	2.设置状态码: setStatus(int sc)    参数 状态码
(2)设置响应头
	setHeader(String name, String value)
(3)设置响应体
	* 使用步骤
		1. 获取输出流
			* 获取字符输出流	PrintWriter getWriter()
			* 获取字节输出流	ServletOutputStream getOutputStream()
		2.使用输出流,将数据输出到客户端浏览器
方法
1.重定向方法
sendRedirect(path)
2.设置返回字符的编码
setCharacterEncoding(编码)
3.告诉客户端浏览器该用什么解码
setContentType("text/html;charset=utf-8")

ServletContext对象:

1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.获取:
	1.通过request对象获取
		getServletContext()
	2.通过HttpServlet获取
		this.getServletContext();
3.功能:
	1.获取MIME类型:
		*MIME类型:在互联网通信过程中定义的一种文件数据类型
			* 格式:大类型/小类型 text/html	image/jpeg
		getMineType(fileName)
	2.域对象:共享数据
		1.setAttribute(String name, Object value)
		2.getAttribute(String name)
		3.removeAttribute(String name)
		* ServletContext域对象范围:所有用户所有请求的数据
	3.获取文件的真实(服务器)路径
		方法:String getRealPath(String path)

二.Filter:过滤器
1.概念:
*一般用于完成通用的操作。如 登录验证,编码统一处理,敏感字符过滤
2.快速入门:

	1.步骤:
		1.定义一个类,实现接口Filter
		2.复写
		3.配置拦截路径
			两种配置方法
			1.web.xml 配置
				<filter>
			        <filter-name>demo2</filter-name>
			        <filter-class>cn.itcast.web.filter.FilterDemo2</filter-class>
			    </filter>
			    <filter-mapping>
			        <filter-name>demo2</filter-name>
			        <url-pattern>/*</url-pattern>
			    </filter-mapping>
			2.注解
				@WebFilter("/*") 里面是拦截规则
package cn.itcast.web.filter;

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

@WebFilter("/*")
public class FilterDemo1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter");
        // 放行,如果不放行,那么被访问的资源将无法看见
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

3.执行流程
请求首先到达过滤器的doFilter方法,然后对request增强,然后调用filterChain放行,等Servlet执行完毕后,对response增强

4.过滤器生命周期

1.init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
2.doFilter:每一次请求被拦截资源时,会执行。执行多次
3.destroy:在服务器关闭后,Filter对象会被销毁。如果服务器是正常关闭,则会执行destory方法。只执行一次。用于释放资源

5.拦截配置

  • 拦截路径配置
1.具体资源路径拦截:/index.jsp	只有访问index.jsp资源时,过滤器才会被执行
2.拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
3.后缀名拦截:*.jsp 访问所有后缀名为jsp资源时 过滤器都会被执行
4.拦截所有资源:/* 访问所有资源时过滤器会被执行
  • 拦截方式配置
* 注解配置
	1.REQUEST:默认值。浏览器直接请求资源
	2.FORWARD:转发访问资源
	3.INCLUDE:包含访问资源
	4.ERROR:错误跳转资源
	5.ASYNC:异步访问资源
* web.xml配置
	设置<dispatcher></dispatcher>标签即可

6.过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器:过滤器1和过滤器2

1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2 
5.过滤器1

过滤器先后顺序问题:

1.注解配置:按照类名的字符串比较规则比较,值小的先执行
2.web.xml配置:谁定义在上边谁先执行

三.Listener:监听器
1.概念

* 事件监听机制
	* 事件	:一件事情
	* 事件源	:事件发生的地方
	* 监听器	:一个对象
	* 注册监听	:将事件,事件源,监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码

2.ServletContextListener:
监听ServletContext对象的创建和销毁
包含两个方法
contextDestroyed(ServletContextEvent sce) : ServletContext对象被销毁之前会调用该方法
contextInitialized(ServletContextEvent sce) : ServletContext对象创建后会调用该方法
使用步骤

1.定义一个类,实现ServletContextListener接口
2.复写方法
3.配置
	1.web.xml
	2.注解
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页