Servlet Day1

Servlet

day1_2023.10.9

JavaWeb

概念 : 就是使用Java技术开发web页面
资源分类
静态资源: 所有用户看到内容都一样,静态的页面,html、css、js…
动态资源: 用户看到内容可能不一样的, jsp/servlet、php、asp…

web应用程序

概念:提供给浏览器访问的程序,将来写完JavaWeb项目之后,需要将项目部署到web应用程序中,提供给外界访问
web项目包含的内容:
静态的页面、配置文件(properties…)、Java文件、jar包
web服务器 :
服务器表示安装了服务器软件的计算机
服务器软件指的是可以接受用户请求,处理请求,做出响应,比如安装了mysql,用户可以登录mysql,可以发出查询指令,服务器可以将登录、查询指令返回给用户
web服务器指的是,可以部署web项目,可以让用户通过浏览器来访问
常用的web服务器
1,webLogic :oracle公司,支持所有的JavaEE的规范,收费
2,webSphere :IBM公司,支持所有的JavaEE的规范,收费
3,JBOSS:JBoss,支持所有的JavaEE的规范,收费
4,Tomcat:apache基金会的项目,支持Servlet\jsp规范,免费

Tomcat的使用

下载:https://tomcat.apache.org/
安装:直接将压缩包解压缩
启动、配置:
在这里插入图片描述
启动文件、关闭文件
在这里插入图片描述
双击启动,有如下内容表示启动成功
在这里插入图片描述
通过浏览器访问http://localhost:8080/
启动的问题:
1,启动闪退, Java运行环境问题
2,启动报错,8080端口被占用,
1,找到占用的程序,去结束掉占用进程
使用命名: netstat -ano
2,修改tomcat启动的端口号
找到conf目录下的server.xml ,修改其端口号
在这里插入图片描述
3,乱码问题
找到conf目录下的
在这里插入图片描述
将配置代码内容改为GBK
在这里插入图片描述
面试题 :
网站是怎么进行访问的?
1,输入网站域名,回车访问
2,域名会先到本地 C:\Windows\System32\drivers\etc 下的hosts文件中,检查是否存在域名映射
3,如果存在域名映射,则将此域名映射的ip地址返回
4,如果不存在,则去域名解析器中,匹配对应的服务器ip地址,如果有地址,则访问成功

tomcat中部署web网站的方式

三种部署方式:
1,将项目文件,部署到tomcat下的webapps目录中
新建一个hello目录,里面放入一个hello.html文件,然后将这个目录,复制到webapps目录下
在tomcat的后面直接访问 /hello/hello.html 就能访问到对应的html页面了
在这里插入图片描述
在这里插入图片描述
2,通过配置文件部署项目(使用的较少,需要修改配置文件)
在server.xml文件中,找到< Host > 标签,在标签中配置< Context >标签
两个属性 : docBase 表示项目的位置 path 表示浏览器中访问的虚拟路径
在这里插入图片描述
配置完之后的访问地址在这里插入图片描述
3,动态部署的方式
找到conf/catalina/localhost目录,在目录中创建任意名称的 xml文件
编写文件内容,< Context docBase=“D:\hello” />
在这里插入图片描述
第三种方式,是一种热部署的方式,将来工具中比较常用

Idea中集成Tomcat

创建项目
在这里插入图片描述
目录结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编写html文件
启动tomcat,在浏览器中访问hello.html
在这里插入图片描述
修改虚拟路径,完成指定html文件的访问
修改端口号,完成指定的html文件的访问
单独再添加一个tomcat服务器,完成访问

Idea中怎么部署的项目 ?

通过查看idea启动后,后台的地址
在这里插入图片描述
在这个地址后,和之前tomcat目录下的conf目录差不多,翻到最后,localhost目录下,有一个xml文件
在这里插入图片描述
这个xml文件,其实就是idea帮助我们动态部署的那个文件
这个文件中,指向一个地址,这个地址就是idea中,项目运行的真正位置。
在这里插入图片描述
在这里插入图片描述

Servlet学习

servlet概念

概念 : 由server applet 两个单词缩写,翻译过来就是: 运行在服务器端的小程序

Servlet的作用 :

浏览器可以通过域名和端口,找到我们的服务器,找到的是服务器上的tomcat

服务器上的项目资源分为静态资源和动态资源,服务器可以直接将静态资源返回给浏览器,浏览器可以解析,动态资源不能直接返回给浏览器,浏览器无法识别,只能通过servlet处理之后,返回给浏览器

所以,servlet的作用,主要就是接受浏览器发送到服务器的请求,把请求处理后,再将结果返回给浏览器,浏览器在发送数据的时候,需要按照指定的规则去完成发送,满足servlet要求后,才能获取到浏览器的数据。

在Java中,定义指定的规则内容的都是接口,Servlet其实就是一个接口,这个接口定义了java类被浏览器访问的规则。

Servlet实现

1,编写一个类,实现Servlet接口
2,实现所有Servlet接口的方法
3,在init方法、service方法、destroy方法中编写代码
4,service方法是Servlet中的核心方法,将来浏览器的请求和响应都会在这个方法中进行处理

public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet初始化....");
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //通过servletRequest对象处理请求的数据
        String username = servletRequest.getParameter("username");
        System.out.println(username);
        System.out.println("service方法是核心方法,将来的业务逻辑都写在这个方法中..");
        System.out.println("只要servlet被访问,默认就会执行service方法中的代码..");
        //响应的操作
        servletResponse.getWriter().write("hello, response working~");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
        System.out.println("servlet运行结束之后,对象被销毁了,会调用这个方法");
    }
}

配置web.xml文件
在这里插入图片描述
浏览器访问
http://localhost:8088/haha/demo?username=jack
/haha 虚拟路径
/demo web.xml中编写的资源路径
?username=jack 表示携带的请求参数
在这里插入图片描述

Servlet运行流程

在这里插入图片描述

Servlet的生命周期

servlet的方法,代表了它的生命周期
常用的方法一般是 init 方法、service方法、destroy方法
1,init方法:
默认是当资源第一次被访问的时候,也就是servlet对象被创建后,执行此方法,执行一次
可以修改它的执行时间,改为服务启动后就执行
在web.xml文件中,servlet标签下,加上一对标签
< load-on-startup >1< /load-on-startup >
默认值是-1,表示第一次访问创建
改为0或者其他正整数,表示tomcat服务启动后就创建
在这里插入图片描述
init方法值执行一次,说明在内存中,只存在一个servlet对象,servlet是单例对象
tomcat本身是支持多线程的,多个用户访问的时候,可能会出现线程安全问题
将来在使用的时候,尽量不用synchronized来保证线程安全,因为,一个用户获取锁之后,其他用户都要等待。
怎么解决 ? 尽量不要在Servlet类中定义成员变量,可以在service方法中定义局部变量,这样每次访问的时候,局部变量不是所有线程共享的,就不会存在安全问题
2,service方法
将来用来提供逻辑服务的方法,每次访问servlet,都会执行此方法
3,destroy方法
servlet被销毁时,执行,服务器关闭的时候,servlet对象被销毁,可以用来释放资源等

Servlet体系结构

Servlet接口
|
GenericServlet抽象类
|
HttpServlet抽象类
1,Servelt接口是Servlet体系的总接口,每次实现,都需要实现其5个方法,比较麻烦
2,GenericServlet是Servelt接口的一个实现类,这个类里面针对除了service以外的其他方法都做了默认实现,继承GenericServlet这个类,只要重写service方法就可以了
3,但是将来请求发过来,仍然要去判断请求过来使用的是什么方法,get或者post或者其他方法,所以每次重写GenericServlet这个类的service方法,还要判断请求的方法是什么,也比较麻烦
4,HttpServlet是Servlet接口在遵循Http标准的情况下,编写的一个子类,它的service方法完成了对各种方法的判断和封装,使用的时候,只需要继承HttpServlet这个类,然后重写doget和dopost方法即可

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("不管是get方法还是post方法,都在这个方法中写代码就可以了");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doGet(req, resp);
    }
}

在这里插入图片描述
使用servlet完成简单的登录验证

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/haha/ServletDemo01" method="get">
    用户名:<input type="text" name="username"> <br>
    密码 : <input type="password" name="password"> <br>
    <input type="submit" value="登录">
</form>
</body>
</html>
package com.iweb.airui369.servlet02;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //浏览器请求登录,携带了用户名和密码两个参数,要在servlet中获取用户名和密码
        //通过请求对象HttpServletRequest,去获取到请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username + "--" + password);
        //jdbc的连接
        //判断用户名和密码
        if ("jack".equals(username) && "123456".equals(password)){
            //用户名和密码都正确,就响应登录成功
            response.getWriter().write("login success!");
        }else {
            response.getWriter().write("login lose!");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

<!-- 配置servlet-->
    <servlet>
        <servlet-name>ServletDemo01</servlet-name>
        <servlet-class>com.iweb.airui369.servlet02.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletDemo01</servlet-name>
        <url-pattern>/ServletDemo01</url-pattern>
    </servlet-mapping>
Servlet3.0使用注解开发

Servlet3.0之后,在类上加上@WebServlet 就可以完成Servlet配置,不用在web.xml中再去配置信息

//@WebServlet({"/servletDemo02","/s1","/s2"})
@WebServlet({"/servletDemo02","/s1/*","/s2"})
public class ServletDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet被访问了---------POST");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       this.doPost(request, response);
    }
}

写法 :
一个地址 :@WebServlet(“/servletDemo02”)
多个地址:@WebServlet({“/servletDemo02”,“/s1”,“/s2”})
地址中有多层结构 : @WebServlet({“/servletDemo02”,“/s1/*”,“/s2/hello”})

HTTP

概念:Hyper Text Transfer Protocol 超文本传输协议

传输协议:定义了,客户端和服务端通信的时候,要遵循的一个协议规定,主要是定义了数据发送和接收的格式

特点 : 基于TCP/IP协议的高级协议,默认端口80,基于请求/响应模型的,一次请求对应一次响应,每次请求之间是相互独立的

Https: 基于http做了一层更加安全的验证

Https端口号是 :443

http版本:

1.0 版本 :每次请求都会重新建立连接

1.1 版本:后续的请求会复用之前请求的连接

Http请求和Http响应

只要将来在浏览器中,输入一个资源路径,去访问资源,就可以称为是一次请求,每次请求都会伴随着一次响应

Http请求

Http请求,是从客户端发送出来,发给服务器端的

http中,请求消息的数据格式:

1,请求行

组成:请求方法 请求url 请求协议/版本
在这里插入图片描述
请求方法:get、post
get:表单数据携带在url地址上,数据不安全,大小有限制,速度快
post:表单数据携带在请求体中,数据安全,大小没限制,速度慢
2,请求头
组成 :请求头名:请求头值
在这里插入图片描述
Referer 表示当前请求从哪个地址过来 http://localhost:8088/haha/login.html
统计访问、防盗链
User-Agent 显示浏览器的信息
Accept 支持解析文件的格式
3,请求空行
就是一个空行,起到分割作用
4,请求体(post方法才有请求体,get方法没有)
组成 : post请求携带的表单数据
在这里插入图片描述

HttpServletRequest对象

ServletRequest(父接口) :

定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法

|

HttpServletRequest(子接口):

扩展 ServletRequest 接口,为 HTTP servlet 提供请求信息。

servlet 容器创建 HttpServletRequest 对象,并将该对象作为参数传递给 servlet 的 service 方法(doGet、doPost,等等)。

|

RequestFacade(实现类)

通过后台输出doGet方法中提供的request对象,发现输出的值是

org.apache.catalina.connector.RequestFacade@484653ea

说明,在使用doGet方法或者doPost方法参数的request对象或者response对象的方法,实际上使用的是RequestFacade这个实现类中的方法

HttpServletRequest对象的常用方法
1,获取请求中的各种数据

获取请求行数据

String getMethod()返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT

String getContextPath() 返回请求 URI 指示请求上下文的那一部分

String getServletPath() 返回此请求调用 servlet 的 URL 部分

String getQueryString() 返回包含在请求 URL 中路径后面的查询字符串

String getRequestURI()返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串

StringBuffer getRequestURL() 重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。

String getProtocol() 返回请求使用的协议的名称和版本

String getRemoteAddr() 返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址

@WebServlet("/ServletDemo03")
public class ServletDemo03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求中数据的方法
        //获取请求行
        //String getMethod()返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT
        String method = request.getMethod();
        System.out.println(method);
        //String getContextPath()	返回请求 URI 指示请求上下文的那一部分
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //String getServletPath()	返回此请求调用 servlet 的 URL 部分
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        //String getQueryString()	返回包含在请求 URL 中路径后面的查询字符串
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //String getRequestURI()返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        //StringBuffer getRequestURL()		重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //String getProtocol()	返回请求使用的协议的名称和版本
        String protocol = request.getProtocol();
        System.out.println(protocol);
        //String getRemoteAddr()	返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
2,获取请求头数据

String getHeader(String name) 以 String 的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回 null
Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举


 //获取请求头数据
        //获取单个请求头
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        //获取所有请求头的名称
        Enumeration<String> headerNames = request.getHeaderNames();
        //遍历
        while (headerNames.hasMoreElements()){
            //遍历每一个headerName
            String headerName = headerNames.nextElement();
            //通过headerName去获取对应的值
            String headerValue = request.getHeader(headerName);
            System.out.println(headerName + "---" + headerValue);
        }
3,获取请求体数据

先通过请求对象获取到输入流,再从输入流中拿到数据
ServletInputStream getInputStream() 使用 ServletInputStream 以二进制数据形式获取请求正文
BufferedReader getReader() 使用 BufferedReader 以字符数据形式获取请求正文。读取器根据正文上使用的字符编码转换字符数据

 //获取post请求中的表单数据
        //ServletInputStream inputStream = request.getInputStream();
        BufferedReader reader = request.getReader();
        String line = null;
        while ( (line = reader.readLine()) != null){
            System.out.println(line);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值