Servlet 学习笔记3

一、HttpServletRequest类

a)HttpServletRequest类的作用

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

b)HttpServletRequest类的常用方法

getRequestURI();    获取请求的资源路径
getRequestURL();    获取请求的统一资源定位符(绝对路径)
getRemoteHost();    获取客户端的ip地址
getHeader();        获取请求头
getParameter();     获取请求的参数
getParameterValues(); 获取请求的参数(多个值的时候使用)
getMethod();        获取请求的方式
setAttribute();     设置域数据
getAttribute();     获取域数据
getRequestDispatcher(); 获取请求转发对象
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());
        /*在IDEA中,使用localhost访问时,得到的客户端ip地址为 127.0.0.1
        * 如果使用真实的ip地址如 http://192.168.184.1:8088/web04_servlet/request
        * 得到的客户端ip地址为真实ip地址*/
//        getHeader();        获取请求头
        System.out.println("请求头User-Agent:"+req.getHeader("User-Agent"));
        /*Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36*/
//        getMethod();        获取请求的方式
        System.out.println("请求的方式:" + req.getMethod());
    }

运行结果:

URI => /web04_servlet/request
URL => http://192.168.184.1:8088/web04_servlet/request
客户端ip地址:192.168.184.1
请求头User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

获取请求参数:

public class ParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");
        System.out.println("用户名:" + username);
        System.out.println("密码:" + password);
        System.out.println("兴趣爱好:" + Arrays.asList(hobby));
    }
}

运行结果:

用户名:12345
密码:wee
兴趣爱好:[cpp, java, js]

【post请求中文乱码问题】:

在doPost()方法中修改编码集, 注意要在获取请求参数之前调用才有效!

req.setCharacterEncoding("UTF-8");

c)请求转发

请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一个业务需要先在servlet1中执行 再去servlet2
        //查看参数
        String username = req.getParameter("username");
        System.out.println("在servlet1中查看参数:" + username);

        //使用域数据 给材料盖一个章 并传递到servlet2去查看
        req.setAttribute("key","Servlet1 over");

        //问路 servlet2的路
        /*请求转发 必须要以斜杠打头, 斜杠表示地址为http://ip:port/工程名, 映射到idea代码的web目录*/
        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 {
        //查看参数
        String username = req.getParameter("username");
        System.out.println("在servlet2中查看参数:" + username);

        //查看servlet1是否盖章over  key一定要相同!
        Object key = req.getAttribute("key");
        System.out.println("servlet1是否结束:" + key);

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

【请求转发的特点】

1、浏览器地址栏没有变化

2、他们是一次请求

3、他们共享Request域中的数据

4、请求转发可以进入到WEB-INF目录下

5、不可以访问工程以外的资源,只能在自己的工程中跳转

d)base标签的作用

base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。否则会默认以当前浏览器地址栏中的地址为参考。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--base标签设置页面相对路径工作时参照的地址 href为参照的地址值 最后的斜杠不能省略-->
    <base href="http://localhost:8088/web04_servlet/a/b/">
</head>
<body>
    这是a下的b下的c.html页面<br/>
    <a href="../../index.html">跳回首页</a><br/>

</body>
</html>

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

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

/ 斜杠如果被浏览器解析,得到的地址是 http://ip:port/

/ 斜杠如果被服务器解析,得到的地址是 http://ip:port/工程路径

       如:<url-pattern>/forwardc</url-pattern>

            servletContext.getRealPath("/");

            request.getRequestDispatcher("/");

特殊情况:response.sendRediect("/") 请求重定向,把斜杠发送给浏览器解析,得到 http://ip:port/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值