JavaWeb之Servlet(3)
Servlet(3)
HttpServletRequest
该类的对象封装了所以客户端提交过来的数据
获取所有请求头数据
public java.util.Enumeration<E> getHeaderNames()
返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。
实例
Enumeration<String> heards = request.getHeaderNames();
while (heards.hasMoreElements()) {
String heard = (String) heards.nextElement();
String value = request.getHeader(heard);
System.out.println(heard + "=" + value);
}
输出
accept=image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
referer=http://localhost:8080/HttpservletrequestDemo/login.html
accept-language=zh-CN
ua-cpu=AMD64
accept-encoding=gzip, deflate
user-agent=Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko
host=localhost:8080
connection=Keep-Alive
获取客户端提交过来的数据
1.通过对应name得到值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + "==" +password);
2.通过request.getParameterMap()得到一个所有数据的map集合,再从中提取数据
Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
System.out.println(keySet.size());
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = (String) it.next();
String[] values = map.get(key);
System.out.println(key);
for(int i =0;i<values.length;i++) {
System.out.println(key + "=" + values[i]);
}
}
请求中中文乱码问题
即由客户端(浏览器)提交给服务器端的数据,如果带有中文则会出现乱码问题。可通过以下方法解决
对于get请求
1.代码转码
get请求过来的数据,会拼接到url地址栏,所以在url地址栏上就已经经过编码了,所以我们取到的就是乱码,tomcat收到了这批数据。而getParameter 默认使用ISO-8859-1去解码。
解决方法:先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串
String username = request.getParameter("username");
String password = request.getParameter("password");
username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
System.out.println("userName="+username+"==password="+password);
2.直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding=“utf-8”
对于post请求
对于post请求来说,该请求的所有数据都在 请求体中,所以直接设置请求体中的文字编码。
request.setCharacterEncoding("utf-8");
这行设置一定要写在getParameter之前。
HttpServletResponse
负责返回数据给客户端
输出数据到页面
//以字符流的方式写数据
//response.getWriter().write("<h1>hello response...</h1>");
//以字节流的方式写数据
response.getOutputStream().write("hello response2222...".getBytes());
解决数据中的中文乱码问题
以字符流输出
解决方式:
response.getWriter()
//1. 指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
response.getWriter().write("人间不值得...");
//2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("人间不值得...");
以字节流输出
response.getOutputStream()
- 指定浏览器看这份数据使用的码表
response.setHeader("Content-Type", "text/html;charset=UTF-8");
- 指定输出的中文用的码表,也可以不指定因为String的getBytes()方法的默认编码格式为utf-8
response.getOutputStream().write("人间不值得..".getBytes("UTF-8"));
不管是字节流还是字符流,直接使用一行代码就可以了。
response.setContentType("text/html;charset=UTF-8");
然后在后面进行写入数据即可。
实现简单的资源下载
1.先写一个简单的index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
让tomcat的默认servlet提供下载:<br>
<a href="download/aa.jpg" >aa.jpg</a><br>
<a href="download/bb.txt" >bb.txt</a><br>
<a href="download/cc.rar" >cc.rar</a><br>
手动下载:<br>
<a href="t1?filename=aa.jpg" >aa.jpg</a><br>
<a href="t1?filename=bb.txt" >bb.txt</a><br>
<a href="t1?filename=cc.rar" >cc.rar</a><br>
</body>
</html>
2.然后再写一个servlet实现浏览器下载
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class t1
*/
public class t1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过request.getParameter("filename")得到要下载文件名称
String filename = request.getParameter("filename");
System.out.println(filename);
//设置头信息,实现在浏览器下载文件
response.setHeader("Content-Disposition", "attachment; filename="+filename);
//getServletContext().getResourceAsStream("download/"+filename)得到文件的流对象
InputStream is = getServletContext().getResourceAsStream("download/"+filename);
ServletOutputStream os = response.getOutputStream();
int len=0;
byte[] b = new byte[1024];
//实现数据的写入
while((len=is.read(b))!=-1) {
os.write(b,0,len);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
实现中文名称文件下载
针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE、Chrome … 使用的是URLEncoder
1.html页面编写,和上面区别不大
<body>
让tomcat的默认servlet提供下载:<br>
<a href="download/aa.jpg" >aa.jpg</a><br>
<a href="download/bb.txt" >bb.txt</a><br>
<a href="download/cc.rar" >cc.rar</a><br>
手动下载:<br>
<a href="t1?filename=aa.jpg" >aa.jpg</a><br>
<a href="t1?filename=bb.txt" >bb.txt</a><br>
<a href="t1?filename=cc.rar" >cc.rar</a><br>
<a href="t1?filename=图片.png" >黑马.png</a><br>
</body>
2.servlet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("filename");
String filename = new String(name.getBytes("ISO-8859-1"),"utf-8");
System.out.println(filename);
//这一步获取流对象提到编码之前,因为想要下载中文名称文件,那么在设置请求头时文件名必须要针对浏览器类型,对文件名字做编码处理。而在处理后文件名就不能找到对应文件
InputStream is = getServletContext().getResourceAsStream("download/"+filename);
//对浏览器类型,对文件名字做编码处理,此处为针对chrome做的处理。
filename = URLEncoder.encode(filename,"UTF-8");
response.setHeader("Content-Disposition", "attachment; filename="+filename);
ServletOutputStream os = response.getOutputStream();
int len=0;
byte[] b = new byte[1024];
while((len=is.read(b))!=-1) {
os.write(b,0,len);
}
}
请求转发和重定向
之前的写法
response.setStatus(302);
response.setHeader("Location", "login_success.html");
重定向
//重定向写法: 重新定位方向 参数即跳转的位置
response.sendRedirect("login_success.html");
地址上显示的是最后的那个资源的路径地址
请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
可以跳转到任意路径。 不是自己的工程也可以跳。
效率稍微低一点, 执行两次请求。
后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。
请求转发
//请求转发的写法: 参数即跳转的位置
request.getRequestDispatcher("login_success.html").forward(request, response);
地址上显示的是请求servlet的地址。 返回200 ok
请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
只能跳转自己项目的资源路径 。
效率上稍微高一点,因为只执行一次请求。
可以使用上一次的request对象。
JavaWeb之Servlet(3)的更多相关文章
- JavaWeb学习——Servlet相关的接口和类
JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...
- JavaWeb之Servlet入门(二)
1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...
- JavaWeb学习--Servlet认识
Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...
- IDEA新建javaWeb以及Servlet简单实现
刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...
- Intellij IDEA创建javaWeb以及Servlet简单实现
1.创建web工程 File --> New --> Project...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- JavaWeb学习—Servlet
1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...
- JavaWeb之Servlet总结
今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头 ...
- javaWEB之Servlet
Servlet 1. 什么是Servlet * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener) * Servlet是用来处理客户端请求的动态资源 * ...
- Intellijidea建javaWeb以及Servlet简单实现
一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...
随机推荐
- 普通的maven项目,如何打成一个fat jar(包括了全部依赖jar包)?
1.前言 用过spring boot的同学肯定知道,现在web项目可以直接打成jar包运行,相当方便. 那么普通项目如何配置(非spring boot),才能打成一个类似的jar包呢? 2.解决方案: ...
- CAD转DXF怎么转换?教你三种转换方法
CAD图纸在我们日常生活中都是可见到的,因为CAD图纸文件的格式是多样的,在工作中就需要经常将CAD的格式进行转换.那CAD转DXF怎么转换呢?这个问题很多的小伙伴们都遇到过,下面小编就来教大家三种转 ...
- 微信小程序通过getPhoneNumber后台PHP解密获取用户手机号码
之前做的版本用户这块是以获取用户openid为凭证,最近改版重新整理了一下,新增注册登录以手机号码为主, 两种(正常注册手机号码-密码+一键获取当前用户手机号码) getPhoneNumber这个组件 ...
- SQL注入:DNS注入
DNS注入原理: 通过我们构造的数据,访问搭建好的DNS服务器,查看DNS访问的日志即可获取我们想要得到的数据. DNS注入使用场景: 在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这 ...
- 表单生成器(Form Builder)之表单数据存储结构mongodb篇
从这篇笔记开始,记录一下表单生成器(Form Builder)相关的一些东西,网上关于他的介绍有很多,这里就不解释了. 开篇说一下如何存储Form Builder生成的数据.
- Python语法速查: 2. 列表、元组、字典、集合操作
返回目录 (1)通用序列操作 “序列”表示索引为非负整数的有序对象集合,列表.元组.字符串都属于序列.区别在于:列表是可变的,而元组和字符串是不可变的.序列的通用操作他们都可以用. 操作或方法 简述 ...
- 算法设计与分析 1.1 Joyvan的矩阵
★题目描述 Joyvan有一个大小为n * m的矩阵,现在他要对矩阵进行q次操作,操作分为如下三种: 0 x y:交换矩阵的x.y两行. 1 x y:交换矩阵的x.y两列. 2 x y:求当前矩阵第x ...
- navicat使用教程-PJ
navicat使用教程-PJ Navicat Keygen Patch是一款专门针对Navicat系列软件出品的一款小巧实用,功能强大的破解辅助工具.它能够实现对Navicat全系列版本进行激活破解, ...
- Eclipse的使用需要注意的问题
一.修改/设置字符集编码 设置工作空间编码格式 Window--Preference--General--Workspace下,面板''Text file encoding"选择UTF-8格 ...
- Java之匿名对象
匿名对象概念 创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量.虽然是创建对象的简化写法,但是应用场景非常有限.匿名对象 :没有变量名的对象. 格式: new 类名(参数列表): // ...