JavaWeb笔记_Request对象
一.Request对象概述
a.Request专门用来获取浏览器的请求信息(请求行,请求头,请求体)的对象
b.我们主要使用的是跟HTTP协议相关的Request对象:HttpServletRequest 继承了 ServletRequest
扩展了ServletRequest接口,提供了更多基于HTTP协议的方法
二.通过Request对象获取请求行
/**
* 二.通过Request对象获取请求行
* String getContextPath():获取当前应用的Application Context
* String getMethod():获取的当前的请求请求方式
* String getQueryString():获取查询字符串,获取请求行中?后面的参数
* String getRequestURI():获取的是请求行中的请求路径(不包含?后面的参数)
* StringBuffer getRequestURL():获取的请求的绝对路径(在地址栏中输入的路径),不包含?后面的参数
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行
//获取当前应用的Application Context
System.out.println(request.getContextPath()); //day11_Request
//获取当前的请求方式
System.out.println(request.getMethod()); //GET
//获取查询字符串,获取请求行中 ? 后面的参数
System.out.println(request.getQueryString()); //username=zs&password=123456
//获取请求行中的请求路径(不包含 ? 后面的参数)
System.out.println(request.getRequestURI()); ///day11_Request/request01
//获取请求行中的绝对路径(在地址栏中输入的路径),不包含 ? 后面的参数
System.out.println(request.getRequestURL()); //http://localhost:8080/day11_Request/request01
}
三.通过Request对象获取请求头
/**
* 二.通过Request对象获取请求头
* String getHeader(String name):根据请求头的key获取对应的value
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求头
System.out.println(request.getHeader("User-Agent"));
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
System.out.println(request.getHeader("Host"));
//localhost:8080
}
四.通过Request对象获取请求体
/**
* 二.通过Request对象获取请求体
* String getParameter(String name):根据提交参数的name获取对应的值
* String[] getParameterValues(String name):根据提交参数的name获取多个值
* Map<String,String[]> getParameterMap():将获取的参数以键值对的形式存放到一个map中,然后返回
这个map :将提交的所有参数以key=value的形式封装到
* map中,key:对应表单中的name
* value:name对应的一个或多个值,value是字符串数组
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求体
//根据提交的参数name获取对应的值(可以在地址栏中添加参数,也可通过提交表单来获取参数)
System.out.println(request.getParameter("username")); //zs
System.out.println(request.getParameter("password")); //123456
}
五.Request对象解决中文参数问题
5.1 GET请求
/**
*
五.请求中含有中文参数
1.GET请求
a.如果Tomcat是8版本以上,那么Tomcat底层在处理Get提交参数的时候,默认使用的是UTF-8码表
由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
Tomcat接收到UTF-8编码(字符串->字节)参数,底层也使用UTF-8解码(字节->字符串)
b.如果Tomcat是7版本及以前的版本,那么Tomcat底层在处理Get提交参数的时候,默认使用ISO-8859-1码表
我们需要修改Tomcat中conf/server.xml中修改默认使用的码表: <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="ISO-8859-1"/>
由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码
解决乱码:我们需要获取到中文参数的原始字节,然后在对其使用UTF-8解码即可
new String(username.getBytes("ISO-8859-1"), "UTF-8")
*/
@WebServlet("/request04")
public class RequestDemo04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println(request.getParameter("username"));
String username = request.getParameter("username");
/*byte[] bytes = username.getBytes("ISO-8859-1");//获取发送过来username中文的原始字节
System.out.println(new String(bytes, "UTF-8"));*/
System.out.println(new String(username.getBytes("ISO-8859-1"), "UTF-8"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
5.2 POST请求
/**
*
五.请求中含有中文参数
1.GET请求
a.如果Tomcat是8版本以上,那么Tomcat底层在处理Get提交参数的时候,默认使用的是UTF-8码表
由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
Tomcat接收到UTF-8编码(字符串->字节)参数,底层也使用UTF-8解码(字节->字符串)
b.如果Tomcat是7版本及以前的版本,那么Tomcat底层在处理Get提交参数的时候,默认使用ISO-8859-1码表
我们需要修改Tomcat中conf/server.xml中修改默认使用的码表: <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="ISO-8859-1"/>
由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码
解决乱码:我们需要获取到中文参数的原始字节,然后在对其使用UTF-8解码即可
new String(username.getBytes("ISO-8859-1"), "UTF-8")
2.POST请求
Tomcat底层在处理Post请求的参数时候,默认使用的是ISO-8859-1码表
由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码
解决乱码:
a.第一种方式:
new String(username.getBytes("ISO-8859-1"), "UTF-8")
b.第二种方式:
request.setCharacterEncoding("UTF-8");//底层处理Post提交参数的时候就会使用UTF-8码表
//需要在获取参数之前来设置码表
*/
@WebServlet("/request05")
public class RequestDemo05 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println(request.getParameter("username"));
//解决Post乱码的第一种方式
/*String username = request.getParameter("username");
System.out.println(new String(username.getBytes("ISO-8859-1"), "UTF-8"));*/
//解决Post乱码的第二种方式
request.setCharacterEncoding("UTF-8");
System.out.println(request.getParameter("username"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
六.转发与重定向
6.1转发
/**
* 转发实现:
* ServletRequest接口中方法:
* RequestDispatcher getRequestDispatcher(String path):获取一个转发器,path代表转发的路径
* RequestDispatcher接口中的方法
* void forward(ServletRequest request, ServletResponse response):调用该方法实现转发
*
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发
//浏览器发出出一次请求
//获取一个转发器
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/request02"); //客户端内部发出请求
//调用转发器中的方法实现转发 该方法传入的两个参数继续作为参数传给request02doPost()
// 即这两个参数和request02中的doPost()方法中的参数为同一个参数
requestDispatcher.forward(request,response);
}
6.2重定向
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向
//浏览器发出两次请求
response.sendRedirect("/day11_Request/request02"); //浏览器发出客户端请求
}
6.3区别
1.重定向
a.重定向使浏览器发出两次请求
第一次原始请求
第二次重定向请求
b.重定向会使浏览器的地址栏发生改变
2.转发
a.转发使浏览器发出一次请求
b.转发不会使浏览器的地址栏改变
七. request作为域对象
* Request域对象使用:
* void setAttribute(String name, Object o)
* Object getAttribute(String name)
*/
@WebServlet("/request06")
public class RequestDemo06 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("username", "张三");
request.getRequestDispatcher("/request07").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/request07")
public class RequestDemo07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
System.out.println(request.getAttribute("username"));
response.getWriter().write("<b>RequestDemo07响应给浏览器资源</b>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
八.文件上传案例
8.1 文件上传概述
a.文件上传描述
头像上传,将文件上传到一个云盘(百度云,onedrive,google drive)
将客户端本地的文件上传到指定的服务器
b.上传的前提条件
1.在表单中利用input type=file这个标签来完成文件上传,需要之地那个input标签的name属性,作 为提交参数
2.表单的请求方式必须是POST,POST提交没有数据长度限制
3.需要指定表单的enctype属性,设置为multipart/form-data
c.将文件上传位置
我们一般不将上传的文件存储到web应用下,我们一般会用一台单独的服务器来存储上传文件
FastDFS:分布式文件管理系统
8.2 文件上传实现
/**
* 实现单文件上传:
* 1.在servlet上加上@MultipartConfig注解
* 2.通过request对象获取Part接口实现类对象
* HttpServletRequest中方法:
* Part getPart(String name):形参的name对应表单中input type=file的name值
* 3.获取文件的信息主要通过javax.servlet.http.Part接口
* getSubmittedFileName():需要servlet 3.1规范才支持,获取上传文件的名称
* getContentType():获取文件的类型,MIME类型
* getSize():获取的文件大小,单位是字节
* getName():获取的是input type=file的name值
* void write(String fileName):可以将上传的文件直接写入到指定的路径,需要传入一个指定的路径
*/
/**
* 实现单文件上传:
* @MultipartConfig注解中一些属性
* *location属性:指定上传文件的位置
* *maxFileSize属性:设定允许上传的文件尺寸最大值,单位是字节,默认值-1,不限制上传文件大小
* maxRequestSize属性:如果上传多个文件,总的文件大小不能超过maxRequestSize设定值,单位是字节,默认值-1,不限制上传文件大小
* fileSizeThreshold属性:如果上传的文件的字节数超过 fileSizeThreshold(单位字节),将会把上传的数据写到一个临时文件
* 如果上传的文件超过指定的 maxFileSize值,服务端会抛出异常
* FileSizeLimitExceededException: The field uploadFile exceeds its maximum permitted size of 20480 bytes
*
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part uploadfile = request.getPart("uploadfile");
String sfn = uploadfile.getSubmittedFileName();
System.out.println(sfn);
uploadfile.write("D:/app/"+sfn);
}
原文地址:https://blog.csdn.net/m0_65469669/article/details/140546081
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!