JavaWeb(一) Servlet

  • Post author:
  • Post category:java



前言:

经过最近学习,web阶段快要学完,最近要从头复习下JavaWeb的知识

一、Web和JavaWeb的区别

1.1 简介


Web

是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。

例如:平常我们访问的网站,像百度,淘宝这些网站统称为Web


JavaWeb

是Java提供的一门

动态web资源开发技术,

是用Java技术来解决相关web互联网领域的技术栈,像百度,腾讯等等都用java来开发系统。

其中用JavaWeb来开发有

两大好处


1.跨平台

在多人开发的条件下,由于JVM的存在,开发和部署服务器的系统可以随意挑选,只要有对应版本的JDK


2.开源多

开源社区活跃,可以降低开发成本

1.2 B/S架构


B/S架构

是 Browser/Server 的缩写,翻译过来就是

浏览器/服务器 架构模式

,它的特点是,用户只需要用浏览器访问服务器,就可以获取web资源,具体如图


B/S架构的好处:

易于维护升级;服务器端升级后,客户端无需任何部署就可以使用到新的版本。

1.3 静态资源

静态资源主要包含

HTML、CSS、JavaScript、图片

等,主要

负责页面的展示

。其

特点

就是,每个用户看到的都是一样的页面,而且是固定的,不能随着用户的变化进行动态的变化。

1.4 动态资源

动态资源主要包含

Servlet、JSP

等,主要用来

负责逻辑处理



特点

是,进行逻辑的处理,并且将逻辑的处理结果给静态资源进行动态展示,所以静态资源和动态资源要一起使用。


1.5 数据库



数据库主要用来

存储数据

例如:用户登录,在客户端请求服务器时,服务器会从数据库取出数据,并对客户端输入的数据进行比较,会把资源相应给用户,若正确则会放行,若匹配不成功则会提示用户。逻辑处理如下图

1.6 HTTP协议

这里简略说一下HTTP协议,目前我购入两本《图解TCP/IP》和《图解HTTP》目前读了一半,等读完会进行详细总结讲解

这里讲解在调试过程中经常出现到的集中HTTP响应状态码

  • 200 ok 客户端请求成功(一切成功!!!)

  • 404 Not Found 请求资源不存在(地址栏写错误)

  • 500 Internal Server Error 服务端发生不可预期的错误(一般是服务器内部报错-通常会有报错信息提示)

    二、Servlet使用


Servlet

是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由

web服务器

运行Servlet。

2.1 实现Servlet

1)需要提前导入Servlet依赖坐标(也可以在Maven仓库中查找)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

*

这里需要注意:

这题添加scope中添加了bean的作用域为provided,因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错

2)定义一个类,实现Servlet接口,并重写接口中所有方法(包含了Servlet的5个生命周期-其中三个常用的)

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

@WebServlet("/Test")
public class Test implements Servlet {
    /*
    初始化方法
    1.调用时机:默认情况下,Servlet被第一次访问时被调用
    2.调用次数: 1次
    */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    /*
    获取Servlet的初始化参数
    (当servlet配置了初始化参数后,web容器在创建servlet实例对象时,
    会自动将这些初始化参数封装到ServletConfig对象中,
    并在调用servlet的init方法时,
    将ServletConfig对象传递给servlet。)
    */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /*
     提供服务
     1.调用时机:每一次Servlet被访问时,调用
     2.调用次数: 多次(每访问一次就调用一次)
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //获取请求方式,根据不同的请求方式进行不同的业务处理
        HttpServletRequest request = (HttpServletRequest)req;
       //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if("GET".equals(method)){
            // get方式的处理逻辑
        }else if("POST".equals(method)){
            // post方式的处理逻辑
        }
    }
    /*
    提供有关servlet 的信息
     */
    @Override
    public String getServletInfo() {
        return null;
    }
    /*
     销毁方法
     1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
     2.调用次数: 1次
     */
    @Override
    public void destroy() {

    }
}

2.2继承HttpServlet实现Servlet

在实际开发中2.1中的方法创建很复杂,需要重写很多方法,并且我们大部分时间是在service方法中进行编写,所以可以通过

继承HttpServlet

简化创建步骤,若

在需要时

可以用2.1中的方法创建。

如图为Servlet的体系结构

package Servlet;

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

@WebServlet(value = "/Servlet")
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

2.3urlPattern配置

一个Servlet可以配置多个urlPattern路径,如下

package Servlet;

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

@WebServlet(urlPatterns = {"/Test03","/Test04"})
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}


urlPattern配置规则总共有四种匹配

  • 精确匹配
package Servlet;

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

@WebServlet(urlPatterns = "/Test04/Test03")
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

在浏览器成功访问

  • 目录匹配
package Servlet;

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

@WebServlet(urlPatterns = "/Test04/*")
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

运行结果

  • 扩展名匹配
package Servlet;

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

@WebServlet(urlPatterns = "*.a")
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

运行结果

  • 任意匹配
package Servlet;

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

@WebServlet(urlPatterns = "/*")
public class Servlet extends HttpServlet {
    /*
    get请求是调用的方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
    /*
    post请求调用的方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

运行结果

2.4五种urlPatterns配置的优先级

精确匹配 > 目录匹配> 扩展名匹配 > /* > /

三、总结

学完这些基本的Servlet就可以创建了,后续会总结过呢更多的使用,努力学习的一天!



版权声明:本文为weixin_51558481原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。