Servlet学习总结

1.Servlet技术

1)什么是Servlet:

  1. 是JaveEE的规范之一,规范就是接口
  2. 是JavaWeb三大组件之一,三大组件分别是:Servlet程序,Fliter过滤器,Listenter监听器
  3. 是运行在服务器上的一个java小程序,可以接收客户端发来的请求,并相应数据给客户端

2)实现Servlet程序

   1.编写一个类实现Servlet接口,实现service方法

package com.atguigu;

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

public class HelloServlet01 implements Servlet {

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

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet");
    }

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

    @Override
    public void destroy() {

    }
}

  2.到web.xml 中去配置servlet程序的访问地址

    <servlet>
<!--        servlet-name给Servlet程序起别名-->
        <servlet-name>HelloServlet</servlet-name>
<!--        servlet-class  Servlet程序的全类名-->
        <servlet-class>com.atguigu.HelloServlet01</servlet-class>
    </servlet>

    <servlet-mapping>
<!--        servlet-name告诉服务器再给哪个servlet程序配置地址-->
        <servlet-name>HelloServlet</servlet-name>
<!--        url-pattern
            /hello 即为:http:localhost:8080/servlet01/hello-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

3.运行服务器 即调用service方法 

3)Servlet 的生命周期

  1.  执行Servlet构造器方法
  2. 执行init初始化方法
  3. 执行service方法
  4. 执行destory销毁方法

第1,2步只在构造Servlet程序时才会调用

第3步每次访问都会调用

第4步只在结束服务器时调用

 4)servlet程序区分get请求和post请求

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service方法");
        //类型转换:ServletRequest没有getMethod方法而HttpServletRequest有
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求的方式
        String method = httpServletRequest.getMethod();

        if ("GET".equals(method)){
            System.out.println("GET请求");
        }else if("POST".equals(method)){
            System.out.println("POST请求");
        }
    }

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

  1. 编写一个类去继承
  2. 根据业务重写doPost() 和doGet()
  3. 到web.xml中去配置Servlet程序的访问地址
public class HelloServlet02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet02的doPost方法");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet02的doGet方法");
    }
}

6)使用IDEA创造Servlet程序

7)Servlet类的继承体系 

2.ServletConfig类

ServletConfig从名称上看是Servlet程序的配置信息类。

servlet程序和ServletConfig对象都是有Tomcat负责创建,我们负责使用

servlet程序默认是第一次访问的时候创建,ServletConfig对象是每个Servlet程序创建时,创建一个对应的ServletConfig对象

1)ServletConfig类的三大作用

  1. 可以获取Servlet程序的别名servlet-name的值
  2. 获得初始化参数init-param(该参数只属于该Servlet程序)
  3. 获取ServletContext对象
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 初始化方法");

        System.out.println("1.Servlet程序别名为:"+servletConfig.getServletName());
        System.out.println("2.初始化参数username的值是"+servletConfig.getInitParameter("username"));
        System.out.println(servletConfig.getServletContext());
    }
    <servlet>
<!--        servlet-name给Servlet程序起别名-->
        <servlet-name>HelloServlet</servlet-name>
<!--        servlet-class  Servlet程序的全类名-->
        <servlet-class>com.atguigu.HelloServlet01</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
    </servlet>

2)ServletConfig对象在其他方法中的使用

//在init(ServletConfig servletConfig)方法中直接使用


//其他方法中需要先创建对象
ServletConfig servletConfig = getServletConfig();


//如果重写了init()方法,需要调用父类的init()方法保存ServletConfig对象

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写init方法");
    }

3.ServletContext类

1)什么是ServletContext?

  1. 是一个接口,表示Servlet上下文对象
  2. 一个Web工程,只有一个ServletContext对象实例
  3. ServletContext对象是一个域对象
  4. 工程部署时启动,在结束时销毁

域对象:是可以像Map一样存取数据的对象,叫做域对象

存数据取数据删除数据
Mapput()get()remove()
域对象setAtribute()getAtribute()removeAtribute()

2)作用

  1. 获取Web.xml中配置的上下文参数context.param(该参数属于整个工程)
  2. 获取当前工程路径,格式:/工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像Map一样存取数据
    <context-param>
        <param-name>user</param-name>
        <param-value>context</param-value>
    </context-param>
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletConfig().getServletContext();
        //作用1
        String username = servletContext.getInitParameter("username");
        String password = servletContext.getInitParameter("password");
        System.out.println(username+":"+password);
        //作用2 :  获取 /工程路径
        System.out.println("当前工程路径为"+servletContext.getContextPath());
        //作用3
        System.out.println("工程部署的路径:"+servletContext.getRealPath("/"));
        System.out.println("工程下的css目录的绝对路径"+servletContext.getRealPath("/css"));

        //作用4
        ServletContext servletContext1 = getServletContext();

        servletContext1.setAttribute("key1","value1");
        System.out.println("ContextServlet的key的值为"+servletContext1.getAttribute("key1"));
    
}

4.Http协议

1)什么是HTTP协议

        客户端和服务器之间通信时,发送的数据,需要遵守的规定叫做HTTP协议,HTTP协议中的数据又叫报文。

2)请求的HTTP协议格式

1.GET请求

1.请求行

  1. 请求的方式
  2. 请求的资源路径
  3. 请求的协议的版本号

2.请求头

      key:value  组成

get请求http协议的内容:

2.POST请求

1.请求行

2.请求头

3.请求体  =====> 发送给服务器的数据

3.常用请求头说明

  1. Accept: 表示客户端可以接收的数据类型
  2. Accept-Language: 表示客户端可以接收的语言类型
  3. User-Agent: 表示客户端浏览器的信息
  4. Host: 表示请求时的服务器的ip和端口号

4.哪些是get哪些是post请求

GET请求:

  1. form 标签 method=get
  2. a标签
  3. link标签引入css
  4. Script标签引入js文件
  5. img标签引入图片
  6. iframe引入html页面
  7. 在浏览器地址栏中输入地址后回敲回车

POST请求:

      form标签method= post

3).响应的HTTP协议格式

1.响应行

  1. 响应的协议和版本号
  2. 响应状态码
  3. 响应状态描述符

2.响应头

        key:value

3.响应体       ------->>>>回传给客户端的数据

 4)常用的响应码说明

200        表示请求成功

302        表示请求重定向

404        表示请求服务器已经收到了,但是你要的数据不存在

500        表示服务器已经收到请求,但服务器内错误(代码错误)

5)MIME类型说明

MIME是HTTP协议中的数据类型

谷歌浏览器查看内容:

 5.HttpServletRequest类

a)作用:

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

b)常用方法:

  1. getRequestURI()        获取请求的资源路径
  2. getRequestURL()       获取请求的统一资源定位符(绝对路径)
  3. getRemoteHost()        获取客户端的IP地址
  4. getHeader()                获取请求头
  5. getParameter()           获取请求的参数
  6. getParameterValues()获取请求的参数(多个参数时)
  7. getMethod()                获取请求的方式
  8. getAttribute()               获取域数据
  9. setAttribute(key,value)设置域数据
  10. getRequestDispatcher() 获取请求转发  对象
public class HttpservletRequest01 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() 获取请求头
        System.out.println("请求头 ===>" + req.getHeader("User-Agent"));
//        getMethod()获取请求的方式
        System.out.println("请求方式 ===>" + req.getMethod());
    }
}

c)获取请求参数

<body>
  <form action="http://localhost:8080//servlet02//para" method="get">
     用户名:<input type="text" name="username"><br>
     密码:<input type="password" name="password"><br>
     兴趣爱好:<input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="c++">c++
    <input type="checkbox" name="hobby" value="Go">Go<br>
    <input type="submit" value="提交">
  </form>
</body>
public class ParamServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("用户名:"+req.getParameter("username"));
        System.out.println("密码:"+req.getParameter("password"));
        System.out.println("爱好:"+ Arrays.asList(req.getParameterValues("hobby")));
    }
}

d)解决POST请求中文乱码问题

//设置字符集为UTF-8
//必须在获取请求参数之前调用
 req.setCharacterEncoding("UTF-8");

e)请求的转发

服务器接收到请求后,从一个资源跳到另一个资源

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查看请求
        System.out.println("在Servlet1中查看请求username:"+ req.getParameter("username"));

        //Servlet1盖章,并在Servlet2中查看
        req.setAttribute("key","Servlet1的章");

        //得到Servlet2的路径
        /**
         *   必须以'/' 打头,代表的是 http://ip:port/工程名,映射到IDEA工程的webqpp目录下
         */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //转向Servlet2
        requestDispatcher.forward(req,resp);
    }
}
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查看请求
        System.out.println("在Servlet2中查看请求username:"+ req.getParameter("username"));

        //查看Servlet1是否盖章
        System.out.println("Servlet1的章:"+req.getAttribute("key"));

        //处理自己的业务
        System.out.println("Servlet2处理业务");
    }
}

f)base标签的作用

base标签设置页面相对路径工作时参照的地址

 g)Web中的相对路径和绝对路径

相对路径是:

        .     ===>   表示当前目录

        ..    ===>   表示上一级目录

        资源名   ===>   表示当前目录/资源名

绝对路径:

        http://ip:port/工程路径/资源路径

h)Web中  /  斜杠的不同意义

在web中  /  斜杠是一种绝对路径

1.被浏览器解析:得到的地址是:http:/ip:port/

<a href="/">斜杠<a>

2.被服务器解析:得到的地址是:http://ip:port/工程路径

 

6.HttpServletResponse类

a)HttpServletResponse类的作用

        HttpServletResponse类和HttpServletRequest一样,每次请求过来,Tomcat服务器都会创建一个Response对象传递给Servlet服务器去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse类表示所有响应的信息。

        通过对HttpServletResponse对象的设置来设置返回给客户端的信息

b)两个输出流的说明

        字节流                getOutputStream();                常用于下载(传递二进制数据)

        字符流                getWriter();                             常用于回传字符串(常用)

两个流只能使用一个

c)如何往客户端回传数据

public class ResponseIOStream extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("HelloWorld");
    }
}

d)解决响应的中文乱码问题

public class ResponseIOStream extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方法1
        System.out.println(resp.getCharacterEncoding());  //默认字符集为ISO-8859-1

        //设置服务器字符集为UTF-8
        resp.setCharacterEncoding("UTF-8");

        //通过响应头,可设置浏览器字符集为UTF-8
        resp.setHeader("Content-type","text/html;charset=UTF-8");
        PrintWriter writer2 = resp.getWriter();
        writer2.write("你好世界");
    }
}
public class ResponseIOStream extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方法2
        //同时设置浏览器和客户端都使用UTF-8字符集,还设置了响应头
        //此方法一定得在获取流对象之前调用才有效
        resp.setContentType("text/html;charset=UTF-8");

        PrintWriter writer2 = resp.getWriter();
        writer2.write("你好世界");
    }
}

e)请求重定向

请求重定向的第一种方法: 

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("this is response1");
        //设置响应状态码302,表示重定向。
        response.setStatus(302);
        //设置响应头说明新的地址在哪里
        response.setHeader("Location","http://localhost:8080/servlet02/rep2");
    }
}

请求重定向的第二种方法(推荐):

resp.sendRedirect("http://localhost:8080/servlet02/rep2")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值