Servlet

学习目标:

掌握Servlet

学习内容:

1、 web服务器 2、 Tomcat 3、 Servlet 4、 HTTP请求 5、 两种HTTP请求方式 6、 HTTP响应 7、 ServletContext 8、 session 9、 过滤器 10、 监听器

学习时间:

1、 2021年9月20日 2、 2021年9月22日 3、 2021年9月24日 4、 2021年9月26日 5、 2021年10月3日

学习产出:

1、 技术笔记 1 遍 2、 宿舍管理项目

web开发概述

学习web开发,需要先安装一台web服务器,将开发好的web项目部署在web服务器中供外界访问

web服务器

web服务器是指驻留于因特网上某种类型计算机的程序

可以向浏览器等web客户端提供文档,也可以放置网站文件,它是一个容器,是一个连接用户与程序之间的中间件。

WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、

WebLogic、Jboss等。

流程

浏览器访问服务器,服务器接收请求(提交表单),给web程序作出响应

通过web程序与数据库进行交互,然后再由服务器响应最后结果

服务器起到一个中间件的作用

web开发流程

服务器搭建 tomcat

​ 1.官网下载 ,解压
​ 2.配置JAVA_HOME环境变量 D:\ProgramFiles\Java\jdk1.8.0_261
​ TOMCAT根据java_home去查找jdk安装位置
​ 3.在tomcat的bin目录 双击运行 startup.bat命令 启动tomcat

​ bin 放着各种命令 startup.bat命令 shutdown.bat

​ conf 放着配置文件 列如server.xml 修改端口号
​ lib tomcat运行所需要的jar包
​ logs 运行产生的日志文件
​ temp 临时缓存文件

​ webapps 部署web程序的目录
​ work 工作目录

​ 4.访问 IP+端口

Tomcat目录

Tomcat目录层次

创建发布web项目

在idea中创建一个基本的java项目
右键 add webframework 变为web项目
项目
src java代码
web 配置文件 网页代码

部署项目
1.手动部署 自己把项目中的代码粘贴到服务器中, 平时开发不用
2.自动部署 在idea中集成tomcat

web项目结构

web项目结构

Servlet

Servlet概述

Server Applet的简称 用Java编写的服务器端的程序

它运行在web服务器中,web服务器负责Servlet和客户的通信以及调 用Servlet方法,Servlet和客户通信采用“请求/响应”的模式

Servlet的作用:

​ 1.接收用户发送的请求

​ 2.调用其他的java程序来处理请求

​ 3.根据处理结果,服务器将响应返回给客户端

Servlet的创建和使用

1.创建一个类继承javax.servlet.http包下的HttpServlet

2.在web.xml文件中配置Servlet

3.运行Servlet程序

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用< servlet>元素和<servlet-mapping>元素完成。

Servlet创建和使用-Servlet配置

< servlet>元素用于注册Servlet,它包含有两个主要的子元素: <servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和 Servlet的完整类名。

< servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路 径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。

url-pattern配置模式:”/”代表当前web应用的根目录

	<!--
      xml  属于标记语言    html是标记内容指导内容如何显示
           xml可扩展标记语言 用来保存数据  保存配置文件数据
      web.xml  须放在web应用 目录WEB-INF目录下 是web程序的配置文件,保存各种配置信息,在服务器启动时,由服务器读取
    -->

    <!--配置servlet 把servlet配置进来,服务器就知道有这么一个类 -->
     <servlet>
         <servlet-name>demo</servlet-name><!--为servlet对象定义一个名称-->
         <!--配置类的地址 ,让服务器使用反射机制创建对象 -->
         <servlet-class>com.ffyc.firstweb.servlet.DemoServlet</servlet-class>
         <!--配置的参数-->
         <init-param>
             <param-name>name</param-name>
             <param-value>jim</param-value>
         </init-param>
         <!--配置servlet何时被加载创建  默认是第一次访问, 值>=0服务器启动就可以创建-->
         <load-on-startup>0</load-on-startup>
     </servlet>

    <!--为servlet配置一个供前端访问的映射地址-->
    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demourl</url-pattern><!--地址以/开头  /表示项目的根目录 http://localhost:8888/firstweb-->
    </servlet-mapping>

Servlet 生命周期

Servlet 生命周期

public class DemoServlet  extends HttpServlet {

     /*
      构造方法  初始化对象
      只被执行了一次,只创建了一个对象, 此对象由服务器创建的,
      默认是在客户端第一次访问该servlet时创建 servlet对象
      当 <load-on-startup>0</load-on-startup> 值>=0 时,会在服务器启动时创建
      */
     public DemoServlet(){
         System.out.println("DemoServlet");
     }

     /*
       初始化,当servlet对象创建后,服务器会自动调用init(),
       完成一些初始化操作.
       如果我们没有需要初始化的操作,也可以不重写init(),但是服务器依然会调用,会调用父类的init()
      */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init");
        System.out.println(config.getInitParameter("name"));//获得配置文件中的信息
        System.out.println( config.getServletName());
    }

    /*
       为请求提供服务,每一次http请求,都会调用service(请求,响应)
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }

    /*
     当servlet对象销毁时,服务器会调用destroy(),
     让我完成一些最终的操作(例如保存日志....)
     如果我们没有一些最终的操作,也可以不重写destroy(),但是服务器依然会调用父类中destroy()
     */
    /*@Override
    public void destroy() {
        System.out.println("destroy");
    }*/


}

HTTP协议

超文本传输协议(HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程

基于TCP/IP通信协议传递数据

HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布 式超媒体信息系统

客户端向服务器发送请求,服务器给客户端一个响应

HTTP请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求

​ 请求包括请求行,请求头,请求体

请求行

包含HTTP请求方式,请求资源名称,HTTP版本(例如post test.jsp HTTP/1.1)

请求头

包含主机地址,以及客户端的一些环境信息,以键值对的形式传递

Host: 127.0.0.1:8088 请求的主机地址

**Accept:**text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 浏览器能够处理的内容类型

Accept-Encoding: gzip, deflate, br 浏览器能够处理的压缩编码

Accept-Language: zh-CN,zh;q=0.9 浏览器当前设置的语言

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 使用的浏览器和操作平台信息

Connection: keep-alive 浏览器与服务器之间连接的类型

请求体

请求体代表着浏览器在post请求方式中传递给服务器的参数,请求体以键值的形式传递

多个用&链接,服务器接收到后再进行解析

例:username=admin&userpwd=123

两种HTTP请求方式

GET方式

超链接访问,默认是GET方式

form提交,不指定method,默认为GET方式

POST方式

form提交,指定method=“POST”

区别

GET方式主要是从服务器中获取信息;POST主要是想服务器提交信息

GET方式在通过URL提交数据,数据在URL中可以看到(不安全);POST方式,数据放置在请求体中提交(安全)。

GET方式提交的数据大小受限制一般在1kb(不同浏览器也会有不同);而POST则没有此限制

HttpServletRequest

HttpServletRequest是ServletRequest的子接口

HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。

请求和响应是Web交互最基本的模式,在Servlet中,用HTTPServletRequest来表示请求。

HTTPServletRequest:封装了请求信息,可以从中获取任何请求信息

获取客户机/服务器信息

getMethod()得到客户机请求方式

getScheme()请求协议

getRemoteAddr()返回发出请求的客户机的IP地址

getServerName()服务器名(ip或域名)

getServerPort()服务器端口

		//请求行数据
        System.out.println(req.getMethod());
        System.out.println(req.getProtocol());
        System.out.println(req.getServerName());
        System.out.println(req.getServerPort());

        //请求头
        System.out.println(req.getRemoteAddr());//获得客户端的ip
        System.out.println(req.getRemotePort());//客户端端口
        System.out.println(req.getHeader("User-Agent"));
        //接收用户请求的数据  tomcat8.0以后get请求数据的解码方式支持中文
        String name =   req.getParameter("name");

request获取请求参数

getParameter(name) — String 通过name获得值

getParameterValues — String[ ] 通过name获得多值

理中文乱码

​ post

​ setCharacterEncoding(编码格式)

req.setCharacterEncoding("utf-8");//设置post请求数据解码格式

        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("passoword"));
        System.out.println(req.getParameter("sex"));
        String[] courses = req.getParameterValues("course");//获取复选框中的内容,返回的是一个数组
        System.out.println(Arrays.toString(courses));

HTTP响应

一个HTTP响应代表服务器向客户端回送的数据,它包括:响应行,响应头,响应体。

响应行

包含了HTTP协议版本,以及用于描述服务器对请求的处理结果

HTTP/1.1(协议版本) 200(状态码) OK(状态码描述)

​ 状态码:服务器和浏览器用于确定状态的固定数字号码

​ 200:请求成功

​ 302:请求重定向

​ 400:语义有误,当前请求无法被服务器理解或请求参数有误

​ 404:请求资源不存在,通常是路径写错了或者服务器资源删除了

​ 500:服务器内部错误(代码异常)

响应头

响应头用于描述服务器的基本信息,以及数据描述

Server Apache-Coyote/1.1

Content-Type text /html;char set=UTF-8

Content-Length 0

Date Wed, 13 Sep 2017 02:26:07 GMT

响应体

代表服务器向客户端浏览器回送的正文

HttpServletReponse

HttpServletResponse是ServletResponse的子接口 。

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个代表响应的HTTPServletResponse对象

HTTPServletResponse对象代表响应

向浏览器动态生成网页内容

用getWriter()获得一个PrintWriter字符输出流输出数据

response会默认以ISO8859-1将需要输出到浏览器的字符进行解码(如果不存在会乱码)

response.setContetnType(“text/html;charset=utf-8”);方法可以同时设定response所使用的字符集编码和浏览器打开所用的字符集编码

 PrintWriter out = null;
        try {
            resp.setContentType("text/html;charset=utf-8");//设置响应内容的编码格式
           out = resp.getWriter();
           out.println("<h1>登录成功</h1>");

        }catch (Exception e){
            out.println("<h1>服务器忙,请稍后再试!</h1>");
        }

ServletContext

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的 ServletContext对象

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此 Servlet对象之间可以通过ServletContext对象来实现数据交互,存储一些全局信息

常用方法:

​ getInitParameter(“name”)获得当前应用的初始化参数

​ setAttribute(“attrname”,value) 设置Ser vletContext属性并赋值

​ getAttribute(“attrname”) 获得Ser vletContext属性指定值

​ removeAttribute(“attrname”) 删除Ser vletContext指定属性

​ getRealPath(filename)获得文件的绝对路径

​ getContextPath()获得当前应用的根目录

 <!--为整个web程序配置初始参数-->
    <context-param>
        <param-name>name</param-name>
        <param-value>jim</param-value>
    </context-param>
		 ServletContext servletContext = req.getServletContext();
        System.out.println(servletContext);
        System.out.println(servletContext.getInitParameter("name"));
        servletContext.setAttribute("a","aaa");
		System.out.println(servletContext.getAttribute("a"));

session

Servlet API中,定义了HttpSession接口,用来封装会话对象。

在第一次向servlet中发起请求时, 在服务器端,由服务器创建一个session对象,完成会话期间的管理

过程

使用session实现会话机制的过程

1、当容器创建一个新的HttpSession对象后,即生成一个随机数,称为 会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端。

2、调用request.getSession方法获得会话对象时,容器先从request

中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象,

返回使用。

3、如果没有获取到JSESSIONID值,认为当前的请求没有相关联的会话 对象,重复步骤1

方法

session方法

	//获取session对象
            HttpSession session = req.getSession();
    //向session对象中设置一组键值,登录成功后将用户信息存储到一个对象的session对象中
            session.setAttribute("user",user);

	//在退出时销毁session对象,安全退出
	 HttpSession session = req.getSession();
        session.invalidate();//销毁浏览器

	User user = (User)req.getSession().getAttribute("user");

session生命周期

对象创建后保存在容器中,如果客户端连接到服务器后,不进行任何窗口,那么容器维护这些会话对象将占用很多资源。因此,容器都会在默认时间内销毁会话对象,多数容器默认30分钟销毁会话对象。

除了有效时间使会话对象失效外,还可以调用HttpSession中的invalidate方法,使会话失效,立即销毁会话对象

设置会话时间

可以在web.xml中进行配置,修改默认时间。例如,修改为10分钟销毁

<session-config>
	<session-timeout>50</session-timeout> 
</session-config>

可以使用HttpSession接口中的setMaxIntervalTime设置,以秒为单位,如果参数是负数,表示永远不失效。

例如:将会话的有效时长设置为2小时。

session.setMaxInactiveInterval(2*60*60);

session由谁创建?保存在哪?

有若干客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象。

过滤器

概念

过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求

在请求到达Servlet/JSP之前,过滤器截获请求

作用:在客户端的请求访问后端资源之前,拦截这些请求

相关API

Servlet API中,与过滤器有关的API共有三个接口,分别是

​ Filter、FilterChain、FilterConfig

Filter接口

Filter接口是过滤器类必须实现的接口,该接口中有三个方法。

1、init(FilterConfig filterConfig):该方法是对filter对象进行初始化

的方法,仅在容器初始化filter对象结束后被调用一次。参数

FilterConfig可以获得filter的初始化参数。

2、 doFilter(ServletRequest request, ServletResponse response,

FilterChain chain):该方法是filter进行过滤操作的方法,是最重

要的方法。过滤器实现类必须实现该方法。方法体中可以对request

和response进行预处理。其中FilterChain可以将处理后的request

和response对象传递到过滤链上的下一个资源。

3、destroy():该方法在容器销毁过滤器对象前被调用。

FilterChain接口

doFilter(ServletRequest request,ServletResponse response)

该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能 是下一个过滤器,也可能是目标资源。

FilterConfig接口

该接口类型作为Filter接口中的init方法的参数使用,FilterConfig接口

中有一个常用方法

getInitParameter(String name),该方法用来获得过滤器的初始

化参数值。在web.xml中,可以为每一个filter配置需要的初始化参

数,与Servlet的< init-param>类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取

<!--配置编码过滤器-->
    <filter>
        <filter-name>encod</filter-name>
        <filter-class>com.ffyc.practice.filter.EncodFilter</filter-class>
        <init-param>
            <param-name>code</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encod</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

String code;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
        //设置编 码格式
        servletRequest.setCharacterEncoding(code);
        //让请求继续向下执行,下一个可能是目标servlet,也可能是下一个过滤
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init");
        code = filterConfig.getInitParameter("code");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }

总结

过滤器用来实现通用的功能,减少代码冗余,提高可维护性

一个过滤器可以配置给多个资源使用

一个资源也可以配置多个过滤器,按照配置顺序调用

监听器

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听

ServletContext、HttpSession和ServletRequest等域对象的创建与

销毁事件,以及监听这些域对象中属性发生修改的事件。

监听器分类

按监听对象分类:

1、用于监听应用程序对象(Ser vletContext)

2、用于监听用户会话对象(HttpSeesion)

3、用于监听请求消息对象(Ser vletRequest)

按监听事件分类:

1、监听对象的创建和销毁的事件监听器。

2、监听对象属性变更(添加,修改,移除)的监听器

监听器接口

Servlet API中定义了监听器接口,用来监听不同的事件类型

● Ser vletContextListener:上下文监听器。

● Ser vletContextAttributeListener:上下文属性监听器。

● Ser vletRequestListener:请求监听器。

● Ser vletRequestAttributeListener:请求属性监听器。

● HttpSessionListener:会话监听器。

● HttpSessionAttributeListener:会话属性监听器。

创建监听器类

创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。

< listener>

​ <listener-class> 监听器类全类名 </listener-class>

< /listener>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值