JavaWeb day02 Servlety映射路径、ServletConfig配置参数、Http协议介绍和查看 、请求数据组成、request、转发跳转、重定向跳转、BeanUtils

本文详细介绍了如何在Servlet中配置多个路径,包括精确匹配和模糊匹配,以及如何通过注解和XML配置ServletConfig参数。此外,还深入解析了HTTP协议,包括其作用、组成部分,以及如何通过开发者工具查看请求数据。重点讲解了request对象的作用,如获取请求数据、请求转发和重定向,以及作用域对象的使用。
摘要由CSDN通过智能技术生成

Servlety映射路径

可以给servlet配置多个路径,包括精确匹配和模糊匹配

/*
*
精确匹配【使用的多】
   配置的url与用户访问的url要一模一样才可以访问到对应的servlet.

模糊匹配使用一个通配符“*”号,代表任意0到多个字符,只有这一个通配符。
通配符匹配使用只有2种方式:
	1.前缀匹配,必须以“/”开头,以“/*”结尾
	  例子,/abc/*,只要用户访问时以/abc/开头都可以匹配到
	2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用
	  例子,*.do,只要用户访问时以.do结尾都可以匹配到
    优先级: 后缀模糊 <  前缀模糊  <  精确匹配
* */
@WebServlet(
        urlPatterns =  {
                //精确匹配路径
                "/Demo1Servlet",
                //模糊匹配路径,
                "/abc/*",   //前缀匹配含义,只要访问以/abc/开头的路径都会匹配
                "*.do",   //后缀匹配含义,只要访问以“.do”结尾都会匹配
        })
public class Demo1Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("hello UrlPatterServlet");
    }
}

1.前缀匹配,必须以“/”开头,以“/”结尾 例子,/abc/,只要用户访问时以/abc/开头都可以匹配到
2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用 例子,*.do,只要用户访问时以.do结尾都可以匹配到

优先级: 后缀模糊 < 前缀模糊 < 精确匹配

在这里插入图片描述

ServletConfig配置参数

在这里插入图片描述
注解方式配置参数数据

@WebServlet(name = "UserServlet", urlPatterns = "/UserServlet",
            initParams = { 
                	@WebInitParam(name = "参数名1",value = "参数值1"),
                	@WebInitParam(name = "参数名2",value = "参数值1"),
            	}
           )

xml实现配置参数数据

<?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">

    <!--配置Demo2Servlet-->
    <servlet>
        <servlet-name>Demo2Servlet</servlet-name>
        <servlet-class>com.itheima.servlet._02ServletConfig读取配置参数.Demo2Servlet</servlet-class>
        <!--给当前Servlet配置参数数据-->
        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>20</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo2Servlet</servlet-name>
        <url-pattern>/Demo2Servlet</url-pattern>
    </servlet-mapping>
</web-app>

读取配置文件

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

        //2.获取私有参数数据中key的名称列表
        Enumeration<String> enumeration = servletConfig.getInitParameterNames();

        //遍历迭代器
        while(enumeration.hasMoreElements()) {
            //获取当前key
            String key = enumeration.nextElement();
            //3.根据key获取对应value
            String value = servletConfig.getInitParameter(key);

            //输出
            System.out.println(key+"="+value);

        }

Http协议介绍和查看

hypertext transaction protocol
超文本传输协议,HTTP是一个简单的请求-响应协议,它通常运行在TCP/IP通信基础之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

http协议作用

规定了浏览器与服务器传输数据的格式

http协议是无状态,不会保存传输的数据, 保存数据需要浏览器客户端与服务器去做。

http协议内容的组成

请求数据部分

响应数据部分

http协议数据查看方式

  1. 使用浏览器开发者工具

  2. 使用专业抓包工具软件(Fillder抓包工具)查看(原生格式数据)

请求数据组成

在这里插入图片描述

注意:

请求数据由4个部分构成:请求行、请求头、空格、请求体
get提交数据,保存在请求行中
post提交数据,保存在请求体中

在这里插入图片描述

请求头相关信息简单介绍
在这里插入图片描述
请求头1—referer描述

用户访问行为说明:访问页面index1.html页面展现, 通过点击页面上的超链接跳转访问页面index2.html
第一次访问资源:index1.html
第二次访问资源:index2.html
第二次访问资源的请求头数据中referer=index1.html, 记录了上一个访问资源的地址

请求头2—if-Modified-Since

客户端浏览器缓存静态资源的最后修改时间,用于发给服务器校验资源是否被修改过。
200, 代表资源从服务器获取并在浏览器上显示,慢,从服务器获取
304, 代表资源从浏览器本地缓存获取再显示, 快,从缓存获取

在这里插入图片描述

注意:

静态资源才会有缓存时间
动态资源不会有缓存时间

请求头3——Connection
在这里插入图片描述

request对象介绍与作用

当浏览器提交请求数据给到服务器,服务器会创建一个对象接收所有请求数据,这个对象就是request

request作用1-获取请求数据

获取请求行数据
在这里插入图片描述
获取请求头数据

在这里插入图片描述

 		//1.获取所有请求头name名称列表
        Enumeration<String> headerNames = request.getHeaderNames();

        //2.遍历迭代每个name
        while (headerNames.hasMoreElements()){

            //3.根据每个请求头name获取对应value并打印
            String name = headerNames.nextElement();
            String value = request.getHeader(name);
            System.out.println(name+":"+value);
        }

获取请求体数据

在这里插入图片描述

	    //1.获取数据
        //用户名
        String name = request.getParameter("name");
        //性别
        String gender = request.getParameter("gender");
        //城市
        String city = request.getParameter("city");
        //爱好
        String[] hobbies = request.getParameterValues("hobby");

注意:

get 默认用的是utf-8 , 中文不会乱码
post 默认的是iso8859-1(欧洲拉丁码表),中文会乱码

解决Post提交中文数据乱码

request.setCharacterEncoding("utf-8"); //注意设置为utf-8 或 utf8 都可以

request作用2-请求转发页面跳转

在这里插入图片描述

@WebServlet("/OneServlet")
public class OneServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*
         * 目标:从当前OneServlet请求转发跳转到TwoServlet
         * 语法: request.getRequestDispatcher("/资源路径").forward(request,response)
         * 注意: 路径中不要写项目路径,格式必须为资源路径,因为转发跳转是服务器端项目内的资源跳转
         *
         * 转发跳转的特点:虽然服务器内部跳转了,但是浏览器访问的地址URL不变
         * */

        request.getRequestDispatcher("/TwoServlet").forward(request,response);
    }
}
@WebServlet("/TwoServlet")
public class TwoServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //输出
        response.getWriter().print("TwoServlet");
    }
}

注意:

request请求转发跳转前后的地址:没有变化

response重定向页面跳转

在这里插入图片描述

@WebServlet("/One2Servlet")
public class One2Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*
         * 目标:从当前OneServlet重定向跳转到TwoServlet
         * 语法: response.sendRedirect("/项目路径(虚拟目录)/资源路径")
         *
         * 重定向跳转的特点:浏览器端进行的跳转,所以URL会发生改变
         * */

        //response.sendRedirect("/day08/Two2Servlet"); 这里不可以将项目路径写死,否则以后更改了还需要手动修改代码
        //动态获取项目路径:request.getContextPath()
        response.sendRedirect(request.getContextPath()+"/Two2Servlet");
    }
}
@WebServlet("/Two2Servlet")
public class Two2Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //输出
        response.getWriter().print("Two2Servlet");
    }
}

注意:

response重定向跳转:url改变了
主要不使用请求域,就使用重定向跳转

在这里插入图片描述

request作用3-作用域对象

在这里插入图片描述

request的生命周期:浏览器发出请求到服务器,服务器会为这一次请求创建request对象,当这一次响应结束后服务器会销毁request对象:所以request对象范围是一次请求内

@WebServlet("/One3Servlet")
public class One3Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*
         * 目标:在当前One3Servlet使用request请求域存储数据,跳转到Two3Servlet获取request中存储的数据
         *
         * 分析:request请求域存储数据只在一次请求内有效,所以One3Servlet跳转到Two3Servlet必须使用转发跳转
         *请求域写入与读取数据语法:
         *      写入语法: request.setAttribute(String str,Object obj);
         *      读取语法: request.getAttribute(String str)
         * */

         //1.向请求域中写入数据key:"username", value:"播仔"
         request.setAttribute("username","播仔");
         //2.转发跳转到Two3Servlet
         request.getRequestDispatcher("/Two3Servlet").forward(request,response);

    }
}
@WebServlet("/Two3Servlet")
public class Two3Servlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
         * 目标:从request请求域读取数据输出
         * */
        response.setContentType("text/html;charset=utf-8"); //设置输出数据解决乱码

        //读取数据
        String username = (String) request.getAttribute("username");
        //输出数据
        response.getWriter().print("username:"+username);
    }
}

BeanUtils封装数据

在这里插入图片描述

在这里插入图片描述

		 //1.解决post提交中文乱码
        request.setCharacterEncoding("utf-8");

        //2.实例java对象User
        User user = new User();

        //3.获取请求数据所有键值对的Map集合
        Map<String, String[]> map = request.getParameterMap();

        try {
            //4.使用BeanUtils进行封装,将map集合的数据封装待java对象User中
            BeanUtils.populate(user,map); //抛出一个编译时异常,注意如果其中自动封装数据的类型不兼容会发生异常
        } catch (Exception e) {
            e.printStackTrace();
            //抛出,通知用户
            throw new RuntimeException(e);
        }

        //5.输出数据
        System.out.println(user);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

halulu.me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值