Java Web(5)-Servlet详解(下)
一、HttpServletRequest 类
1. HttpServletRequest 类作用?
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用,可以通过 HttpServletRequest 对象,获取到所有请求的 信息
2. HttpServletRequest 类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key, value); 设置域数据
- getAttribute(key); 获取域数据
- getRequestDispatcher() 获取请求转发对象
具体如下:
首先把环境建好,配置好web.xml ,然后在类中
package com.md.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author MD
* @create 2020-07-25 8:18
*/
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getRequestURI());// /04_Servlet/requestAPIServlet
System.out.println(req.getRequestURL());
//http://localhost:8080/04_Servlet/requestAPIServlet
System.out.println(req.getRemoteHost());//127.0.0.1
System.out.println(req.getHeader("User-Agent"));//Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
System.out.println(req.getMethod());//GET
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
对应的web.xml
<servlet>
<servlet-name>RequestAPIServlet</servlet-name>
<servlet-class>com.md.servlet.RequestAPIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestAPIServlet</servlet-name>
<url-pattern>/requestAPIServlet</url-pattern>
</servlet-mapping>
3. 获取请求参数
首先在web下面建立html文件,如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/parameterServlet" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">Java
<input type="checkbox" name="hobby" value="python">Python
<input type="submit">
</form>
</body>
</html>
然后是对应的java代码,以及配置的web.xml(和上面的类似)
/**
* @author MD
* @create 2020-07-25 8:31
*/
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("------------doGet--------------");
// 获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// String hobby = req.getParameter("hobby");
// 当有多个值的时候
String [] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
}
4. 中文乱码
使用post请求的时候,如果用户名输入的是中文,则会出现中文乱码的情况,所以需要这样设置
public class ParameterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 在post的时候注意设置字符集,要不中文乱码
// 只有在获取请求参数调用之前使用才有效
req.setCharacterEncoding("UTF-8");
System.out.println("------------doPost--------------");
// 获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// String hobby = req.getParameter("hobby");
// 当有多个值的时候
String [] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("爱好:"+ Arrays.asList(hobby));
}
}
5. 请求转发
什么是请求的转发?
请求转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发
请求转发的特点:
- 浏览器地址栏没有改变
- 一次请求
- 共享Request域中的数据
- 可以转发到WEB-INF目录下
- 不可以访问工程以外的资源

例子如下:通过访问Servlet1然后转发到Servlet2去
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// http://localhost:8080/04_Servlet/servlet1?username=abc
// 1. 获取请求的参数
String username = req.getParameter("username");
System.out.println("在Servlet1中获取到的请求参数:"+username);
// 在Servlet1中获取到的请求参数:abc
// 2. 把获取到的数据传递,也可以自定义参数传递
// req.setAttribute("username" , username);
req.setAttribute("key","我来自Servlet1");
// 3. 转发
// 地址必须以 /开头 ,这个地址也是在web.xml中配置对应的你要去的
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
requestDispatcher.forward(req,resp);
// 或者可以直接这样
req.getRequestDispatcher("/servlet2").forward(req,resp);
}
}
对应的web.xml就不展示了,都类似
/**
* @author MD
* @create 2020-07-25 8:57
*/
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取请求的参数
String username = req.getParameter("username");
System.out.println("在Servlet2中获取到的请求参数:"+username);//在Servlet2中获取到的请求参数:abc
// 2. 查看从Servlet1中传递的参数
Object key = req.getAttribute("key");
System.out.println("Servlet1中传来的参数:"+key);//Servlet1中传来的参数:我来自Servlet1
// 3. 处理自己的业务
System.out.println("正在处理Servlet2的业务");//正在处理Servlet2的业务
}
}
6. base标签

所以在html文件中,跳转的时候若使用相对路径,指定相对的那个路径
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--
base标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
-->
<!--<base href="http://localhost:8080/04_Servlet/a/b/c.html">-->
<!--
也可以这样,但最后的斜杠不能省略
-->
<base href="http://localhost:8080/04_Servlet/a/b/">
</head>
<body>
这是a目录下的b目录下的c.html页面
<a href="../../index.html">跳到首页</a>
<!--通过定义了base,这个就相当于那个地址的上上层
http://localhost:8080/04_Servlet/index.html
-->
</body>
</html>
开发中尽量使用绝对路径,实在不行就使用base+相对路径
7. web中 / 斜杠的不同意义
在web中 / 是一种绝对路径
/ 斜杠被浏览器解析,得到的地址就是 http://ip:port
<a href="/">斜杠</a>/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
<url-pattern>/servlet1</url-pattern>- servletContext.getRealPath(“/”);
- request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/
二、HttpServletResponse 类
1. HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样。
每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
2. 两个输出流
| 字符流 | getWriter() | 用于传字符串(常用) |
|---|---|---|
| 字节流 | getOutputStream() | 用于下载(传递二进制数据) |
3. 如何往客户端回传数据
首先还是先建立一个servlet,配置对应的web.xml
注意中文的乱码情况
package com.md.servlet;
/**
* @author MD
* @create 2020-07-25 9:57
*/
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println(resp.getCharacterEncoding());//ISO-8859-1
//
// // 设置服务器字符集为
// resp.setCharacterEncoding("UTF-8");
// // 此时若浏览器没有使用UTF-8中文还是乱码,这个时候需要
// // 通过设置响应头,使得浏览器也使用UTF-8字符集
// resp.setHeader("Content-Type","text/html; charset=UTF-8");
// 或者直接可以这样写,自动设置服务器字符集和浏览器响应头
// 方法一定要流获取之前先调用,通常放在最上面就行
resp.setContentType("text/html; charset=UTF-8");
// 需求:往客户端回传字符串数据
PrintWriter writer = resp.getWriter();
writer.write("response");
writer.write("越过山丘,");
}
}
4. 请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)
请求重定向的特点:
- 浏览器的地址会发生改变
- 两次请求
- 不能共享Request域中的数据
- 不能访问WEB-INF下的资源
- 可以访问工程外的资源

例子如下:访问Response1重定向到Response2
/**
* @author MD
* @create 2020-07-25 10:15
*/
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Response 1 ");
// // 设置响应状态码,表示重定向
// resp.setStatus(302);
//
// // 设置响应头,说明新的地址,和web.xml里的要对应
// resp.setHeader("Location","http://localhost:8080/04_Servlet/response2");
// 推荐使用
resp.sendRedirect("http://localhost:8080/04_Servlet/response2");
}
}
//-----------------------------------
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Response 2 ");
resp.getWriter().write("Response2 result !");
}
}
对应的web.xml
<servlet>
<servlet-name>Response1</servlet-name>
<servlet-class>com.md.servlet.Response1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response1</servlet-name>
<url-pattern>/response1</url-pattern>
</servlet-mapping>
<!---->
<servlet>
<servlet-name>Response2</servlet-name>
<servlet-class>com.md.servlet.Response2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response2</servlet-name>
<url-pattern>/response2</url-pattern>
</servlet-mapping>
Java Web(5)-Servlet详解(下)的更多相关文章
- Java Web(一) Servlet详解!!
这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...
- (转)Java Web(一) Servlet详解!!
https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...
- Java Web(二) Servlet详解
什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...
- Java Web(5)-Servlet详解(上)
一.Servlet 1. 什么是Servlet Servlet 是 JavaEE 规范之一,规范就是接口 Servlet 就 JavaWeb 三大组件之一,三大组件分别是:Servlet 程序.Fil ...
- java web.xml配置详解(转)
源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...
- java web之Filter详解
java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- Java web.xml 配置详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- java web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
随机推荐
- 深入理解JVM(③)Java的模块化
前言 JDK9引入的Java模块化系统(Java Platform Module System ,JPMS)是 对Java技术的一次重要升级,除了像之前JAR包那样充当代码的容器之外,还包括: 依赖其 ...
- oracle数据库插入日期格式字符串给date类型字段
首先执行 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 然后执行insert语句而无需使用to_date函数
- 自定义PHPstorm快捷键
这篇随笔介绍一下PHPstorm自定义快捷键的步骤: 1.点击主菜单 File 下的 setting : 2.在弹出框中点击 Keymap : 3.之后会出现如下图所示的界面(图中所有的菜单都折叠了) ...
- css怎么样设置透明度?
css怎么样设置透明度?下面本篇文章就来给大家介绍一下使用css设置透明度的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 在CSS中想要设置透明度,可以使用opacity属性 ...
- 深入理解letter-spacing,word-spacing的对比区别
letter-spacing lletter-spacing 属性增加或减少字符间的空白(字符间距). 该属性定义了在文本字符框之间插入多少空间.由于字符字形通常比其字符框要窄,指定长度值时,会调整字 ...
- HTML5全局属性汇总
局部属性和全局属性 局部属性:有些元素能规定自己的属性,这种属性称为局部属性.比如link元素,它具有的局部属性有href. rel. hreflang. media. type. sizes这六个. ...
- (一)ansible 安装配置
CentOS 7.5 一,安装 yum -y install ansible 二,配置hosts文件 /etc/ansible/hosts s1 ansible_ssh_port= ansible_s ...
- 状压DP之集合选数
题目 [HNOI2012]集合选数 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不 ...
- 棋子游戏 51Nod - 1534 思维题
题目描述 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从 ...
- CentOS7下安装Docker《超详细新手教程》
1.使用 root 权限登录 Centos.确保 yum 包更新到最新. sudo yum update 2.卸载旧版本(如果安装过旧版本的话) sudo yum remove docker dock ...