Servlet学习2

HttpServletRequest类

简介

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

常用方法

直接代码吧

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取资源路径
        System.out.println(request.getRequestURI());
        //获取请求的统一资源定位符(绝对路径)
        System.out.println(request.getRequestURL());
        //获取客户端ip地址
        /*
        localhost:127.0.0.1访问得到的客户端ip地址是127.0.0.1
        使用真是ip地址访问得到的客户端ip地址就是真是的客户端ip地址
         */
        System.out.println(request.getRemoteHost());
        //获取请求头
        System.out.println(request.getHeader("User-Agent"));
        //请求的方式
        System.out.println(request.getMethod());
    }

获取请求参数

get和post乱码解决

表单代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/servlet_war/parameter" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    兴趣爱好:<input type="checkbox" name="hobby" value="c++">C++
    <input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="c">C
    <input type="submit">
</form>

</body>
</html>

servlet

package com.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

public class parameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET");
        String  username=req.getParameter("username");
        String password=req.getParameter("password");
        //多个值用getParameterValues方法
        String[] hobby=req.getParameterValues("hobby");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.asList(hobby));
        //get乱码问题
        //1 先以 iso8859-1 进行编码
        //2再以utf-8进行解码
        username = new String(username.getBytes("iso-8859-1"), "UTF-8");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Post");
        //解决post请求乱码问题,必须在获取请求参数之前调用!!!
        req.setCharacterEncoding("UTF-8");
        String  username=req.getParameter("username");
        String password=req.getParameter("password");
        //多个值用getParameterValues方法
        String[] hobby=req.getParameterValues("hobby");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.asList(hobby));

    }
}

请求转发

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

servlet1

package com.example.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数(办事的材料)查看
        String username=req.getParameter("username");
        System.out.println("在servlet1(柜台一)查看参数"+username);
        //给材料盖章,传递到servlet2
        req.setAttribute("key","柜台1的章");
        //问路,到servlet2
        /*
        请求转发必须以斜杠打头
         */
        //RequestDispatcher requestDispatcher=req.getRequestDispatcher("/servlet2");
        //到web-inf
        RequestDispatcher requestDispatcher=req.getRequestDispatcher("/WEB-INF/form1.html");
        //走向servlet2
        requestDispatcher.forward(req,resp);
    }
}

 

package com.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数(办事材料)
        String username=req.getParameter("username");
        System.out.println("在servlet1(柜台二)查看参数"+username);
        //查看是否有柜台一的章
        Object key1=req.getAttribute("key");
        System.out.println("柜台1的章:"+key1);
        //处理自己的业务
        System.out.println("处理业务");
    }
}

请求转发特点

1、请求地址栏不发生变化是一次请求
2、共享request域中的数据
3、可以转发到web-inf目录下
4、不可以访问工程外的位置

Base标签

设置相对路径参考哪个路径

web下的index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
这是web下的index.html<br/>
<a href="a/b/c.html">a/b/c.html</a>
<a href="http://localhost:8080/servlet_war/forward">请求转发</a>

</body>
</html>

web下的a/b/c.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <base href="http://localhost:8080/servlet_war/a/b/">
</head>
<body>
这是a下的b的c.html页面<br/>
<a href="../../index.html">跳回首页</a>
<!--相对路径不添加base标签,最终跳到http://localhost:8080/index.html不存在-->
</body>
</html>

路径

相对路径是:

.表示当前目录

..表示上一级目录

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

绝对路径:

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

在实际开发中,

路径都使用绝对路径,而不简单的使用相对路径:

1、绝对路径

2、base+相对

/的含义

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

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

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

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

1、<url-pattern>/servlet1</url-pattern>

2、servletContext.getRealPath(“/”);

3、request.getRequestDispatcher(“/”);

特殊情况:response.sendRediect(“/”);把斜杠发送给浏览器解析。得到http://ip:port/

HttpServletResponse

简介

每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置

两个输出流

乱码解决方式在代码中

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        //1.设置服务器字符集
//        resp.setCharacterEncoding("UTF-8");
//        //2.通过响应头,设置浏览器也是用UTF-8字符集
//        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        //同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头,必须获取流之前有效
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer=resp.getWriter();//字符流(字符串数据)
        writer.write("帅!!!");
       // resp.getOutputStream();//字节流(二进制)

    }

重定向

 特点

浏览器地址变化
两次请求
不能共享request域的数据
不能访问WEB-INF的资源
可以访问当前工程外的资源

代码演示

response1

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response1");
        //设置响应状态码请求重定向
        resp.setStatus(302);
        //设置响应头,说明新的地址在哪里
        resp.setHeader("location","http://localhost:8080/servlet_war/response2");
        //方法二
        //resp.sendRedirect("http://localhost:8080/servlet_war/response2");
    }

response2

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("response2!!");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冉卿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值