JAVAEE的核心-Servlet


前言

Servlet 是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和 HTTP服务器上的数据库或应用程序之间的中间层。使用 Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。


一、web开发概述

web:在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。

javaweb:使用java技术开发web页面。

Web服务器:接收客户端的请求,给客户端作出响应。学习web开发,需要先安装一台web服务器,将开发好的web项目 部署在web服务器中供外界访问。
web程序: 所有的程序部署在服务器端,通过浏览器远程访问。

服务器: 提供服务,接收请求,响应
广义 软件+硬件
狭义 软件(程序)  放置文件(项目) 供英特网中的其它电脑访问。
服务器<==>web容器<==>中间件(连接用户请求与程序)

在这里插入图片描述


二、web开发环境搭建

在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器: Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范.
在这里插入图片描述
Tomcat服务器由Apache提供,开源免费。由于Sun和其他公司参与到了Tomcat的开发中,所以最新的JSP/Servlet规范总是能在Tomcat中体现出来。

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

下面用一张图展示Tomcat的目录层次结构
在这里插入图片描述
server.xml是Tomcat的配置文件,可以在这里面修改Tomcat的端口号。


三、创建发布web项目

在idea中创建一个基本的java项目
 右键 add webframework  变为web项目
    项目
	   src  java代码
	   web  配置文件  网页代码
 
部署项目
  1.手动部署  自己把项目中的代码粘贴到服务器中,  平时开发不用
  2.自动部署  在idea中集成tomcat

Web项目结构
在这里插入图片描述
在这里插入图片描述


四、Servlet概述

Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序,它运行在web服务器中。web服务器负责Servlet和客户的通信以及调用Servlet方法,Servlet和客户通信采用“请求/响应的模式。

Servlet的作用:
1.接收用户发送的请求
2.调用其他的java程序来处理请求
3.根据处理结果,服务器将响应返回给客户端


五、Servlet创建和使用

如何创建和使用Servlet?
1.创建一个类继承javax.servlet。http包下的HttpServlet。
2.在web.xml文件中配置Servlet。
3.运行Servlet程序。
4.最后,通过浏览器访问配置的url-pattern。

怎么配置url-pattern?

1.用<servlet>元素注册Servlet 
<servlet-name>:设置注册名称
<servlet-class>:servlet完整类名

2.用<servlet-mapping>元素映射一个已经注册的Servlet的对外访问路径
<servlet-name>:servlet注册名称
<url-pattern>:servlet对外访问路径

url-pattern配置模式:
1."/"代表当前web应用的根目录
2.精确匹配 例如:/test
3.匹配任意的url 例如:/
*

 <!--配置servlet,让服务器知道有这么一个类-->
    <servlet>
        <!--设置servlet的注册名字-->
        <servlet-name>demo</servlet-name>
        <!--利用反射机制来创建一个对象,创建对象的方式有new 反序列化 反射-->
       <!-- 设置servlet的完整类名-->
        <servlet-class>com.ffyc.firstweb.servlet.ServletDemo</servlet-class>
        <!--<init-param>
            <param-name>name</param-name>
            <param-value>jim</param-value>
        </init-param>-->
    </servlet>
    <!--为servlet配置一个供前端访问的映射地址-->
    <servlet-mapping>
        <!--设置servlet的注册名字-->
        <servlet-name>demo</servlet-name>
        <!--为servlet指定对外访问路径-->
        <url-pattern>/demourl</url-pattern>
    </servlet-mapping>

web.xml文件为web应用的配置文件,它必须放在web应用 目录WEB-INF目录下。
web.xml文件用于对web应用下的web资源进行配置,服务 器在启动时会读取web.xml文件中的内容


六、Servlet生命周期

Servlet生命周期
在这里插入图片描述
Servlet体系
在这里插入图片描述
重写父类方法
在这里插入图片描述

web项目结构流程
在这里插入图片描述


七、http

7.1http协议

超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本 到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于 定义客户端浏览器和服务器之间交换数据的过程。
● HTTP是一个基于TCP/IP通信协议来传递数据.
● HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统


7.2http请求

7.2.1http请求概述

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送 了一个http请求。 请求包括: 请求行,请求头,请求体

请求行包含 http请求方式,请求资源名称,http版本 (例如post test.jsp HTTP/1.1)
在这里插入图片描述
请求头包含主机地址,以及客户端的一些环境信息,以键值对的形式传递
在这里插入图片描述

请求体代表着浏览器在post请求方式中传递给服务器的参数
请求体中参数以 键值形式传递,多个用&链接,服务器接收到后再解析. username=admin&userpwd=123
在这里插入图片描述

7.2.2两种http请求方式

GET方式:
1.超链接访问,默认是GET方式
2.form提交,不指定method,默认为GET方式

POST方式:
form提交,指定method=“POST”

Get方式与post方式的区别
1.Get方式主要是从服务器获取信息;post主要是想服务器提交信息
2. Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据 放置在请求体中提交。 ● GET方式提交的数据大小受限制一般1kb(不同浏览器也会有不同);而 POST则没有此限制。

7.2.3HttpServletRequest

1.HttpServletRequest是ServletRequest的子接口
2.HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。

在这里插入图片描述

请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest 来表示请求。 HttpServletRequest :封装了请求的信息,可以从中获取任何请求信息

request获取客户机/服务器信息
在这里插入图片描述

request获取请求参数
1.getParameter(name) — String 通过name获得值
2.getParameterValues — String[ ] 通过name获得多值

中文乱码问题,设置编码格式
setCharacterEncoding(编码格式)


7.3http响应

7.3.1http响应概述

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

响应行里包含了http协议版本,以及用于描述服务器对请求的处理结果。
HTTP/1.1 (协议版本) 200(状态吗) OK(状态码描述)

响应头用于描述服务器的基本信息,以及数据描述
Ser ver Apache-Coyote/1.1
Content-Type text /html;char set=UTF-8
Content-Length 0 Date Wed, 13 Sep 2017 02:26:07 GMT
在这里插入图片描述

响应体代表服务器向客户端浏览器回送的正文
在这里插入图片描述

状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302:请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或者服务器资源删除了
500:服务内部错误(代码异常)

7.3.2HttpServletReponse

● HttpServletResponse是ServletResponse的子接口 。
● Web服务器收到客户端的http请求,会针对每一次请求,分别创建 一个代表响应的HttpServletResponse对象。
● HttpServletResponse对象代表响应。

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

●用getWriter()获得一个PrintWriter字符输出流输出数据 response会默认以ISO8859-1将需要输出到浏览器的字符进行解码, 如果输出的字符在ISO8859-1中不存在,就会导致乱码问题。
● response.setContetnType(“text/html;charset=utf-8”)方法,可以同时设定response所使用的字符集编码和浏览器打开所用的字符集编码。

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 接收请求体的信息*/
        /*RequestFacade实现了req接口,tomcat自动把RequestFacade封装到HttpServletRequest中,多态(父类引用指向子类对象),然后调用RequestFacade
        实现的方法(编译看左边,运行看右边)*/
        //req.setCharacterEncoding("utf-8");
        PrintWriter out=null;
        resp.setContentType("text/html; charset=utf-8");
        out=resp.getWriter();
        int result=0;
        try {
            result=new RegisterDao().save(req.getParameter("account"),req.getParameter("password"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        if(result==0){
            out.println(0);
        }else{
            out.println(1);
        }
    }

八、ServletContext

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的 ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此 Servlet对象之间可以通过ServletContext对象来实现数据交互,存储一些全局信息。

常用方法
在这里插入图片描述

    <!--设置ServletContext初始化参数-->
    <context-param>
        <param-name>name</param-name>
        <param-value>jim</param-value>
    </context-param>
    public void init(ServletConfig config) throws ServletException {
       ServletContext context=config.getServletContext();
       System.out.println(context.getInitParameter("name"));
       context.setAttribute("age",12);
    }

九、session

9.1session概述

Session对象是javax.servlet.http.HttpSession的实例
在第一次向servlet中发起请求时, 在服务器端,由服务器创建一个session对象,完成会话期间的管理
会话: 客户端浏览器和服务器交互的整个过程, 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束

Servlet API中,定义了HttpSession接口,用来封装会话对象。
● HttpSession是接口,会话对象是Web容器创建的,在Servlet中使用 HttpServletRequest中的方法获得会话对象。
● public HttpSession getSession():获取跟当前请求相关的 session,如果不存在session,就创建一个新的session对象返回。

使用session实现会话机制的过程
1、当容器创建一个新的HttpSession对象后,即生成一个随机数,称为 会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给 客户端。
2、调用request.getSession方法获得会话对象时,容器先从request 中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象, 返回使用。
3、如果没有获取到JSESSIONID值,认为当前的请求没有相关联的会话 对象,重复步骤1

在这里插入图片描述
在这里插入图片描述

           /*获取跟当前请求相关的 session,如果不存在session,就创建一个新的session对象返回*/
            HttpSession session=req.getSession();
           /*以key/value的形式保存对象值*/
           /* 当session对象长时间不用或者服务器关闭时(也可以调用方法关闭),服务器的session对象自动销毁,user对象也不在存在,*/
            session.setAttribute("user",user);
           /*销毁session对象*/
            session.invalidate();

9.2session对象生命周期

会话对象是容器创建的,并保存在容器中

1.客户端连接后长时间不操作,维护这些会话对象
需要很多资源,服务器会在默认时间后销毁这些对象,多数容器默认30分钟销毁
2.调用HttpSession中的invalidate()方法销毁
3.服务器关闭时销毁

设置会话时间
1.在web.xml中进行配置,修改默认时间
例:修改为50分钟销毁

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

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

将会话的有效时长设置为2小时
session.setMaxInactiveInterval(2
6060)

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


十、过滤器

10.1过滤器概述

过滤器:位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求,在请求到达Servlet/JSP之前,过滤器截获请求。

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

ServletAPI 中,与过滤器有关的API共有三个接口,分别是
● Filter ● FilterChain ● FilterConfig

Filter接口
1. init(FilterConfig filterConfig)方法:对filter对象进行初始化,只调用一次, FilterConfig可以获得filter的初始化参数。
2.doFilter(ServletRequest request, ServletResponse response, FilterChain chain):过滤器必须要实现的方法,对request或者response进行预处理(例如utf-8编码处理)。FilterChain可以把处理后的对象传递给下一个资源。
3.destroy():该方法在容器销毁过滤器对象前被调用

FilterChain接口
1.doFilter(ServletRequest request,ServletResponse response):把处理后的对象传递给下一个资源

FilterConfig接口
作为Filter接口中的init方法的参数使用
1.getInitParameter(String name),该方法用来获得过滤器的初始化参数值。

public class EncodeFilter implements Filter {
    public static String encode;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        encode=filterConfig.getInitParameter("encode");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding(encode);
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

     <!--设置编码格式的过滤器-->
    <filter>
        <filter-name>encode</filter-name>
        <filter-class>com.ffyc.firstweb.filter.EncodeFilter</filter-class>
        <init-param>
            <param-name>encode</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encode</filter-name>
        <url-pattern>/back/*</url-pattern>
    </filter-mapping>
    <!--判断是否登录的过滤器-->
    <filter>
        <filter-name>empty</filter-name>
        <filter-class>com.ffyc.firstweb.filter.IsEmptyFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>empty</filter-name>
        <url-pattern>/back/*</url-pattern>
    </filter-mapping>
    

● 过滤器用来实现通用的功能,减少代码冗余,提高可维护性
● 一个过滤器可以配置给多个资源使用
● 一个资源也可以配置多个过滤器,按照配置顺序调用


十、监听器

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

public class Listen implements ServletContextListener, ServletRequestListener, HttpSessionListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("上下文监听器创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("上下文监听器毁灭");
    }
    
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("请求监听器创建");
    }
    
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("请求监听器毁灭");
    }
    
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("会话监听器创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("会话监听器毁灭");
    }
}

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

  <listener>
        <listener-class>com.ffyc.firstweb.listener.Listen</listener-class>
    </listener>

总结

servlet是业务逻辑层的一个重要内容,起到了连接表现层和数据访问层的关键作用。本章的重点内容是web开发概述以及servlet的相关内容,包括http、servlet的生命周期、session会话对象的生命周期、过滤器。作为java开发人员,必须熟系web开发的流程,学好web开发的基本技术,为以后的框架学习打下坚实的基础。


  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JinziH Never Give Up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值