JavaWeb

什么是Servelt

  • 从广义上来讲,Servlet规范是sun公司制定的一套技术标准,包含与web应用相关的一系列接口,是 web应用实现方式的宏观解决方案。而具体的servlet容器负责提供标准的实现。
  • 从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了servlet接口的实现类。
  • servlet作为服务器端的一个组件,它的本意是“服务器端的小程序”。servlet的实例对象由Servlet容器负责创建;servlet的方法由容器在特定情况下调用; Servlet容器会在 web 应用卸载时销毁servlet对象的实例。

servlet的作用:

​ 1、接收请求

​ 2、处理请求

​ 3、完成响应

Servlet

HelloWorld

编写Servlet的三步

  1. 创建自己的HelloServlet,实现Servlet接口
  2. 实现service方法
  3. 在web.xml中配置servlet信息

测试:运行项目,在浏览器中访问配置的url

代码
1、创建HelloServlet,并实现Servlet接口,实现service方法
public class MyFirstServlet  implements Servlet {


    //初始化
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    //获取servlet配置信息
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    //服务
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //servlet是用来处理来自客户端的请求
        System.out.println("我是第一个servlet");
        //ServletResponse servletResponse 他能给浏览器发送一个响应
        //获取一个写数据的对象
        PrintWriter writer = servletResponse.getWriter();
        writer.write("HelloWorld");
    }
    //获取servelt信息
    @Override
    public String getServletInfo() {
        return "abcdwe";
    }

    //销毁
    @Override
    public void destroy() {
    }
}

image-20210802103544994

servlet的执行流程(响应客户端发来的请求)

image-20210802104239781

url统一资源定位符

 url:统一资源定位符
             静态资源:实际的文件.html .css .pong
             动态资源:我们请求动态资源是启动一段程序来处理
  动态资源
 比如这个   <url-pattern>/helloWorld</url-pattern> 里面的helloWorld,在文件中没有这个静态资源	

     <servlet>
        <!--    配置servlet的名字,相当于给servlet类起别名    给程序员看的-->
        <servlet-name>MyFirstServlet</servlet-name>
        <!--    配置servlet的全类名   给服务器看的,服务器是通过全类名进行查找的-->
        <servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
    </servlet>

    <!--  servlet映射信息-->
    <servlet-mapping>
        <!--    刚才配置servlet的别名-->
        <servlet-name>MyFirstServlet</servlet-name>
        <!--    这个servlet用来处理哪个请求    http://localhost:8080/08.Servlet/helloWorld-->
        <!--   表示访问当前项目下的/helloWorld     -->
        <url-pattern>/helloWorld</url-pattern>
    </servlet-mapping>

Servlet的生命周期

Servlet的生命周期

Servlet是跑在Tomcat服务器上的

Tomcat服务器----->Servlet容器

生命周期:从出生到死亡的过程

Servlet的生命周期:Servlet从创建到销毁的过程

当我们第一次访问HelloServlet时

1)、创建了一个Servlet对象

2)、调用Init方法

3)、调用service的方法

以后请求

4)、只调用service方法来处理请求

项目从服务器上卸掉的时候

5)、会调用destroy方法

destroy()servlet销毁方法,清理善后工作
image-20210802162044040

image-20210802162055646

ServletConfig

ServletConfig的基本介绍:ServletConfig是封装了servlet配置信息的对象,一个servlet对象对应一个ServletConfig,封装当前servlet的配置信息

ServletConfig功能

  1. 获取servlet的别名:getServletName();

  2. 获取servlet的初始化参数

  3. 获取ServletContext对象。代表当前servlet的上下文。代表web项目信息

    <servlet>
        <servlet-name>ConfigServlet</servlet-name>
        <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
     //init-param这个就是servlet的初始化参数   
        <init-param>
            <param-name>username</param-name>
            <param-value>pzx</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ConfigServlet</servlet-name>
        <url-pattern>/ConfigServlet</url-pattern>
    </servlet-mapping>
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            /**
             * ServletConfig功能
             *      1、获取servlet的别名:getServletName();
             *      2、获取servlet的初始化参数
             */
    
           System.out.println(config.getServletName());
           System.out.println(config.getInitParameter("username"));
           System.out.println(config.getInitParameter("username"));
           //3、获取ServletContext对象。代表当前servlet的上下文。代表web项目信息
            ServletContext context = config.getServletContext();
            System.out.println(context);
    
    
        }
    

    image-20210802202826119

ServletContext

虚拟路径&真实路径对应

image-20210803084307920

研究servletContext对象

1、是什么?代表?一个web应用代=代表一个ServletContext。就代表整个web应用

2、功能?

​ 1)、可以获取web项目的配置信息,获取web项目的初始化参数。

 		ServletContext servletContext = config.getServletContext();
		String user = servletContext.getInitParameter("user");
        String username = servletContext.getInitParameter("username");
        System.out.println(user);
        System.out.println(username);

​ 2)、获取web项目的路径

        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath);

​ 3)、获取资源的真实路径

String realPath = servletContext.getRealPath("/index.jsp");
        System.out.println(realPath);

​ 4)、可以作为最大域对象共享数据 域对象:共享数据.4大域对象,application域对象

HttpServlet

HttpServlet原理图片

image-20210803104457057

说明:HttpServletRequest request代表浏览器封装请求信息的对象,一个请求对应一个响应

HttpServletResponse response代表就是要发送浏览器的响应对象,封装我们的响应信息

response.sendRedirect:这个是响应的重定向

        //1、可以给浏览器响应字符串
//        PrintWriter writer = response.getWriter();
//        writer.write("Hello HttpServlet.....................");
        //2、可以重定向到一个页面或者其他资,重定向就是服务器告诉浏览器请求别的资源
        //我的处理代码.....已经对之前的request响应完了。
        response.sendRedirect("success.html");

HttpServletRequest

说明:HttpServletRequest request 代表随着浏览器发送给服务器的请求信息

http请求包括:请求首行 请求头 空行 请求体(封装请求数据-post)。

get请求和post请求的的

获取请求参数 get放在url后面 post放在请求体里。

request来获取参数

request来获取单个参数

String username = request.getParameter("username");  这里面的参数是name值

request来获取多个参数:也就是些多选框中的内容,然后在使用增强for循环进行输出

String[] aihaos = request.getParameterValues("aihao");

请求转发和响应重定向的注意事项:写完转发之后,不能再写重定向,或者写完重定向之后不能再写请求转发,这是因为,一次请求对应一次响应。(也就是说,一次请求不能有两次响应)

重定向就是告诉浏览器重新请求新的资源。

转发:服务器处理完成之后转交到另外的资源。当我们转发的页面是一个页面(静态资源),服务器会给浏览器返回这个资源,当转交给下一个servlet,servlet可以继续处理(当然重定向也可以)

请求重定向:

  • 第一个Servlet接收到了浏览器端的请求,进行了一定的处理,然后给浏览器一个特殊的响应消息,这个特殊的响应消息会通知浏览器去访问另外一个资源,这个动作是服务器和浏览器自动完成的,但是在浏览器地址栏里面能够看到地址的改变,会变成下一个资源的地址。

  • 对浏览器来说,一共发送两个请求,所以用户是能够感知到变化的。

  • 在重定向的情况下,不能共享Request对象中保存的数据。

转发和重定向的区别

转发重定向
浏览器地址栏不会发生改变会改变
Request同一个请求两次请求
APIRequest对象Response对象
位置服务器内部完成浏览器完成
WEB-INF可以访问不能访问
共享请求域数据可以共享不能共享
目标资源必须是当前web应用中的资源不局限于当前web应用

请求转发和响应重定向的示意图

image-20210804095640362

image-20210804095726142

请求转发和响应的重定向的代码实现

请求转发

public class MyServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //HttpServletRequest request  代表随着浏览器发送给服务器的请求信息
            //http请求。请求首行  请求头  空行  请求体(封装请求数据-post)
        //get请求将所要携带的参数放在url
        //1、获取请求参数  get放在url后面 post放在请求体里。
        String username = request.getParameter("username");
        System.out.println(username);
//        String aihao = request.getParameter("aihao");
//        System.out.println(aihao);
        //使用getParameterValues来获取多选框选中的内容
        String[] aihaos = request.getParameterValues("aihao");
        if (aihaos!=null){
            for (String str : aihaos
            ) {
                System.out.println(str);

            }
        }

        //2、获取请求头的相关信息
        String accept = request.getHeader("Accept");
        System.out.println(accept);
        String header = request.getHeader("User-Agent");
        System.out.println(header);
        //3、转发一个页面/资源
        //先获取一个请求转发器
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/haha.html");
        //将请求转发出去
        requestDispatcher.forward(request,response);
        //4、作为域对象共享数据 4个  application  request

    }
}

响应的重定向

public class MyServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //写代码
        //经过MyServlet3处理之后,获取请求头信息。在控制台打印
        String header = request.getHeader("User-Agent");
        System.out.println("用户的浏览器信息"+header);
        //返回success.html页面,只能响应一个
        //1、重定向到页面  就是告诉浏览器重新请求新的资源
        //http:localhost:8080/success.html
        response.sendRedirect("http://www.baidu.com");

        //2、转发到页面
        //转发:服务器处理完成之后转交到另外的资源。当我们转发的页面是一个页面
        //(静态资源),服务器会给浏览器返回这个资源
        //当转交给下一个servlet,servlet可以继续处理
        //这个先获取转发器,然后再进行转发
//        RequestDispatcher requestDispatcher = request.getRequestDispatcher("http://www.baidu.com");
//        requestDispatcher.forward(request,response);


    }
    }

Cookie&Session

cookie:服务器发送给浏览器要保存的数据浏览器保存相关的数据

HTTP是无状态协议;

​ 无状态:服务器无法辨析每次请求来自谁?

​ 如果客户端来的时候能带上类似会员卡的东西,记录卡号

服务器发给浏览器的"会员卡";

服务器让浏览器去保存一份数据,以后访问的时候,带上相应的数据

服务器发给浏览器

Filter

filter的基本介绍

web服务器的三大组件。Servlet,Flter,Listener

A filter is an object that performs filtering tosks on either the request to a resource (a servlet or static content),or on the response from a resource, or both.(

filter是用来执行过滤任务的一个对象,作用于:

1、请求一个资源(动态资源,JSP,静态资源)

2、来自一个资源的响应

3、两个都可以)

filter用来过滤请求和响应

1)、filter可以拦截请求(request),可以修改请求头,和请求内容

2)、filter可以拦截服务端的响应(response),可以修改响应头和响应内容

3)、放行请求 (当调用chain.doFilter();时候)

filter的执行顺序

image-20210804213547877

filter-urlpatter配置

url-patten (servlet也可以使用)
1、精确匹配
要写拦截的资源的详细路径 /hello.jsp /page/a.jsp
2、路径匹配:/路径名/* 代表所有
拦截所有访问(路径名下的资源) /
代表拦截所有
3、后缀匹配:*.后缀名
所有以指定后缀结尾的,都拦截

注意:/pics/*.jsp;不能

<filter-mapping>
    <!--   指定filter     -->
    <filter-name>HelloFilter</filter-name>
    <!--  过滤哪些请求    -->
    <url-pattern>/hello.jsp</url-pattern>
</filter-mapping>

filter放行之前写出现中文乱码的原因

现象:

1、在请求放行之前,使用response输出内容,内容追加到了页面上,但是页面的中文都出现了乱码

2、放行之前只要写中文就会出现乱码,带着页面出现乱码

3、放行之后写,完全没有问题

根本原因都是在放行请求之前操作,或者直接操作(没放行请求直接响应)

出现乱码的原理图

image-20210805165658045

filterConfig

主要用的就是下面那几个方法

    public void init(FilterConfig config) throws ServletException {
        //FilterConfig是封装filter配置信息的对象
        String filterName = config.getFilterName();
        String wangba = config.getInitParameter("wangba");
        //servletContext--->对应我门的web应用(一个web应用对应一个servletContext)
        ServletContext servletContext = config.getServletContext();
        System.out.println(servletContext);
        //获取为web初始化参数
        String user = servletContext.getInitParameter("user");
        System.out.println("filter别名"+filterName);
        System.out.println("filter的初始化参数"+wangba);
        System.out.println("获取servletContext:" + servletContext);
        System.out.println("通过servletContext对象获取全局初始化参数"+user);
        
    }

filter链

多filter的执行顺序

image-20210805202447340

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值