44.Javaweb、servlet、web.xml请求与响应

本文介绍了JavaWeb开发中的核心概念,包括URI、URL、Tomcat服务器的安装、HTTP协议的请求与响应格式。深入讲解了servlet的生命周期、配置方式以及处理请求和响应的方法。此外,还探讨了web.xml配置、servletConfig以及处理请求响应的常用API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web开发

服务器:服务器本身就是一段应用程序,作用:用于存放可执行的代码。根据用户的请求去匹配一段在报务器中保存的代码,并将之运行起来,最后将运行的结果反馈给用户。

服务器的类型:

apache nginx tomcat。。。。

tomcat安装:

安装包解压即可用。

解压时注意:解压一个无中文无空格的目录中。

配置环境变量。

web项目的架构形式:

CS:c:client(客户端) s:server(服务端)
优势:客户端和服务端都是同一家公司开发的,客户端与服务端的通信成本很低
缺点:客户端需要单独进行开发,客户端一般都比较大,下载时比较耗资源

BS:b:browse(浏览器), s:server(服务端)
实际上将浏览器当成了通用的客户端。
优势:无需开发专用的客户端,使用浏览器作为通用客户端。无需下载,节约资源。
缺点:浏览器与服务端的通信将变得非常困难。

协议:

HTTP协议,超文本传输协议 hyper text transfer protocal,是一个简单的请求-响应协议。

http请求格式:

1、请求行:请求提交方式 URL 。。。。。

2、请求头:以键值对的形式出现

3、空行

4、请求正文:请求的提交方式决定了是否存在请求正文。

GET:无请求正文,因为用户提交的数据会拼接在URL后

POST:有请求正文,因为URL中不拼接用户数据,需要通过请求正文将用户提交的数据发送到后台服务器中

http响应格式

响应状态码

常见错误响应状态码

​ 400-499 客户端错误响应

  1. 400 Bad Request: 请求语法有问题,服务器无法识别:没有host请求头字段,或者设置了超过一个的host请求头字段。
  2. 401 UnAuthorized: 客户端未授权该请求。缺乏有效的身份认证凭证,一般可能是未登陆。登陆后一般都解决问题。
  3. 403 Forbidden: 服务器拒绝响应。权限不足。
  4. 404 Not Found: URL无效或者URL有效但是没有资源。
  5. 405 Method Not Allowed: 请求方式Method不允许。
  6. 406 Not Acceptable: 资源类型不符合服务器要求。
  7. 407 Proxy Authorization Required: 需要代理授权。
  8. 408 Request Timeout:服务器将不再使用的连接关闭。响应头会有Connection: close。
  9. 426 Upgrade Required: 告诉客户端需要升级通信协议。

​ 500-599 服务器错误响应

  1. 500 Internal Server Error: 服务器内部错误,未捕获。
  2. 502 Bad Gateway: 服务器作为网关使用时,收到上游服务器返回的无效响应。
  3. 503 Service Unavailable: 无法服务。一般发生在因维护而停机或者服务过载。一般还会伴随着返回一个响应头Retry-After: 说明恢复服务的估计时间。
  4. 504 Gateway Timeout: 网关超时。服务器作为网关或者代理,不能及时从上游服务器获取响应返回给客户端。
  5. 505 Http Version Not Supported: 发出的请求http版本服务器不支持。如果请求通过http2发送,服务器不支持http2.0,就会返回该状态码。
URI和URL

URI:统一资源标识符,作用:用于标记一个互联网上的资源名称。

URL:统一资源定位符,作用:不但可以标记一个互联网上的资源名称,还可以标记该资源所在的位置。URL是URI的子集。

uri表现形式:协议:资源名称

fttp://a.png

url的表现形式:协议+主机名+端口+资源名称

http://192.168.40.132:8099/a.png

ip:用于定位一台互联网上的设备

端口:用于定位设备中的某个软件

web开发三大组件

三大组件:servlet、filter、 listener

servlet

作用:接收请求,作出响应。

servlet的三种创建方式

1、实现servlet接口

package com.woniuxy.servlet;

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

/**
 * 实现servlet接口创建servlet
 */
public class ImplementsServletInterfaceServlet implements Servlet {
    /**
     * servlet的初始化时执行的方法
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet init...");
    }

    /**
     * 此方法用于获取servletConfig
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * servlet接收请求,作出响应的方法
     * 生命周期中的重要方法,该方法每接收一次请求,都会被调用一次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet service...");
    }

    /**
     * 用于编写一些对当前servlet的描述信息
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * servlet销毁时调用的方法
     */
    @Override
    public void destroy() {
        System.out.println("servlet destroy...");
    }
}

2、继承GenericServlet

package com.woniuxy.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class ExtendsGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("ExtendsGenericServlet service...");
    }
}

3、继承HttpServlet

package com.woniuxy.servlet;

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

public class ExtendsHttpServlet extends HttpServlet {

    /**
     * 只能处理get请求
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
//    @Override
//    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        doPost(req,resp);
//    }


    /**
     * 只能处理post请求
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
//    @Override
//    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("ExtendsHttpServlet doPost ...");
//    }

    /**
     * 重写service(),就可以处理所有请求提交方式
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ExtendsHttpServlet service ...");
    }
}

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>testServlet</servlet-name>
        <servlet-class>com.woniuxy.servlet.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>


    <!--
    配置servlet:
    <servlet>
    <servlet-mapping>
    -->

    <servlet>
        <servlet-name>implementsServletInterfaceServlet</servlet-name>
        <!--指定接收的请求由哪个类来进行处理-->
        <servlet-class>com.woniuxy.servlet.ImplementsServletInterfaceServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>implementsServletInterfaceServlet</servlet-name>
        <!--
        http://localhost:8080/iss
        url-pattern匹配的URL中除协议+ip+端口以外的部分
        -->
        <url-pattern>/iss</url-pattern>
        //url-parttern可以重复多个
    </servlet-mapping>


    <servlet>
        <servlet-name>extendsGenericServlet</servlet-name>
        <servlet-class>com.woniuxy.servlet.ExtendsGenericServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>extendsGenericServlet</servlet-name>
        <url-pattern>/egs</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>extendsHttpServlet</servlet-name>
        <servlet-class>com.woniuxy.servlet.ExtendsHttpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>extendsHttpServlet</servlet-name>
        <url-pattern>/ehs</url-pattern>
    </servlet-mapping>


</web-app>
servlet生命周期

如果配置了<load-on-startup>,servet的生命周期就和tomcat容器保持一致。tomcat容器启动时,servlet就完成初始化,tomcat关闭时,servlet就完成销毁。

如果不配置<load-on-startup>,servlet的初始化工作会在接收第一次用户请求时完成。

	<servlet>
        <servlet-name>implementsServletInterfaceServlet</servlet-name>
        <!--指定接收的请求由哪个类来进行处理-->
        <servlet-class>com.woniuxy.servlet.ImplementsServletInterfaceServlet</servlet-class>
        <!--
        如果配置了<load-on-startup>,则servlet会在tomcat容器启动时,完成初始化工作
        <load-on-startup>的值是一个非零整数,值越小,初始化的时机就越早
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>implementsServletInterfaceServlet</servlet-name>
        <!--
        http://localhost:8080/iss
        url-pattern匹配的URL中除协议+ip+端口以外的部分
        -->
        <url-pattern>/iss</url-pattern>
    </servlet-mapping>

注解配置servlet

要求:web application的版本必须高于3.0

//注解的参数放置是url-pattern的值,如果使用精确匹配,前面的/不能少。如果少了,tomcat启动会失败。
@WebServlet("/acs")//http://localhost:8080/acs
public class AnnotationConfigServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("AnnotationConfigServlet service...");
    }
}
url-pattern

url-pattern的配置方式有多种,在配置时可以使用*号通配符来完成通配
注意:使用*号进行通配时,*号不能出现在中间,只能出现在最前或最后的位置

精确匹配 /自定义的url-pattern

后缀匹配 *.do

路径匹配 /*:匹配所有路径 /a/b/c/*:匹配某个精确路径之后的所有路径

/:匹配所有

注意:一般不会去配置/或/*,因为配置过后,web项目中的静态资源无法访问。

web.xml

<servlet>
        <servlet-name>urlPatternServlet</servlet-name>
        <servlet-class>com.woniuxy.servlet.UrlPatternServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>urlPatternServlet</servlet-name>
        <!--
        url-pattern的配置方式有多种,在配置时可以使用*号通配符来完成通配
        注意:使用*号进行通配时,*号不能出现在中间,只能出现在最前或最后的位置
        /ups   精确匹配

        *.do   后缀匹配    http://localhost:8080/a.do    http://localhost:8080/b.do

        /a/b/c/*     路径匹配    http://localhost:8080/a/b/c/abcdefg   /*:匹配所有

        /      匹配所有
        -->
<!--        <url-pattern>/ups</url-pattern>-->
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

servlet

public class UrlPatternServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.service(req, resp);
        System.out.println("UrlPatternServlet service...");
    }
}
servletConfig

作用:用于获取servlet配置的信息,无需读取xml文件。

web.xml

<servlet>
        <servlet-name>urlPatternServlet</servlet-name>
        <servlet-class>com.woniuxy.servlet.UrlPatternServlet</servlet-class>
        <!--配置servlet的初始化参数-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>a</param-name>
            <param-value>1</param-value>
        </init-param>
        <init-param>
            <param-name>b</param-name>
            <param-value>2</param-value>
        </init-param>
        <init-param>
            <param-name>c</param-name>
            <param-value>3</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>urlPatternServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

servlet

  • this.getServletConfig()
  • servletConfig.getServletName()
  • servletConfig.getInitParameterNames()
  • servletConfig.getInitParameter(“encoding”);
  • servletConfig.getServletContext()
public class UrlPatternServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取servletConfig对象
        ServletConfig servletConfig = this.getServletConfig();

        //获取servlet-name标签的值
        String servletName = servletConfig.getServletName();
        System.out.println(servletName);

        //根据初始化参数的name值去获取value值   :参数为<param-name>标签的值
        String encoding = servletConfig.getInitParameter("encoding");
        System.out.println(encoding);

        //getInitParameterNames()用于获取当前servlet的所有初始化参数的name
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();

        //hasMoreElements():判断是否还有元素。
        while (initParameterNames.hasMoreElements()) {
            //nextElement():从枚举集合中去获取下一个元素。
            String name = initParameterNames.nextElement();
            String value = servletConfig.getInitParameter(name);
            System.out.println("param-name:"+name+",param-value:"+value);
        }

        //获取web应用上下文对象
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println(servletContext);


        System.out.println("UrlPatternServlet service...");
    }
}
处理请求

HttpServletRequest:由tomcat服务器在接收到请求后,封装出来的对象,只管使用即可。

  • //解决请求中文乱码问题
    req.setCharacterEncoding(“UTF-8”);
  • req.getMethod()
  • req.getRequestURL()
  • req.getRequestURI()
  • req.getScheme()
处理响应

HttpServletResponse:响应对象

  • //解决响应中文乱码问题
    resp.setContentType(“text/plain;charset=utf-8”);
    resp.setCharacterEncoding(“UTF-8”);
  • resp.getWriter()
  • writer.write()
  • resp.setHeader(“a”,“1”)
  • resp.addHeader(“b”,“2”)
  • //设置响应状态
    resp.setStatus(404);
  • 响应错误信息
    resp.sendError(404);
package com.woniuxy.servlet;

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;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet("/trs")
public class TestRequestServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决请求中文乱码问题
        req.setCharacterEncoding("UTF-8");
        //解决响应中文乱码问题
        resp.setContentType("text/plain;charset=utf-8");
        resp.setCharacterEncoding("UTF-8");

        //获取输出流
        PrintWriter writer = resp.getWriter();
        //调用API将内容写出到浏览器中
        writer.write("今天的课程内容非常简单,非常轻松");
        writer.print("<h1>今天的课程内容非常简单,非常轻松</h1>");

        //设置响应头
        resp.setHeader("a","1");
        resp.setHeader("a","2");
        resp.setHeader("a","3");
        resp.setHeader("a","4");

        //添加响应头
        resp.addHeader("b","2");
        resp.addHeader("b","3");
        resp.addHeader("b","4");
        resp.addHeader("b","5");

        //设置响应状态
//        resp.setStatus(404);
		//响应错误
        resp.sendError(404);

        //处理请求
        /*****************获取请求行的数据******************/
        //获取请求的提交方式
        System.out.println(req.getMethod());

        //获取请求的URL
        System.out.println(req.getRequestURL());
        //获取请求的URI
        System.out.println(req.getRequestURI());

        //获取协议
        System.out.println(req.getScheme());

        /*****************获取请求头的数据******************/
        //根据请求头中key获取其value值
        System.out.println(req.getHeader("Accept"));

        //获取所有头部字段的名称
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = req.getHeader(headerName);
            System.out.println(headerName+":"+headerValue);
        }

//        Enumeration<String> headers = req.getHeaders();


        /*****************获取用户传递的数据******************/

        // http://localhost:8080/trs?username=tom&password=111
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username+":"+password);

    }
}

HeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = req.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}

// Enumeration headers = req.getHeaders();

    /*****************获取用户传递的数据******************/

    // http://localhost:8080/trs?username=tom&password=111
    String username = req.getParameter("username");
    String password = req.getParameter("password");

    System.out.println(username+":"+password);

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值