JavaEE学习之走进Servlet

本文详细介绍了JavaEE中的Servlet技术,从C/S和B/S架构对比开始,深入讲解了服务器、Tomcat的安装与配置,以及项目部署和静态资源访问。重点讨论了Servlet的概念、生命周期、开发步骤和常见错误,演示了在IDEA中开发Servlet的过程。此外,还涵盖了HTTP协议的基本概念和请求响应流程,以及Servlet的多种配置方式。最后,文章探讨了Servlet的编码问题、状态管理(Cookie和Session)、转发与重定向、过滤器的使用,以及ServletContext对象的应用,为读者提供了全面的JavaEE入门知识。
摘要由CSDN通过智能技术生成

Servlet

引言

1.C/S架构和B/S架构

  • c/s和b/s架构是软件发展过程中出现的两种软件架构方式

1.2 C/S架构(Client/Server 客户端/服务端)

  • 特点:必须在客户端安装特定软件
  • 优点:图形效果显示较好(如:3d游戏)
  • 缺点:服务器的软件和功能进行升级,客户端也必须升级,不利于维护
  • 常见的c/s程序:qq,微信等
    在这里插入图片描述

1.3 B/S架构(Browser/Server 浏览器/服务器)

  • 特点:无需安装客户端,任何的浏览器都可以直接访问
  • 优点:涉及到功能的升级,只需要升级服务器端
  • 缺点:图形显示效果不如C/S架构
  • 需要通过HTTP协议访问
    在这里插入图片描述

服务器

1.概念

1.1 什么是web

  • web称为万维网,简单理解就是网站,他用来表示internet主机上供外界访问的资源
  • Internet上供外界访问资源分为两大类
    • 静态资源:指Web页面供人们浏览的数据始终是不变的(html,css)
    • 动态资源:指web页面供人们浏览的数据由程序产生,不同时间点,甚至不同设备访问web页面看到的内容各不相同(jsp/servlet)
    • 在java中,动态web资源开发技术我们统称java web

1.2 什么是web服务器

  • web服务器是运行及发布web应用的容器,只有将开发的web项目放置到容器中,才能使网络中的所有用户通过浏览器访问

2.常见的服务器

  • 开源:OpenSource(开放代码,免费)
    • Tomcat(主流的web服务器之一,适合初学者)
    • jetty(淘宝,运行效率逼tomcat高)
    • resin(新浪,所有开源服务器软件中,运行效率最高)
    • 三者用从代码角度完全相同,只有在开启,关闭服务器软件时对应的命令稍微有点区别,掌握一个即可掌握所有
  • 收费
    • WebLogic(Oracle)
    • WebSphere(IBM)
    • 提供相应的服务与支持,软件大,耗资源

3.Tomcat

  • Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,免费开源,并支持Servlet和JSP规范
  • Tomcat技术先进,性能稳定,深受java爱好者喜爱并得到了部分软件开发商的认可,称为目前比较流行的Web应用服务器

4.Tomcat安装

4.1 下载

4.2Tomcat目录结构

文件夹 说明 备注
bin 该目录下存放的是二进制可执行文件 startup.bat启动tomcat,shutdown.bat停止Tomcat
conf 这是一个非常重要的目录,这个目录下有两个最为重要的文件server.xml和web.xml server.xml:配置整个服务器的信息,例如修改端口号,编码格式等
web.xml:项目部署描述附文件,这个文件中中注册了很多mime类型,即文档类型
lib Tomcat的类库,里面存放Tomcat运行所需要的jar文件
logs 存放日志,记录Tomcat启动和关闭的信息,如果启动·tomcat时有错误,异常也会记录在日志文件 中
temp 临时文件,这个目录下的东西在停止tomcat会删除
webapps 存放web项目的的时候,其中每个文件夹都是一个项目;其中ROOT是一个特殊的项目,在地址栏没有给出项目目录时,对应的就是ROOT项目
work 运行时生成的文件,最终运行的文件都在这里 当客户端用户访问一个jsp文件时,Tomcat会通过jsp生成java文件,然后再编译java文件生成class文件,生成的java和class文件都会存放在这里

5.Tomcat启动和停止

  • 双击startup.bat启动tomcat,shutdown.bat停止Tomcat

5.1 修改端口号

  • Tomcat默认的端口号是8080,可以通过conf/server.xml文件修改
    在这里插入图片描述
  • 注意:修改端口号需要重新启动tomcat才能生效

6.项目部署及静态资源访问

  • Tomncat是Web服务器,我们的项目应用是在webapps下,然后通过特定的url访问

6.1 创建项目

  • 在Webapps中建立文件夹(项目应用)比如:myweb
    • 创建WEB-INF文件夹,用于存放项目核心内容
      • 创建classes,用于存放.class文件
      • 创建lib,用于存放jar文件
      • 创建web.xml,项目配置文件(到ROOT项目下的WEB-INF复制即可)
    • 把网页hello.html复制到myweb文件夹中,与WEB-INF同级目录

6.2 url访问资源

  • 浏览器地址中输入url:http://localhost:8080/myweb/hello.html
    • 经验URL主要有4部分组成:协议,域名/主机,端口,资源路径

6.3 Tomcat响应流程图

在这里插入图片描述

7.常见错误

7.1 Tomcat闪退

  • 闪退问题是由于JAVA_HOME配置导致的,检查JAVA_HOME配置是否正确

7.2 404

  • 访问资源不存在,出现404错误

Servlet【重点】

1.概念

  • Servlet:Server Applet的简称,是服务器端的程序(代码,功能实现),可交互式的处理客户端发送到服务器端的请求,并完成操作请求
  • 动态网页技术
  • JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成部分

1.1 Servlet作用

  • 接收客户端发来的请求,完成操作
  • 动态生成网页·(网页数据可变)
  • 将包含操作结果的动态网页响应给客户端

2.Servlet开发步骤

2.1 搭建开发环境

  • 将Servlet相关的jar包(lib/servlet-api.jar)配置到classpath中

2.2 编写Servlet

  • 实现javax.servlet.Servlet
  • 重写5个主要方法
  • 在核心的service()方法中编写输出语句,打印访问结果
    在这里插入图片描述

2.3 部署Servlet

  • 编译MyServlet后,将生成的.class文件放在WEB-INF/classes文件中

2.4 配置Servlet

  • 编写WEB-INF下项目配置文件web.xml
    在这里插入图片描述
  • 注意:url-pattern配置的内容就是浏览器地址栏输入的URL中项目名称后资源的内容

3.运行测试

  • 启动Tomcat,在浏览器地址栏输入:http://localhost:8080/myweb/myservlet访问,在Tomcat中打印时间表示成功

4.常见错误

4.1 500

  • 服务器端出现异常

IDEA开发web项目

1.web项目结构目录

在这里插入图片描述

2.IDEA开发Sevlet

  • 使用开发工具编写Servlet,仍要手工导入servlet-api.jar文件,并与项目关联

2.1 编写Servlet

  • 创建MyServlet,实现Servlet接口,覆盖5个方法
public class MyServlet implements Servlet {
   
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   

    }

    @Override
    public ServletConfig getServletConfig() {
   
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
        System.out.println("this is  first webpproject");
    }

    @Override
    public String getServletInfo() {
   
        return null;
    }

    @Override
    public void destroy() {
   

    }
}

2.2 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
        
    <servlet>
        <servlet-name>my</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>
</web-app>

2.3 部署Web项目

  • 在Tomcat的webapps目录下,新建WebProject项目文件夹
    • 创建WEB-INF,存放核心文件
    • 在WEB-INF,创建classes文件夹,将编译后的MyServlet文件复制至此
  • 问题:每当我们编写了新的Servlet或者重新编译,都需要手工将新的.class部署到Tomcat中,较为麻烦,就需要实现自动部署

3.IDEA部署Web项目

  • 前面我们是在Tomcat的webapps目录新建应用程序目录myweb,然后把静态资源和Servlet复制到相关目录下,使用IDEA不需要我们复制了,可以通过IDEA集成Tomcat服务器,实现自动部署

3.1 如何导出war包

  • 项目完成后,有时候要打包成war方便部署,war包可以直接放入Tomcat的webapps目录中,启动Tomcat后自动解压,访问即可
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
点击Build,完成导出
在这里插入图片描述

HTTP协议

1.什么是HTTP

  • 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式,无状态的,应用层协议,运行于TCP协议基础上

2.HTTP协议特点

  • 支持客户端(浏览器)/服务器模式
  • 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快,请求方法常用的有get,post等
  • 灵活:HTTP允许传输任意类型数据,传输的数据类型由Content-Type标识
  • 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户请求后,即断开连接,采用这种方式可以节省传输时间
    • HTTP1.0版本是一个请求响应之后,直接就断开了,称为短连接
    • HTTP1.1版本不是响应后直接就断开了,而是等几秒,这几秒之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒没有用户发送新的请求,就会断开连接,称为长连接
  • 无状态:HTTP协议是无状态协议
    • 无状态是指协议对于事务处理没有记忆能力

3.HTTP协议通信流程

  • 客户端与服务器建立连接(三次握手)
  • 客户端向服务器发送请求
  • 服务器接收请求,并根据请求返回相应的文件作为应答
  • 客户与服务器关闭连接(四次挥手)
    在这里插入图片描述

4.请求报文和响应报文(了解)

HTTP请求报文

  • 当浏览器向web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息(请求报文),HTTP请求信息由4部分组成
    1.请求行 请求方法/地址 URL协议/版本
    2.请求头(Request header)
    3.空行
    4.请求正文

在这里插入图片描述
HTTP响应报文

  • HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成
    1.状态行
    2.响应头(Response Header)
    3.空行
    4.响应正文
    在这里插入图片描述

5.常见状态码

状态代码 状态描述 说明
200 ok 客户端请求成功
302 Found 临时重定向
403 Forbidden 服务器收到请求,但是拒绝提供服务,服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如:输错了URL
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求

Servlet详解(重点)

1.Servlet核心接口和类

  • 在Servlet体系结构中,除了实现servlet接口之外,还可以通过继承GenericServlet或HttpServlet类,完成编写

1.1 Servlet接口

  • 在servlet API中最重要的是Servlet接口,所有的Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。
    该接口包含以下5中方法:
public class MyServlet implements Servlet {
   
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   

    }

    @Override
    public ServletConfig getServletConfig() {
   
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
      
    }

    @Override
    public String getServletInfo() {
   
        return null;
    }

    @Override
    public void destroy() {
   

    }
}

1.2 GenericServlet抽象类

  • GenericServlet使编写Servlet变得容易,他提供生命周期方法init和destroy的简单实现,要编写的一般的Servlet,只需要重写抽象service方法即可

1.3 HttpServlet类

  • HttpServlet是继承GenericServlet的基础上进行一步的扩展。
  • 提供将要被子类实例化以创建适用于WEB站点的HTTP servlet的抽象类,HTTPServlet的子类至少要重写一个方法,该方法通常是一下这些方法之一:
    • doGet,如果servlet支持HTTP GET请求
    • doPost,用于HTTP POST请求
    • doPut,用于HTTP PUT请求
    • doDelete,用于HTTP DELETE请求

2.Servlet的两种创建方式

2.1 实现接口Servlet

public class MyServlet implements Servlet {
   
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   

    }

    @Override
    public ServletConfig getServletConfig() {
   
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
      
    }

    @Override
    public String getServletInfo() {
   
        return null;
    }

    @Override
    public void destroy() {
   

    }
}
  • 这种方法比较麻烦需要实现接口中的所有方法

2.2 继承HttpServlet类

public class MyHttpServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("doGet方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("doPost方法");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("doPut方法");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("doDelete方法");
    }
}

2.3 常见的错误

  • HTTP Status 404 :资源找不到
    • 第一种情况:地址书写错误
    • 第二种情况:地址没问题,把IDEA项目中out目录删除,然后重新运行
  • Servlet地址配置重复:在这里插入图片描述
  • Servlet地址配置错误:
    在这里插入图片描述

3.Servlet两种配置方式

3.1 使用web.xml(Servlet2.5之前使用)

在这里插入图片描述

  • url-pattern定义匹配规则,取值说明:
    • 精确匹配  /具体的名称   只有url路径是具体的名称的时候才会除法Servlet
    • 后缀匹配   *.xxx   只要是以xxx结尾的就匹配触发Servlet
    • 通配符匹配  /*  匹配所有的请求,包含服务器的所有资源
    • 通配符匹配 /  匹配所有请求,包含服务器的所有资源,不包括.jsp
  • load-on-startup
    1.元素标记容器是否应该在web应用程序启动的时候就加载这个servlet
    2.他的值必须是一个整数,表示servlet被加载的先后顺序
    3.如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载
    4.如果值为正整数或者0时,表示容器在应用启动的时候就会加载并初始化这个Servlet。值越小,servlet的优先级越高,就越先被加载,值相同时,容器就会自己选择顺序来加载

3.2 使用注解(Servlet3.0后支持,推荐)

@WebServlet(value = {
   "/o","/se"},loadOnStartup = 0)
public class BasicServlet extends HttpServlet {
   
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("这是post方法");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("这是get方法");
    }
}

3.3 @WebServlet注解常用属性

  • name:Servlet名字 (可选)
  • value:配置url路径,可以配置多个
  • urlPatterns:配置url路径,和value一样,不可以同时使用
  • loadOnStartup:配置Servlet的创建时机,如果是0或者是正数 启动程序的时候创建,否则访问时创建。数值越小优先级越高

Servlet应用(重点)

1.request对象

  • 在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
    在这里插入图片描述

1.1 get和post区别

  • get请求
    • get提交的数据会放在url之后,以?分割url和传输数据,参数之间以&相连
    • get方式明文传递,数据量小,不安全
    • 效率高,浏览器默认请求方式为get请求
    • 对应的Servlet的方法是doGet
  • post请求
    • post方法是把提交的数据放在HTTP包的Body中
    • 密文传递数据,数据量大,安全
    • 效率相较于get低
    • 对应的Servlet方法是doPost

1.2 request主要方法

方法名 说明
String getParameter(String name) 根据表单组件名称获取提交数据
void setCharacterEnconding(String charset) 指定每个请求的编码

1.3 request的应用

@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        //获取用户发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("提交的数据为:"+username+"\t"+password);
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action="/rs" method="get">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="注册">
    </form>
</body>
</html>

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

1.4 get请求收参问题

  • 产生乱码是因为服务器和客户端的编码不一致导致的,因此解决的办法是:客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收

1.5 get中文乱码

  • 在tomcat7及以下版本,客户端以utf-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端编码不一致因此才会导致乱码
  • 解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
  • tomcat8的版本中get方式就不会出现乱码了,因为服务器对url的编码格式可以进行自动转换
  • 解决中文乱码
    在这里插入图片描述

1.6 post中文乱码

  • 由于客户端是以utf-8字符编码将表单数据传输到服务器端的,因此服务器也是需要设置以utf-8字符编码进行接收
  • 解决方案:使用ServletRequest接口继承而来的 setCharacterEnconding(String charset) 方法进行统一的编码设置
@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        //获取用户发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("提交的数据为:"+username+"\t"+password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        //设置request请求对象设置统一编码
        req.setCharacterEncoding("utf-8");
        //获取用户发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("提交的数据为:"+username+"\t"+password);
    }
}

2.response对象

  • response对象用于响应客户请求并向客户端输出信息
    在这里插入图片描述

2.1 response主要方法

方法名称 作用
setHeader(name,value) 设置响应信息头
setContentType(String) 设置响应文件类型,响应式的编码格式
setCharacterEncoding(String) 设置服务端响应内容编码格式
getWriter() 获取字符输出流
@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        //获取用户发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("提交的数据为:"+username+"\t"+password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        //设置request请求对象设置统一编码
        req.setCharacterEncoding("utf-8");
        //获取用户发送的数据
        String username = req.getParameter("username");
        String password = req.getParameter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值