JavaWeb

文章目录


一、Servlet

1.1、关于系统架构

1、系统架构包括:

  • C/S架构
  • B/S架构

2、C/S架构:

  • Client/Server【客户端/服务器】
  • C/S架构的软件有那些?
    QQ
  • C/S架构的特点:需要安装特定的客户端软件
  • C/S架构的系统优点和缺点分别是什么?
    • 优点:
      • 数度快(软件中的数据大部分都是集成到客户端软件当中的,很少量的数据从服务器传递送过来,所以C/S结构的系统速度快)
      • 体验好(速度又快,界面又好看)
      • 界面炫酷(专门的语言去实现界面的,更加灵活)
      • 服务器压力小(因为大量的数据都是集成在客户端软件当中,所以服务器只需要传送很少的数据量,当然服务器压力小)
      • 安全(因为大量的数据是集成在客户端软件当中的,并且客户端有很多个,服务器虽然只有一个,就算服务器受损了,问题也不大,因为大量的数据在多个客户端上有缓存,有存储,所以从这个方面来说,C/S结构的系统比较安全 )
    • 缺点:
      • 升级维护比较差(升级维护比较麻烦,每一个客户端软件都需要升级,有一些软件不是那么容易安装的)

3、B/S架构:

  • B/S架构【Browser/Server,浏览器/服务器】
  • B/S结构的系统是不是一个特殊的C/S系统?
    • 实际上B/S结构的系统还是一个C/S,只不过这个C比较特殊,这个Client是一个固定不变浏览器软件。
  • B/S结构的系统优点和缺点是:
    • 优点:
      • 升级维护方便。成本比较低。(只需要升级服务器端即可。)
      • 不需要安装特定的客户端软件,用户操作极其方便。只需要打开浏览器,输入网址即可。
    • 缺点:
      • 速度慢〈不是因为带宽低的问题,是因为所有的数据都是在服务器上,用户发送的每一个请求都是需要服务器全身心的响应数据。所以B/S结构的系统在网络中传送的数据量比较大。)
      • 体验差(界面不是那么酷炫,因为浏览器只支持三个语言HTML、CSS、 JavaScript。在加上速度慢。)
      • 不安全(所有的数据都在服务器上,只要服务器发生火灾。地震等不可抗力,最终数据全部丢失。)

4、C/S和B/S结构的系统哪个好,那个不好?

  • 这个问题问的没有水平。并不是哪个好,哪个不好。不同结构的系统在不同的业务场景下有不同的适用场景。
  • 娱乐性软件建议使用?
    C/S结构
  • 公司内部使用的一些业务软件建议使用?
    B/S结构。
    • 公司内部使用的系统,需要维护成本低。
    • 公司内部使用的系统,不需要很酷炫。
    • 公司内部使用的企业级系统主要是能够进行数据的维护即可。

二、B/S结构的系通信原理【没有涉及到Java小程序】

2.1、通信原理

  • WEB系统的访问过程。

    1. 第一步:打开浏览器
    2. 第二步:找到地址栏
    3. 第三步:输入一个合法的网址。
    4. 第四步:回车
    5. 第五步:在浏览器上会展示响应的结果。
  • 关于域名:

    • 网址:https://www.baidu.com/
    • 域名:www.baidu.com
    • 在浏览器地址栏上输入域名,回车之后,域名解析器会将域名解析出来一个具体的IP地址和端口号等。
      在浏览器地址栏上输入域名,回车之后,域名解析器会将域名解析出来一个具体的IP地址和端口号等。
  • Ip地址是啥?

  1. 计算机在网络当中的一个身份证号。在同一个网络当中,iP地址是唯一的。
  2. A计算机要想和B计算机通信,首先你需要知道B计算机的IP地址,有了IP地址才能建立连接。
  • 端口号是啥?
  1. 一个端口代表一个软件(一个端口代表一个应用。一个端口仅代表一个服务)。
  2. 一个计算机当中有很多软件,每一个软件启动之后都有一个端口号。
  3. 在同一个计算机上,端口号具有唯一性。
  • 一个WEB系统的通信原理?通信步骤
  1. 第一步:用户输入网址(URL)
  2. 第二步;域名解析器进行域名解析;http://110.242.68.3:80/index.html
  3. 第三步;浏览器软件在网络中搜索110.242.68.3这一台主机,直到找到这台主机。
  4. 第四步∶定位110.242.68.3这台主机上的服务器软件,因为是80端口,可以很轻松的定位到80端口对应的服务器软件。
  5. 第五步:80端口对应的服务器软件得知浏览器想要的资源名是:index.html
  6. 第六步:服务器软件找到lindex.html文件,并且将index.html文件中的内容直接输出响应到浏览器上。
  7. 第七步:浏览器接收到来自服务器的代码(HTML CSS 1S)。
  8. 第八步:浏览闇渲染,,执行HTML CSS JS代码,展示效果。

在这里插入图片描述

  • 什么是请求、什么是响应
    • 请求和响应实际上说的是数据的流向不同。
    • 从Browser端发送数据到Server端,我们称为请求。英语单词:request
    • 从Server端向浏览器Browser端发送数据,我们称为响应。英语单词:response。
    • B–>S(请求request)
    • os–>B(响应response)

三、关于WEB服务器软件

3.1、Tomcat服务器

  • 关于Tomcat服务器的目录
  1. bin:这个目录是Tomcat服务器的命令文件存放的目录。比如:启动Tomcat,关闭Tomcat等
  2. conf:这个目录是Tomcat服务器的配置文件存放目录。(server.xml文件中可以配置端口号,默认Tomcat端口是8080)
  3. lib:这个目录是Tomcat服务器的核心程序目录,因为Tomcat服务器是Java语言编写的,这里的jar包里面都是class文件。
  4. logs: Tomcat服务器的日志目录,Tomcat服务器启动等信息都会在这个目录下生成日志文件。
  5. temp: Tomcat服务器的临时目录。存储临时文件。
  6. webapps:这个目录当中就是用来存放大量的webapp (web application:web应用)
  7. work:这个目录是用来存放JSP文件翻译之后的java文件以及编译之后的class文件。

3.2、对于一个动态的web应用来说,一个请求和响应的过程有多少个角色参与,角色和角色之间有多少个协议

在这里插入图片描述

  • 有那些角色【在整个B/S结构的系统中,有哪些人参加的】

    1. 浏览器软件的开发商(谷歌浏览器、火狐浏览器)
    2. WEB开发团队(Tomcat等)
    3. DB Server的开发团队(MySQL等)
    4. webapp的开发团队
  • 角色之间的协议
    在这里插入图片描述

四、使用Ideal工具开发Servlet

1、 准备工作

创建工程

2、编写Servlet【StudentServlet】

public class StudentServlet implements Servlet{

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        //设置响应的内容类型
        response.setContentType("text/html;charset=GBK");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        //连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url = "jdbc:mysql://localhost:3306/xs";
            String user = "root";
            String password = "xuxiaoqiang1234";
            conn = DriverManager.getConnection(url,user,password);
            //获取预编译的数据库操作对象
            String sql = "select * from user";
            ps = conn.prepareStatement(sql);
            //执行SQL
            rs =ps.executeQuery();
            //处理结果集
            while (rs.next()){
                String name = rs.getString("name");
                String age = rs.getString("age");
                out.println(name+","+age+","+"<br>");
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            //释放资源
            if (rs !=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        if (ps !=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

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

    @Override
    public void destroy() {

    }
}

3、连接数据库驱动

放在lib目录下
在这里插入图片描述

4、创建html界面

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>student page</title>
  </head>
  <body>
   <!--这里的项目名是 /xmn,无法动态获取,先写死-->
  <a href="/xmn/servlet/studnet">studnet list</a>
  </body>
</html>

5、在web.xml文件中完成StuentServlet类的注册

<servlet>
        <servlet-name>StudentServelt</servlet-name>
        <servlet-class>com.xs.javaweb.servlet.StudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>StudentServelt</servlet-name>
        <url-pattern>/servlet/studnet</url-pattern>
    </servlet-mapping>

6、配置tomcat

五、Servlet对象的生命周期

5.1、什么是Servlet对象的生命周期

  • Servlet对象什么时候被创建。
  • Servlet对象什么时候被销毁。
  • Servlet对象创建了几个?
  • Servlet对象的生命周期表示:一个Servlet对象从出生在最后的死亡,整个过程是怎样的。

5.2、Servlet对象是由谁来维护的【Servlet02】

  • Servlet对象的创建,对象上方法的调用,对象最终的销毁,Javaweb程序员是无权干预的。
  • Servlet对象的生命周期是由Tomcat服务器【WEB Server】全权负责的。
  • Tomcat服务器通常我们又称为:WEB容器。
  • WEB容器来管理Servlet对象的死活。

5.3、思考:我们自己newSServlet对象受WEB容器的管理吗?

  • 我们自己new的Servlet对象是不受WEB客器管理的。
  • WEB容器创建的Servlet对象,这些Servlet对象都会被放到一个集合当中(HashMap),只有放到这个HashMap集合中的Servlet才能些被WEB容器管理。自己new的Servlet对象不会被WEB容器管理。

5.4、研究:服务器在启动的Servlet对象有没有被创建出来(默认情况下)

  • 在Servlet中提供一个无参数的构造方法,启动服务器的时候看看构造方法是否执行。
  • 经过测试得出结论:默认情况下,服务器在启动的时候Servlet对象并不会被实例化。
  • 这个设计是合理的。用户没有发送请求之前,如果提前创建出来所有的Servlet对象,必然是耗费内存的,并且创建出来的Servlet如果一直没有用户访问,显然这个Servlet对象是—个废物,没必要先创建。
    在这里插入图片描述

5.5、怎么让服务器启动的时候创建Servelt对象

1、在servlet标签中添加 <load-on-startup>整数</load-on-startup>子标签,在该子标签中填写整数,数越小优先级越高
在这里插入图片描述

在这里插入图片描述

5.6、Servlet对象生命周期

1、默认情况下服务器启动发时候AServlet对象并没有被 实例化

2、用户发送第一次请求时,控制台输出一下内容

在这里插入图片描述

3、根据以上输出内容得出结论:

  • 用户在发送第一次请求的时候Serlet对象被实例化(AServlet的构造方法被执行了。并且执行的是无参数构造方法。)
  • AServlet对象被创建出来之后,Tomcat服务器马上调用了AServlet对象的init方法。(inlt方法在执行的时候,AServlet对象已经存在了。已经被创建出来了。)
  • 用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。
  • 用户继续发送第二次请求的时候,控制台输出一下内容:
  • 在这里插入图片描述

4、根据以上输出结果得知,用户在发送第二次,或者第三次,或者第四次请求的时候,Servlet对象并没有新建,还是使用之前创建好的Servlet对象,直接调用该Servlet对象的service方法,这说明:

  • 第一:Servlet对象是单例的(单实例的,但是要注意:Servlet对象是单实例的,但是Servlet类并不符合单例模式。我们称之为假单例。之所以单例是因为Servlet对象的创建我们javaweb程序员管不着,这个对象的创建只能是Tomcat来说了算,Tomcat只创建了一个,所以导致了单例,但是属于假单例。真单例模式,构造方法是私有化的。)
  • 第二:无参数构造方法、init方法只在第一次用户发送请求的时候执行。也就是说无参数构造方法只执行一次。init方法也只被Tomcat服务器调用—次。
  • 第三:只要用户发送一次请求: service方法必然会被Tomcat服务器调用一次。发送100次请求,servlce方法会被调用100次。

5、关闭服务器的时候,控制台输出以下内容:

  • 通过以上输出内容,可以得到以下结论

    1. Servlet的destroy方法只被Tomcat服务器洞用一次。
    2. destroy方法是在什么时候被调用的?
      • 在服务器关闭的时候。
      • 因为服务器关闭的时候要销毁AServlet对象的内存。
      • 服务器在销毁AServlet对象内存之前,Tomcat服务器会自动调用AServlet对象的destroy方法。
  • 请问:destory方法调用的时候,对象摧毁了还是没有被摧毁

    destroy方法执行的时候ASevlet对象还在,没有被销毁。destroy方法执行结束之后,ASerlet对象的内存才会被Tomcat释放。|

6、关于servlet类中的方法的调用次数

  • 构造方法只执行一次。
  • init方法只执行一次。
  • service方法:用户发送一次请求则执行一次,发送N次请求则执行N次。
  • destroy方法只执行一次。

7、当我们Servlet类中编写一个有参数的构造方法,如果没有手动编写无参数构造方法会报500

8、什么时候使用init方法

  • init方法很少用。
  • 通常在init方法当中做初始化操作,并且这个初始化操作只需要执行一次。例如:初始化数据库连接池,初始化线程地…

9、什么时候使用destory方法

  • destroy方法也很少用。
  • 通常在destroy方法当中,进行资源的关闭。马上对象要被销毁了,还有什么没有关闭的,抓紧时间关闭资源。还有什么资源没保存的,抓紧时间保存一下。

六、ServlitConfig【Servlet03-ConfigTestServlet】

  • 什么是ServletConfig?
    • Servlet对象的配置信息对象。
    • ServletConfig对象中封装了在这里插入代码片<servlet></servlet>标签中的配置信息。(web.xml文件中servlet的配置信息)
  • —个Servlet对应—个ServletConfig对象。
  • Servlet对象是Tomcat服务器创建,并且SenvletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建
  • Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。
  • ServletConfig接口的实现类是Tomcat服务器给实现的。(Tomcat服务器说的就是WEB服务器。)

6.1、getServletName()【获取<servlet-name></servlet-name>

 response.setContentType("text/html;charset=GBK");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

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

        //输出该对象
        //ServletConfig对象是org.apache.catalina.core.StandardWrapperFacade@7d7e90b8
        out.print("ServletConfig对象是"+config.toString());
        out.print("<br>");

        //获取<servlet-name></servlet-name>
        //configTest
        String servletName = config.getServletName();
        out.print("<servlet-name>"+servletName+"</servlet-name>");
        out.print("<br>");

6.2、getInitParameterNames()和getInitParameter()方法

通过ServletConfig对象的两个方法,可以获取到web.xml文件中的初始化参数配置信息

1、web.xml信息

  <servlet>
        <servlet-name>configTest</servlet-name>
        <servlet-class>com.xs.javaweb.servlet.ConfigTestServlet</servlet-class>
        <!--这里是可以配置一个Servlet对象的初始化信息的-->
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.cj.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/xs</param-value>
        </init-param>
        <init-param>
            <param-name>user</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>xuxiaoqiang1234</param-value>
        </init-param>
    </servlet>

2、ConfigTestServlet

  Enumeration<String> initParameterNames = config.getInitParameterNames();
        //遍历集合
        while (initParameterNames.hasMoreElements()){
            String parameterName = initParameterNames.nextElement();//取元素
            String initParameter = config.getInitParameter(parameterName);//通过name获取value
            out.print(parameterName+"="+initParameter);
            out.print("<br>");

6.3、ServletConfig接口中有4个方法

  • 第1个方法:
    public String getInitParameter(String name);
  • 第2个方法:
    public Enumeration getInitParameterNames()
  • 第3个方法:
    public Servletcontext getServletContext()
  • 第4个方法:
    public String getservletName()

以上的4个方法,在自己编写的Servlet类当中也可以使用this去调用。(这个Servlet继承了GenericServlet)

七、ServletContext【Servlet04】

7.1、ServletContext是什么?

ServletContext是接口,是Service规范中的一员

7.2、ServletContext是谁实现的?

Tomcat服务器实现了ServletContext接口

7.3、ServletContext对象是谁创建的?在什么时候创建的?

  • ServletContext对象在WEB服务器启动的时候创建。
  • ServletContext对象是WEB服务器创建的。
  • 对于一个webapp来说,ServletContext对象只有一个。
  • ServletContext对象在服务器关闭的时候销毁。

7.4、ServletContext怎么理解?

  • context是什么意思?

      Servlet对象的环境对象。(Servlet对象的上下文对象。)
    
  • ServletContext对象其实对应的就是整个web.xml文件。

  • 50个学生,每个学生都是一个Servlet,这50个学生都在同一个教室当中。那么这个教室就相当于ServletContext对象。

  • 放在Servletcontext对象当中的数据,所有Servlet一定是共享的

      比如:一个教室中的空调是所有学生共享的,一个教室中的语文老师是所有学生共享的。
    
  • Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。

  • 一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。

  • 只要在同一个webapp当中,只要在同一个应用当中,所有的Senvlet对象都是共享同一个ServletContext对象的。

  • ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。

7.5、ServletContext接口中有哪些常用的方法?

1、 getInitParameter(String name)【通过初始化参数的name获取value】、getInitParameterNames()【获取所有的初始化参数的name】

 //获取ServletConfig对象
        ServletContext context = this.getServletContext();
        out.print("ServletContext对象是:"+context+"<br>");
        //获取上下文的初始化参数
        Enumeration<String> initParameterNames = context.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            String value = context.getInitParameter(name);
            out.print(name+"="+value+"<br>");
        }

<!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配器信息-->
 <context-param>
        <param-name>pageSize</param-name>
        <param-value>10</param-value>
    </context-param>
    <context-param>
        <param-name>startIndex</param-name>
        <param-value>0</param-value>
    </context-param>
<!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配器信息会放到以上的标签当中。-->
<!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用servletconfig对象来获取。-->
	<init-param>
         <param-name>driver</param-name>
         <param-value>com.mysql.cj.jdbc.Driver</param-value>
    </init-param>

2、getContextPath()【获取应用上下文的根】

//获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
//在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
 //获取contextpath (获取应用上下文的根)
        String contextPath = context.getContextPath();
        out.print(contextPath+"<br>");
//string contextPath = application.getcontextPath();

3、getRealPath()【获取文件的绝对路径及真实路径】

//获取文件的绝对路径
//D:\wworkspace\javaweb\out\artifacts\servlet04_war_exploded\index.html
        String realPath = context.getRealPath("/index.html");
        out.print(realPath+"<br>");

八、Http协议

8.1、什么是HTTP协议

  • http协议:是W3C制定的一种超文本传输协议
  • 什么是超文本?
    1、超文本说的就是:不是普通文本,比如流媒体:声音、视频、图片等。
    2、HTTP协议支持:不但可以传送普通字符串,同样支持传递声音、视频、图片等流媒体信息。

8.2、 HTTP的请求协议

  • HTTP的请求协议包括:4部分

  • 请求行

    • 包括三部分
      • 第一部分:请求方式

        • get
        • post
        • delete
        • put
        • 。。。。。。
      • 第二部分: URI

        • 什么是URI: 统一资源标识符。代表网络中某个资源的名字,通过URI是不可以定位到该资源的。
        • 什么是URL:统一资源定位符。代表网络中某个资源,同时,通过URL是可以定位到该资源的。
        • URI和URL什么关系,有什么区别?
          • URL包括URI
            http://localhost:8080/servlet05/index.html这是URL
            /servlet05/index.html这是URI
      • 第三部分: HTTP协议版本号

  • 请求头

    • 请求的主机
    • 主机的端口
    • 浏览器信息
    • 平台信息 cookie等信息
  • 空白行

    • 空白行是用来区分“请求头"和"请求体”。
  • 请求体

    • 向服务器发送的具体数据。

8.3、HTTP的响应协议

  • HTTP的响应协议包括:4部分
  • 状态行
  • 响应头
  • 空白行
  • 响应体

在这里插入图片描述

状态行【三部分组成】

  • 第一部分:协议版本号(HTTP/1.1)

  • 第二部分:状态码(HTTP协议中规定的响应状态号。不同的响应结果对应不同的号码。)

    • 200表示请求响应成功,正常结束。
    • 404表示访问的资源不存在,通常是因为要么是你路径写错了,要么是路径写对了,但是服务器中对应的资源并没有启动成功。总之404错误是前端错误。
    • 405表示前端发送的请求方式与后端请求的处理方式不一致时发生:
      • 比如:前端是POST请求,后端的处理方式按照get方式进行处理时,发生405
      • 比如:前端是GET请求,后端的处理方式按照post方式进行处理时,发生405
    • 500表示服务器端的程序出现了异常。一般会认为是服务器端的错误导致的。
    • 以4开始的,一般是浏览器端的错误导致的。
    • 以5开始的,一般是服务器端的错误导致的。
  • 第三部分:状态的描述信息

    • ok表示正常成功结束。
    • not found表示资源找不到。

响应头:

  • 响应的内容类型
  • 响应的内容长度
  • 响应的时间

空白行:

  • 用来分隔“响应头"和“响应体”的。

响应体:

  • 响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染,解释并执行,最终展示出效果。

8.4、Get和Post请求的区别

  • 怎么向服务器发送GET请求,怎么向服务器发送POST请求?

    • 到目前为止,只有一种情况可以发送POST请求,使用form表单,并且form标签中的method属性值为: method=“post”。其他所有情况一律都是get请求:
    • 在浏览器地址栏上直接输入URL,敲回车,属于get请求。
    • 在浏览器上直接点击超链接,属于get请求。
    • 使用form表单提交数据时,form标签中没有写method属性,默认就是get
    • 或者使用form的时候,form标签中method属性值为: method=“get”…
  • GET请求和POST请求有什么区别?

    • get请求发送数据的时候,数据会挂在URI的后面,并且在URI后面添加一个"?“,”?"后面是数据。这样会导致发送的数据回显在浏览器的地址栏上。(get请求在“请求行"上发送数据)

    • post请求发送数据的时候,在请求体当中发送。不会回显到浏览器的地址栏上。也就是说post发送的数据,在浏览器地址栏上看不到。
      (post在“请求体"当中发送数据)

    • get请求只能发送普通的字符串。并且发送的字符串长度有限制,不同的浏览器限制不同。这个没有明确的规范。

    • get请求无法发送大数据量。

    • post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、图片。

    • post请求可以发送大数据量,理论上没有长度限制。

    • get请求在W3C中是这样说的:get请求比较适合从服务器端获取数据。

    • post请求在W3C中是这样说的:post请求比较适合向服务器端传送数据。

    • get请求支持缓存

    • post请求不支持缓存

九、HttpServlet

9.1、HttpServletRequest接口中的常用方法【Request】

怎么获取前端浏览器用户提交的数据

 Map<String ,String[ ]> getParameterMap( )  :这个是获取map

在这里插入图片描述
注意:前端传过来的数字是以字符串的形式提交的,所有后端接收到的是字符串

Enumeration<String> getParameterNames():这个是获取Map集合中所有的key
String[] getParameterValues(String name):根据key获取Map集合的value
String getParameter(String name):获取value这个一维数组当中的第一个元素 

获取前端传过来的值

 //getParameter 获取的是第一个
        String username = request.getParameter("username");
        String userpwd = request.getParameter("userpwd");
        //获取map集合
        String[] interests2 = request.getParameterValues("interest");
        for (String interest : interests2){
            System.out.println("interest = " + interest);
        }

9.2、request域

  • 请求域对象的方法
void setAttribute(String name,Object obj)//向域当中绑定数据

Object getAttribute(String name)//从域中根据name获取

void removeAttribute(String name);//将域中绑定的数据移除

1、向Aservlet存储的东西在Bservlrt中取不到,如果要想得到Aservlet里的 东西,则需要请求转发

2、跳转

  • 转发(一次请求)
 		 //第一步:获取请求转发对象
        //相当于把”/b“这个路径包装到请求转发器当中,实际上是把下一个跳转的资源的路径告知给Bservlrt服务器
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");
        //第二步:调用请求转发RequestDispatcher的
        requestDispatcher.forward(request,response);

		//两步并一步
        request.getRequestDispatcher("/b").forward(request, response);

3、getParametergetAttribute的区别
在这里插入图片描述

9.3、HttpServletQuest接口的其他常用方法

乱码问题


//get请求在请求行上提交数据
//post请求在请求体中提交数据
//设置请求体的字符集(显然这个方法是处理post请求的乱码问题,这种方式不能解决get请求的乱码)
request.setcharEncoding("UTF-8");

//在tomcat9之前,如果前端请求体提交的是中文,后端出现乱码
response,setContentType("text/html;charset=UTF-8");

//get请求乱码问题
//修改CATALINA_HOME/conf/server.xml配置文件
<Connector URIEcoding="UTF-8">

获取客户端的IP地址

String remoteAddr = request.getRemoteAddr();

获取应用的根路径

String contextPath = request.getContextPath();

获取请求方式

String method = request.getMethod()

获取请求uri

String uri = request.getRequestURI();

9.4、在一个web应用中应该如何完成资源的跳转

  • 在一个web应用中通过两种方式,可以完成资源的跳转
    • 第一种方式:转发
    • 第二种方式:重定向
  • 转发和重定向的区别

代码的区别

  • 转发【转发都是一次请求】
  RequestDispatcher requestDispatcher = request.getRequestDispatcher("/b");
 //第二步:调用请求转发RequestDispatcher的
 requestDispatcher.forward(request,response);
 
 //两步并一步
 request.getRequestDispatcher("/b").forward(request, response);
  • 重定向【两次请求】
//浏览器发送请求,请求路径上是需要添加项目名的
response.sendRedirect("/项目名/b")

两者本质区别

  • 转发:是由WEB服务器来控制的,A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的
  • 重定向:是浏览器完成的,具体跳转到那个资源,是浏览器说了算

转发和重定向应该如何选择?什么时候使用转发,什么时候使用重定向?

  • 如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把rgquest域里面的数据取出来,使用转发机
    制。
  • 剩下所有的请求均使用重定向。【重定向使用较多】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值