热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【JavaWeb】Servlet

servlet获取请求信息HttpServletRequest常用方法获取请求参数post请求中文乱码请求转发base标签设置回应信息HttpServletResponse两个输入

servlet

  • 获取请求信息 HttpServletRequest
    • 常用方法
      • 获取请求参数
        • post 请求中文乱码
  • 请求转发
    • base 标签
  • 设置回应信息 HttpServletResponse
    • 两个输入流
    • 往客户端回传数据
      • 解决响应的中文乱码
  • 请求重定向
    • 方法一:
    • 方法二(推荐):


获取请求信息 HttpServletRequest

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

常用方法


i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象

例子:

public class HelloServlet3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 获取请求的资源路径System.out.println("URI =>"+request.getRequestURI());//2. 获取请求的统一资源定位符System.out.println("URL =>"+request.getRequestURL());//3. 获取客户端的ip地址System.out.println("ip地址 =>"+request.getRemoteHost());//4. 获取请求头System.out.println("请求头=>"+request.getHeader("User-Agent"));}
}

获取请求参数

getParameter()
getParameterValues() 返回参数有多个的时候使用

表单:

<body>
<form action&#61;"http://localhost:8080/07_servlet/parameterServlet" method&#61;"get">
用户名&#xff1a; <input type&#61;"text" name&#61;"username"><br/>
密码&#xff1a; <input type&#61;"password" name&#61;"password"><br/>
兴趣爱好&#xff1a; <input type&#61;"checkbox" name&#61;"hobby" value&#61;"cpp">C&#43;&#43;
<input type&#61;"checkbox" name&#61;"hobby" value&#61;"java">Java
<input type&#61;"checkbox" name&#61;"hobby" value&#61;"js">Javascript<br/>
<input type&#61;"submit">
form>
body>

获取表单的参数&#xff1a;

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

post 请求中文乱码

post请求表单填入中文 会出现论吗问题&#xff0c;我们可以通过在doPost()方法 设置请求体的字符集为 UTF-8&#xff0c; 从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8") //必须在获取请求参数之前调用&#xff01;

&#64;Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 设置请求体的字符集为 UTF-8&#xff0c; 从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8"); //必须在获取请求参数之前调用&#xff01;
System.out.println("-------------doPost------------");
// 获取请求参数
String username &#61; req.getParameter("username");
String password &#61; req.getParameter("password");
String[] hobby &#61; req.getParameterValues("hobby");
System.out.println("用户名&#xff1a; " &#43; username);
System.out.println("密码&#xff1a; " &#43; password);
System.out.println("兴趣爱好&#xff1a; " &#43; Arrays.asList(hobby));
}

请求转发

请求转发是指&#xff0c; 服务器收到请求后&#xff0c; 从一次资源跳转到另一个资源的操作叫请求转发。
可以理解为去银行办业务&#xff0c;先要去柜台1办完再去柜台2.
在柜台一做的事&#xff1a;1. 问是否带材料 2. 盖章 3. 问柜台2怎么走 4. 去柜台二
在柜台二做的事&#xff1a;1. 查看材料 2. 检查有没有柜台1的章 3. 办理自己的业务
在这里插入图片描述

注意请求转发必须以斜杠打头
RequestDispatcher requestDispatcher &#61; req.getRequestDispatcher("/servlet2");

Servlet1 代码&#xff1a;

public class Servlet1 extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 获取请求的参数&#xff08;办事的材料&#xff09; 查看
String username &#61; req.getParameter("username");
System.out.println("在 Servlet1&#xff08;柜台 1&#xff09; 中查看参数&#xff08;材料&#xff09; &#xff1a; " &#43; username);
// 给材料 盖一个章&#xff0c; 并传递到 Servlet2&#xff08;柜台 2&#xff09; 去查看
req.setAttribute("key1","柜台 1 的章");
// 问路&#xff1a; Servlet2&#xff08;柜台 2&#xff09; 怎么走
/**
* 请求转发必须要以斜杠打头&#xff0c; / 斜杠表示地址为&#xff1a; http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录


* *
/
RequestDispatcher requestDispatcher &#61; req.getRequestDispatcher("/servlet2");
// RequestDispatcher requestDispatcher &#61; req.getRequestDispatcher("http://www.baidu.com");
// 走向 Sevlet2&#xff08;柜台 2&#xff09;
requestDispatcher.forward(req,resp);}
}

servlet2 代码&#xff1a;

public class Servlet2 extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 获取请求的参数&#xff08;办事的材料&#xff09; 查看
String username &#61; req.getParameter("username");
System.out.println("在 Servlet2&#xff08;柜台 2&#xff09; 中查看参数&#xff08;材料&#xff09; &#xff1a; " &#43; username);
// 查看 柜台 1 是否有盖章
Object key1 &#61; req.getAttribute("key1");
System.out.println("柜台 1 是否有章&#xff1a; " &#43; key1);
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}

base 标签

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


<html lang&#61;"zh_CN">
<head>
<meta charset&#61;"UTF-8">
<title>Titletitle>

<base href&#61;"http://localhost:8080/07_servlet/a/b/">
head>
<body>
这是 a 下的 b 下的 c.html 页面<br/>
<a href&#61;"../../index.html">跳回首页a><br/>
body>
html>

作用&#xff1a;
以请求转发 跳转页面为例
在这里插入图片描述

设置回应信息 HttpServletResponse

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

两个输入流


  • 字节流 getOutputStream();
    常用于下载&#xff08;传递二进制数据&#xff09;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getOutputStream();}

  • 字符流 getWriter();
    常用于回传字符串&#xff08;常用&#xff09;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter();}

两个流同时只能使用一个。
使用了字节流&#xff0c; 就不能再使用字符流&#xff0c; 反之亦然&#xff0c; 否则就会报错。
就是不能像这么写&#xff1a;

//错误&#xff01;&#xff01;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//不能像这样同时用response.getWriter();response.getOutputStream();}

往客户端回传数据

要求 &#xff1a; 往客户端回传 字符串 数据。

public class ResponseIOServlet extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 要求 &#xff1a; 往客户端回传 字符串 数据。
PrintWriter writer &#61; resp.getWriter();
writer.write("response&#39;s content!!!");
}
}

解决响应的中文乱码

为了解决响应的中文乱码

首先应该设置一下服务器字符集为UTF-8&#xff0c;然后设置浏览器也是用UTF-8字符集

方法一&#xff1a;

// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头&#xff0c; 设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset&#61;UTF-8");

方法二&#xff1a;
此方法一定要在获取流对象之前调用才有效

// 它会同时设置服务器和客户端都使用 UTF-8 字符集&#xff0c; 还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset&#61;UTF-8");

请求重定向

请求重定向&#xff0c; 是指客户端给服务器发请求&#xff0c; 然后服务器告诉客户端说。 我给你一些地址。 你去新地址访问。 叫请求
重定向&#xff08;因为之前的地址可能已经被废弃&#xff09; 。
在这里插入图片描述

方法一&#xff1a;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置响应状态码 302 &#xff0c; 表示重定向&#xff0c; &#xff08;已搬迁&#xff09;response.setStatus(302);
// 设置响应头&#xff0c; 说明 新的地址在哪里response.setHeader("Location", "http://localhost:8080");}

方法二(推荐):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("http://localhost:8080");}


推荐阅读
author-avatar
mobiledu2502884967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有