笔记整理来源于尚硅谷,仅供本人复习使用,无其它目的

一、Servlet技术

1.什么是Servlet

在这里插入图片描述

2.手动实现Servlet程序

(1)、编写一个类去实现Servlet接口
(2)、实现service方法,处理请求,并响应数据

package JavaWeb;

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

public class HelloServlet implements Servlet {

    //service方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.Service方法:servlet被访问了");
        //强制转换为子类HttpServletRequest类型,因为只有子类才有.geiMethod()方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //子类调用.geiMethod()方法,获取请求方式
        String method = httpServletRequest.getMethod();
        //判断
        if ("GET".equals(method)){
            doGet();
        }else if ("POST".equals(method)){
            doPost();
        }


    }

    //做GET请求的操作
    public void doGet(){
        System.out.println("请求方式为GET请求!!");
        System.out.println("请求方式为GET请求!!");
        System.out.println("请求方式为GET请求!!");
    }

    //做POST请求的操作
    public void doPost(){
        System.out.println("请求方式为POST请求!!");
        System.out.println("请求方式为POST请求!!");
        System.out.println("请求方式为POST请求!!");
    }

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

    @Override
    public void destroy() {
        System.out.println("4.destroy销毁方法");
    }
}

(3)、到web.xml中去配置servlet程序的访问地址

<!--第一个servlet程序-->
    <!-- 1.servlet标签给Tomcat(服务器)配置Servlet程序 -->
    <servlet>
        <!-- servlet-name标签 Servlet程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class是Servlet程序的全类名-->
        <servlet-class>JavaWeb.HelloServlet</servlet-class>     
    </servlet>
    
        <!-- 2.servlet-mapping标签给servlet程序配置访问地址-->
    	<servlet-mapping>
        <!-- servlet-name标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用 -->
        <servlet-name>HelloServlet</servlet-name>

        <!--url-pattern配置访问地址<br/>
            / 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径(/0706_servlet)  <br/>
            /hello 表示地址为http://ip:port/工程路径/hello  <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

3.URL 定位到 servlet 程序去访问

在这里插入图片描述

4.Servlet的生命周期

(1)、执行Servlet构造器方法

public HelloServlet() {
        System.out.println("1.构造器方法");
    }

(2)、执行init初始化方法

 @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.init初始化方法");
        }

注意:第(1)、(2)步,是在第一次访问的时候创建Servlet程序会调用。
(3)、执行service方法

    //service方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.Service方法:学习JavaWeb的第一天!!");

    }

注意:第(3)步,每次访问都会调用。

(4)、执行destroy销毁方法

  @Override
    public void destroy() {
        System.out.println("4.destroy销毁方法");
    }

注意:第(4)步:在 web 工程停止时候调用。
在这里插入图片描述

5.通过继承HttpServlet实现Servlet程序

一般在实际项目开发中, 都是使用继承HttpServlet类的方式去实现Servlet程序。
(1)、编写一个类去继承HttpServlet 类
(2)、根据业务需要重写doGet或doPost 方法

public class HelloServlet2 extends HttpServlet {

    //重写init方法
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);//必须加上这句,否则无法进入hello2页面,会报404错误,子类重写了父类的init方法,则调用时父类的init方法就会丢失,为了避免丢失则添加super
        System.out.println("重写init方法");

    }


    //get请求调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doGet方法!!");

        ServletConfig servletConfig = getServletConfig();
        System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
        System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));
    }
    //post请求调用
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doPost方法!!");
    }
}

(3)、到web.xml中的配置Servlet程序的访问地址

<!--第二个servlet程序-->
    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>JavaWeb.HelloServlet2</servlet-class>
    </servlet>
   
    <servlet-mapping>

        <servlet-name>HelloServlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

在这里插入图片描述

6.idea创建servlet程序

i
在这里插入图片描述
idea会自动在xml配置文件中创建servlet程序以及在对应的包创建类
在这里插入图片描述
在这里插入图片描述

7.Servlet 类,继承体系

在这里插入图片描述

二、ServletConfig类

1.ServletConfig类介绍

在这里插入图片描述

2.ServletConfig类的三大作用

在这里插入图片描述

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.init初始化方法");

        //1.可以获取Servlet程序的别名servlet -namp的值
        System.out.println("获得HelloServlet程序的别名是:" + servletConfig.getServletName());

        //2.获取初始化参数init-param.

        System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
        System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));

        //3.获取ServletContext对象
        System.out.println("获取ServletContext对象:"+servletConfig.getServletContext());


    }

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

在这里插入图片描述

<!--第一个servlet程序-->
    <!-- servlet标签给Tomcat(服务器)配置Servlet程序 -->
    <servlet>
        <!-- servlet-name标签 Servlet程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class是Servlet程序的全类名-->
        <servlet-class>JavaWeb.HelloServlet</servlet-class>
        
        <!--init-param 是初始化参数(键值对),只能servletConfig对象获取-->
        <!--第一个参数-->
        <init-param>
            <!-- param-name是参数名-->
            <param-name>userName</param-name>
            <!-- param-value是参数值 -->
            <param-value>root</param-value>
        </init-param>
        <!-- 第二个参数-->
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
        
    </servlet>
    
        <!-- servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!-- servlet-name标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用 -->
        <servlet-name>HelloServlet</servlet-name>

        <!--url-pattern配置访问地址<br/>
            / 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径(/0706_servlet)  <br/>
            /hello 表示地址为http://ip:port/工程路径/hello  <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

三、ServletContext类

1.什么是 ServletContext ?

在这里插入图片描述

2.什么是域对象?

(1)域对象,是可以 像Map一样,存取数据的对象,叫做域对象。
(2)这里的域对象 指的是,存取的数据的操作范围
(3)数据存取

在这里插入图片描述

3.ServletContext 常见的 4 个作用

在这里插入图片描述

servlet程序的xml配置
在这里插入图片描述

<!--第四个servlet程序-->
    <servlet>
        <servlet-name>ContextServlet</servlet-name>
        <servlet-class>JavaWeb.ContextServlet</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>ContextServlet</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>

测试代码

public class ContextServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1,获取web.xmL中配置的上下文参数context-param
        ServletContext context = getServletConfig().getServletContext();
        System.out.println("上下文参数context-param参数gougege的值是:"+ context.getInitParameter("gougege"));
        System.out.println("上下文参数context-param参数gou的值是:"+ context.getInitParameter("gou"));

        //2,获取当前的工程路径,格式: /工程路径
        System.out.println("当前工程路径:"+context.getContextPath());

        //3,获取工程部署后在服务器硬盘上的绝对路径
        /*
             /   斜杠被服务器解析地址为:http://ip:port/工程名/   映射到IDEA代码的web目录<br/>

         */
        System.out.println("工程部署后在服务器硬盘上的绝对路径"+context.getRealPath("/"));



    }
}

在这里插入图片描述

四、Http协议

1.什么是HTTP协议

(1)什么是协议?
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。

(2)HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。

(3)HTTP协议中的数据又叫报文。

2.请求的HTTP协议格式

(1) 客户端给服务器发送数据叫请求。

(2) GET请求
在这里插入图片描述
(3)POST请求
在这里插入图片描述

(4)常用请求头的说明
在这里插入图片描述

(5) 哪些是GET请求,哪些是POST请求
在这里插入图片描述

3.响应的HTTP协议格式

(1) 服务器给客户端回传数据叫响应。
在这里插入图片描述

(2) 常用的响应码说明
在这里插入图片描述

五、HttpServletRequest类

1.HttpServletRequest类的作用

每次只要有请求进入Tomcat 服务器,Tomcat 服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。

2.HttpServletRequest类的常用方法

在这里插入图片描述

测试代码

public class RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //①getRequestURI()  获取请求的资源路径
        System.out.println("URI->:"+req.getRequestURI());

        //②getRequestURL()  获取请求的统一-资源定位符(绝对路径)
        System.out.println("URL->:"+req.getRequestURL());

        //③getRemoteHost()  获取客户端的ip地址
        System.out.println("ip->:"+req.getRemoteHost());

        //④getHeader()      获取请求头:如浏览器信息UserUser-Agent
        System.out.println("请求头User-Agent->:"+req.getHeader("User-Agent"));

        //⑤getMethod()   获取请求的方式GET或POST
        System.out.println("请求方式->:"+req.getMethod());

    }
}

测试结果
在这里插入图片描述

3.获取请求的参数值

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        System.out.println("--------post请求---------");
        //获取用户名
        String username = req.getParameter("username");
        System.out.println("用户名:"+username);

        //获取密码
        String password = req.getParameter("password");
        System.out.println("密码:"+password);

        //获取兴趣爱好
        String[] hobby = req.getParameterValues("hobby");
        System.out.println("兴趣爱好:"+ Arrays.asList(hobby));

    }

在这里插入图片描述

在这里插入图片描述

注意:解决post请求的乱码: req.setCharacterEncoding("UTF-8");

4.请求转发

在这里插入图片描述
柜台一

public class Servlet1 extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的参数(办事的材料)
        System.out.println("Servlet1(柜台一)查看参数(材料):" + req.getParameter("username"));

        //给servlet1盖章,带到servlet2查看(共享)

        req.setAttribute("key", "柜台一(servlet1)的章");

        //问路去哪:柜台二怎么走(获得请求地址)
         /*
        请求转发必须要以斜杠打头,/斜杠表示地址为: http://ip:port/工程名/,映射到IDEA代码的web目录<br/>
         */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //跳转(重定向)到servlet2(柜台二)
        requestDispatcher.forward(req, resp);
    }
    


}

柜台二


public class Servlet2 extends HttpServlet {



    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求的参数(办事的材料)
        System.out.println("Servlet2(柜台二)查看参数(材料):"+request.getParameter("username"));

        //查看servlet1盖的章(共享)
        System.out.println("柜台一是否有章:"+request.getAttribute("key"));


        //处理业务
        System.out.println("servlet2(柜台二)处理自己的业务!!!");
    }
}

例如访问如下ip在这里插入图片描述
在这里插入图片描述

5.base标签

base 标签,可以设置当前页面中,所有相对路径工作时,参照哪个路径进行跳转
在这里插入图片描述

六、HttpServletResponse类

1.HttpServletResponse类的作用

在这里插入图片描述

2.字节流和字符流

在这里插入图片描述
在这里插入图片描述
(4)响应乱码

//修改了服务器的字符集
resp.setCharacterEncoding("UTF-8");
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
        resp.setContentType("text/html;charset=UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
 resp.setHeader("Content-Type","text/html;charset=UTF-8");

3.请求重定向

在这里插入图片描述

(1)第一种方式


        //设置响应状态码为302,表示重定向
        resp.setStatus(302);

        //设置响应头,设置新的的地址
        resp.setHeader("Location","http://localhost:8080/0713_Response/response2");

(2)第二种方式

   resp.sendRedirect("http://localhost:8080/0713_Response/response2");

访问网址:http://localhost:8080/0713_Response/response1
会跳转到 : http://localhost:8080/0713_Response/response2

七、Cookie

1.什么是Cookie?

(1).Cookie是服务器通知喜户端保存键值对的一种技术.
(2).客户端有了Cooke后,每次请求都发送给服务器。
(3).每个Cookie的大小不能超过4kb
(4).Cookie是服务器中Servlet程序创建并通过response返回给客户端浏览的的键值对信息。

2.Cookie的创建

(1) 创建Cookie对象

Cookie cookie = new Cookie("key", "value");

(2) 通知客户端保存Cookie

response.addCookie(cookie);

第一次访问没有cookie
在这里插入图片描述
下一次访问有cookie
在这里插入图片描述

3.Cookie值的修改

(1)第一种方式
在这里插入图片描述

(2)第二种方式
在这里插入图片描述

注意:对于Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引景、斜杠、问号、at符号、冒号和分号。空值在所有浏览器上的行为不一定相同。

4.查找指定的cookie

在这里插入图片描述

5.Cookie生命控制

在这里插入图片描述

6.Cookie有效路径Path的设置

(1)Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发
(2)path属性是通过请求的地址来进行有效的过滤。

eg:
CookieA 的 path=/工程路径
CookieB 的 path=/工程路径/abc

请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发送

http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送

在这里插入图片描述

7.免用户名登陆

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

在这里插入图片描述

八、Session会话

1.什么是Session?

(1)Session就是一个接口HttpSession。
(2)在web中Session就一会话,维护一个客户端和服务器之间关联的一种技术。
(3)每个客户端都有自己的Session会话,用来保存用户登陆之后的信息。

2.Session和Cookie有什么区别?

Cookie是保存在客户端的,Session是保存在服务器端的

3.如何创建Session和获取(id号,是否为新)

(1)Session的创建与获取

Session的获取和创建的API是一样的

request.getSession()

第一次调用是创建Session会话,之后调用都是获取创建好的Session会话对象。

isNew():判断到底是不是刚创建出来的(新的)

true表示刚创建
false表示获取之前创建

每个会话都有一个身份证号,ID值(唯一),可以通过getId()获取Session的id值
在这里插入图片描述

在这里插入图片描述

4.获取session域中数据内容

//设置域数据
request.getSession().setAttribute("key1", "value1");
//获取域数据
request.getSession().setAttribute("key1", "value1");

在这里插入图片描述

5.Session生命周期控制

(1)设置Session的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
public void setMaxlnactielnterval(int interal)

值为,正数的时候,设定Session的超时时长。
负数表示永不超时( 极少使用)

(2)获取Session的超时时间
public int getMaxInactivelnteral()
(3)当前Session默认的超时时长是多少!

public void invalidate()

Session默认的超时时间长为30分钟。
因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为: 30 分钟。

<session-config>
<session-timeout> 30</session-timeout>
</session-config>

(4)web.xml配置文件中修改web工程所有seession的默认超时时长
在这里插入图片描述
(5)session的超时指的是,客户端两次请求的最大间隔时长。
在这里插入图片描述
在这里插入图片描述
(6)Session马上销毁
在这里插入图片描述

6.浏览器和Session之间关联的技术内幕

在这里插入图片描述
总结Session技术,底层其实是基于Cookie技术来实现的。客户端在没有Cookie的情况下访问服务器,服务器创建session,并将session存储进内存,同时将sessionId信息通过cookie发送给浏览器,浏览器收到cookies后,当携带当前cookie信息再次访问服务器时,服务器就会从内存中取出对应的session数据。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐