JAVAEE的核心-Servlet

文章目录

  • 前言
  • 一、web开发概述
  • 二、web开发环境搭建
  • 三、创建发布web项目
  • 四、Servlet概述
  • 五、Servlet创建和使用
  • 六、Servlet生命周期
  • 七、http
    • 7.1http协议
    • 7.2http请求
      • 7.2.1http请求概述
      • 7.2.2两种http请求方式
      • 7.2.3HttpServletRequest
    • 7.3http响应
      • 7.3.1http响应概述
      • 7.3.2HttpServletReponse
      • 7.3.3向浏览器动态生成网页内容
  • 八、ServletContext
  • 九、session
    • 9.1session概述
    • 9.2session对象生命周期
  • 十、过滤器
    • 10.1过滤器概述
  • 十、监听器
  • 总结


前言

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


一、web开发概述

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

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

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

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

JAVAEE的核心-Servlet_第1张图片


二、web开发环境搭建

在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器: Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范.
JAVAEE的核心-Servlet_第2张图片
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的目录层次结构
JAVAEE的核心-Servlet_第3张图片
server.xml是Tomcat的配置文件,可以在这里面修改Tomcat的端口号。


三、创建发布web项目

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

Web项目结构
JAVAEE的核心-Servlet_第4张图片
JAVAEE的核心-Servlet_第5张图片


四、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-name>demoservlet-name>
        
       
        <servlet-class>com.ffyc.firstweb.servlet.ServletDemoservlet-class>
        
    servlet>
    
    <servlet-mapping>
        
        <servlet-name>demoservlet-name>
        
        <url-pattern>/demourlurl-pattern>
    servlet-mapping>

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


六、Servlet生命周期

Servlet生命周期
JAVAEE的核心-Servlet_第6张图片
Servlet体系
JAVAEE的核心-Servlet_第7张图片
重写父类方法
JAVAEE的核心-Servlet_第8张图片

web项目结构流程
JAVAEE的核心-Servlet_第9张图片


七、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)
在这里插入图片描述
请求头包含主机地址,以及客户端的一些环境信息,以键值对的形式传递
JAVAEE的核心-Servlet_第10张图片

请求体代表着浏览器在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协议的方法。

JAVAEE的核心-Servlet_第11张图片

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

request获取客户机/服务器信息
JAVAEE的核心-Servlet_第12张图片

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
JAVAEE的核心-Servlet_第13张图片

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

状态码:服务器和浏览器用于确定状态的固定数字号码
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对象来实现数据交互,存储一些全局信息。

常用方法
JAVAEE的核心-Servlet_第14张图片

    
    <context-param>
        <param-name>nameparam-name>
        <param-value>jimparam-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

JAVAEE的核心-Servlet_第15张图片
JAVAEE的核心-Servlet_第16张图片

           /*获取跟当前请求相关的 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>50session-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>encodefilter-name>
        <filter-class>com.ffyc.firstweb.filter.EncodeFilterfilter-class>
        <init-param>
            <param-name>encodeparam-name>
            <param-value>utf-8param-value>
        init-param>
    filter>

    <filter-mapping>
        <filter-name>encodefilter-name>
        <url-pattern>/back/*url-pattern>
    filter-mapping>
    
    <filter>
        <filter-name>emptyfilter-name>
        <filter-class>com.ffyc.firstweb.filter.IsEmptyFilterfilter-class>
    filter>

    <filter-mapping>
        <filter-name>emptyfilter-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.Listenlistener-class>
    listener>

总结

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


你可能感兴趣的:(JAVAEE,java-ee,服务器,java)