章二十、Servlet —— Tomcat安装、web开发环境搭建、Servlet、过滤器

一、 web开发概述


所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互,流程如下:

  什么是服务器?

        Web服务器是指驻留于因特网上某种类型计算机的程序,它可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览; 它是一个容器,是一个连接用户与程序之间的中间件

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

        在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范

二、 web开发环境搭建


Tomcat官方站点:http://tomcat.apache.org

注:JDK8 对应的版本为 Tomcat 9

  获取Tomcat安装程序包

tar.gz文件是Linux操作系统下的安装版本

zip文件是Windows系统下的压缩版本

  安装JDK

设置JAVA_HOME环境变量

设置PATH环境变量

  安装Tomcat

解压tomcat压缩文件

  Tomcat 的目录层次结构

  运行

双击 bin 目录下的 startup.bat 文件

输入:

http://localhost:端口号 (一般是8080)

或http:127.0.0.1:端口号

或局域网ip:端口号

        先打开startup.bat,再打开浏览器,在地址栏中输入http://localhost:8080或localhost:8080回车,如果看到Tomcat自带的一个JSP页面,说明JDK和Tomcat已搭建成功。

  常见问题

乱码

问题描述:打开 startup.bat 后汉字乱码

解决方法:在 .\apache-tomcat-9.0.43\conf下打开logging.properties文件

将 java.util.logging.ConsoleHandler.encoding = UTF-8
替换为 java.util.logging.ConsoleHandler.encoding = GBK

与其他服务的端口号冲突

        tomcat端口号默认8080,如果和其他服务的端口号冲突,则可对端口号进行修改在.\apache-tomcat-9.0.43\conf下打开server.xml文件,在文件的69行左右,将port="8080"修改为指定某一端口号,重新启动。

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

三、 web开发环境搭建


创建并发web项目

1.创建javaWeb项目

2.发布web应用到服务器

自动将web应用发布到web服务器下,需要在开发工具中集成 tomcat进来

  打开IDEA,创建新项目:

 

 junit 的配置这部分可以直接删除

  新建Web后端项目

  在IDEA部署Tomcat

在IDEA中集成Tomcat后,修改代码后,可以直接部署到Tomcat 中

注意是Tomcat Server 中的 Local

选择bin的上级目录 

OK

把这个取消掉

删掉后缀,避免后续麻烦(至于会有什么麻烦,我也不到哇,老师是这么教的)

OK,添加成功 

  运行,测试

点击运行,等待,在webapps中找到该项目,点击index.html,打开

四、 Servlet


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

  Servlet的作用

1、接收用户发送的请求数据

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

3、根据处理结果,将结果响应给客户端

  Servlet创建和使用

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

2、在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_4_0.xsd"
         version="4.0">

    <!--配置Servlet程序-->
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>com.ffyc.dormServer.web.DemoServlet</servlet-class><!-- 全类名 -->
    </servlet>

    <!-- 为servlet程序配置一个地址 -->
    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

</web-app>

3、运行Servlet程序

通过浏览器访问http:localhost:8088/项目名/配置的url

例如我的项目名也是 dormServer 配饰的url是 /demo

控制台:

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

问题:

解决: 前面的端口号是正确的,不然会是直接无法访问,那么错误的就会是 /项目名/配置的url 中的项目名错误或者URL错误

如果部署后修改了代码,然后发现怎么编译都不行,这个时候就要用maven 中的clean来清除部署,然后重新加载

五、 Servlet生命周期


  创建

只被调用一次,只有第一次访问Servelt时创建Servlet实例,由服务器创建

  初始化

构造方法执行完成后,调用init()执行一些初始化操作

  服务

每次请求时调用service()方法

  销毁

服务器关闭时,会销毁Servlet对象,并且在销毁servlet对象时,会自动调用destroy()方法,执行一些最总操作

六、 http协议


什么是HTTP?

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

        HTTP是一个基于TCP/IP通信协议来传递数据.

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

七、 http请求


  http请求?

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

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

请求行包含:http请求方式,请求资源名称,http版本

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

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方式主要是从服务器获取信息;post主要是想服务器提交信息

        Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在请求体中提交。

get方式:

post方式:

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

  http请求~

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

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

getParameter( "name" ) --- String 通过name获得值

处理post请求中文乱码 request.setCharacterEncoding(编码格式)

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
        //设置解码的编码格式
        req.setCharacterEncoding("utf-8");

        String account = req.getParameter("account");
        String password = req.getParameter("password");
        System.out.println(account);
        System.out.println(password);

    }

  http请求。

都是 HttpServletRequest req 中的方法

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

getScheme()请求协议

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

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

getServerPort()服务器端口

八、 http响应


  http响应?

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

响应行里包含了http协议版本,以及用于描述服务器对请求的处理结果。

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

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

200:请求成功

302:请求重定向

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

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

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

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

Server        Apache-Coyote/1.1

Content-Type        text/html;charset=UTF-8

Content-Length         0

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

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

  http响应

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

九、 过滤器


  过滤器

        Filter 也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过 Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

使用场景:

1、统一编码过滤

2、权限验证

3、跨域过滤

  过滤器接口

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

Filter

FilterChain

FilterConfig

  Filter

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

init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数 FilterConfig可以获得filter的初始化参数。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对 request 和 response 进行预处理。其中FilterChain可以将处理后的 request 和 response 对象传递到过滤链上的下一个资源。

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

法一:只通过重写 doFilter方法来实现编码过滤器(编译后不好修改,智能通过对原码进行修改后重编译)

定义类,实现Filter接口,在接口中重写doFilter方法

package com.ffyc.dormServer.filter;

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

/*
定义统一编码过滤
 */
public class EncodFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("编码过滤器");
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
    }
}

然后再web,xml中将过滤器导入

法二:直接定义 requncod 和 respencod ,然后通过重写 init 方法来获取 web.xml文件中定义的参数,再在 doFilter方法中直接通过变量实现编码过滤器(程序编译后,仍可通过修改web.xml文件来修改编码过滤器的条件)

package com.ffyc.dormServer.filter;

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

/*
定义统一编码过滤
 */
public class EncodFilter implements Filter {
    String requncod = "";
    String respencod = "";

    //可以通过调用web.xml中的来修改
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        requncod = filterConfig.getInitParameter("reqencod");
        respencod = filterConfig.getInitParameter("respencod");
        System.out.println(requncod);
        System.out.println(respencod);
    }

//    //编译后难以修改
//    @Override
//    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        System.out.println("编码过滤器");
//        servletRequest.setCharacterEncoding("utf-8");//设置请求数据编码格式
//        servletResponse.setContentType("text/html;charset=utf-8");//设置相应内容编码格式
//        filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
//    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("编码过滤器");
        servletRequest.setCharacterEncoding(requncod);//设置请求数据编码格式
        servletResponse.setContentType(respencod);//设置相应内容编码格式
        filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
    }

}

相比上一个多了两个参数 reqencod ,respencod

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三木几

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

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

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

打赏作者

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

抵扣说明:

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

余额充值