JavaWeb基础(一)
2020-12-25 / highPhone啊

JavaWeb是什么

用Java技术来解决相关web互联网领域的技术栈统称为JavaWeb。
一个web应用程序由多部分组成,主要分为静态web资源和动态web资源:

  • html页面 、css(层叠样式表)、 js
  • servlet、jsp(JavaServer Page, 本质是servlet)
  • java程序
  • jar包依赖
  • 配置文件

请求和响应

在B/S模式下,浏览器与服务器通过http进行通信,如下是web应用中浏览器与服务器交互的简要过程

Servlet

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

  1. 在JavaWeb中,我们通过实现javax.Servlet接口来处理http请求,并返回http响应,如下Servlet接口源码中只约定了5个方法,主要逻辑在service方法里面

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package javax.servlet;

    import java.io.IOException;

    public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
    }
  2. Servlet的实现类GenericServlet也没有实现service方法:

    1
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
  3. 我们常用HttpServlet这个类来处理http请求,HttpServlet就继承了GenericServlet,并实现了service方法,其中根据请求方法的不同,分别调用了不同的处理方法,比较常见的就是对应GET请求的doGet()和POST请求的doPost(),并在doGet()或者doPost()方法中处理请求,并封装响应信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    long lastModified;
    if (method.equals("GET")) {
    lastModified = this.getLastModified(req);
    if (lastModified == -1L) {
    this.doGet(req, resp);
    } else {
    long ifModifiedSince = req.getDateHeader("If-Modified-Since");
    if (ifModifiedSince < lastModified) {
    this.maybeSetLastModified(resp, lastModified);
    this.doGet(req, resp);
    } else {
    resp.setStatus(304);
    }
    }
    } else if (method.equals("HEAD")) {
    lastModified = this.getLastModified(req);
    this.maybeSetLastModified(resp, lastModified);
    this.doHead(req, resp);
    } else if (method.equals("POST")) {
    this.doPost(req, resp);
    } else if (method.equals("PUT")) {
    this.doPut(req, resp);
    } else if (method.equals("DELETE")) {
    this.doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
    this.doOptions(req, resp);
    } else if (method.equals("TRACE")) {
    this.doTrace(req, resp);
    } else {
    String errMsg = lStrings.getString("http.method_not_implemented");
    Object[] errArgs = new Object[]{method};
    errMsg = MessageFormat.format(errMsg, errArgs);
    resp.sendError(501, errMsg);
    }

    }

一个简单的Servlet例子

  1. 编写一个简单的Java类,继承HttpServlet类,并重写其中的doGet()和doPost():
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);//无论是get还是post请求,都调用doPost处理
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //this.getInitParameter(); //初始化参数
    ServletConfig config = this.getServletConfig();//servlet配置
    ServletContext servletContext = this.getServletContext();//servlet上下文

    resp.setContentType("text/html"); //设置响应的内容
    resp.setCharacterEncoding("utf-8");//设置响应编码格式
    PrintWriter writer = resp.getWriter();//输出内容到响应信息
    writer.print("<h1>highPhone啊</h1>");
    }
    }
  2. 在web.xml中注册此Servlet并定义此Servlet处理的请求url格式:
    1
    2
    3
    4
    5
    6
    7
    8
    <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>xyz.highphone.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>*.highphone</url-pattern>
    </servlet-mapping>
  • servlet-name中的名字是唯一确定的,不能重复
  • 一个servlet可以对应多个servlet-mapping
  • *是url通配符,表明此Servlet会处理url为.highphone结尾的所有请求,也可以精确为/highphone,优先匹配精确url,再匹配通配符
  1. 启动项目,进行测试
本文链接:https://highphone.xyz/e303343.html