Request 原理
目录
request原理
Request继承体系
编辑Request获取请求行数据方法介绍
1、获取请求行数据
2、获取请求头数据
3、获取请求体数据
4、其他功能
1、获取请求参数通用方式:
中文乱码问题:
2.请求转发
3.共享数据
4.获取servletcontext
request原理
1、tomcat服务器会根据请求url中资源路径,创建对应的seveletDemo1中的对象。
2、tomcat服务器,会自动创建response和request请求,request对象中封装请求消息数据。
3、tomcat将request和reponse两个对象传递给dervice方法,并调用service方法。
4、程序员(我们),可以通过request对象获取消息数据,通过response对象设置响应消息数据。
5、服务器会在给浏览器做出响应之前,会给response对象中的程序员设置响应消息数据。
Request继承体系
Request获取请求行数据方法介绍
【Java寒假打卡】JavaWeb-Servlet基础_虚拟目录和servlet路径-CSDN博客 上述图片来源
1、获取请求行数据
//获取请求方式get
String method = request.getMethod();//alt+enter
System.out.println(method);
//获取虚拟目录
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取Servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//获取get方式请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//获取uri
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//获取协议及版本
String protocol = request.getProtocol();
System.out.println(protocol);
//获取客户机的ip地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
区别: URL: 长的一串 http://localhost/day14/demo1 相当于中华人民共和国
URI: 短的一串 /day14/demo1 相当于共和国
2、获取请求头数据
方法:
(*)String getHeader(String name): 通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
关于浏览器输入的这一行代码是什么意思localhoat/day14/demo1,需要在idea中怎么配置才可以?
“localhost/day14/demo1” 是一个URL路径,通常表示在本地服务器上运行的一个Web应用程序的目录结构。在这个例子中,它指向的是位于 “day14” 文件夹下的 “demo1” 页面。
要在IntelliJ IDEA中配置这个URL访问,你需要做以下几个步骤:
设置项目服务器:
- 如果你的项目已经配置了服务器,确保它是启用的并且目标是 “localhost”。
- 如果没有,点击 “Run” 菜单,选择 “Edit Configurations…”,然后添加一个新的 “Tomcat Server” 或 “Jetty” 等支持的Web服务器配置,并指定端口(如8080)。
部署应用:
- 将你的 “day14” 文件夹以及所有依赖文件复制到服务器的 “webapps” 目录下,如果IntelliJ自动识别了项目结构则无需手动操作。
启动服务器:
- 点击 “Start” 按钮启动服务器,IDEA会尝试在指定的端口上部署并启动你的应用。
访问页面:
- 打开浏览器,输入 “http://localhost:your_port/day14/demo1”,替换 “your_port” 为你刚才配置的服务器端口号,然后访问对应的页面。
配置路由 (可选):
- 如果你的项目使用的是前后端分离框架,可能还需要在服务器或应用代码中设置路由规则,使得特定的URL能映射到 “demo1” 页面。
如果你遇到问题,记得检查IDEA是否正确识别了项目的根目录、服务器配置和实际的文件结构。
//获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
//遍历
while(headerNames.hasMoreElements()){
String name= headerNames.nextElement();
//根据名称获取请求头的值
String value= request.getHeader(name);
System.out.println(name+"--"+value);
}
//演示获取请求头数据 user-agent
String agent=request.getHeader("user-agent");
//判断agent的浏览器版本
if(agent.contains("Chorme")){
System.out.println("谷歌来了");
}else if(agent.contains("Firefox")){
System.out.println("火狐来了");
}
//演示获取请求头数据 referer
String referer =request.getHeader("referer");
System.out.println(referer);
//防盗链操作
if(referer!=null){
if(referer.contains("/untitled4")){
//正常访问
System.out.println("播放电影。。");
}else{
System.out.println("想看电影吗,来优酷");
}
}
防盗链高阶版
//防盗链操作
if(referer!=null){
if(referer.contains("/untitled4")){
//正常访问
response.setContentType("text/html;character=utf-8");
response.getWriter().write("播放电影");
// System.out.println("播放电影。。");
}else{
response.setContentType("text/html;character=utf-8");
response.getWriter().write("想看电影吗,来优酷");
// System.out.println("想看电影吗,来优酷");
}
}
3、获取请求体数据
请求体:只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数
步骤:
1、获取流对象
*BufferedReader getReader():获取字符输入流,只能操作字符数据
*ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
*在文件上传知识点后讲解
2、再从流对象中拿数据
//获取请求消息体--请求参数
//1、获取字符流
BufferedReader br = request.getReader();
//2、读取数据
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
4、其他功能
1、获取请求参数通用方式:
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post获取请求参数
//根据参数名称获取参数值
String username=request.getParameter("username");
System.out.println("post");
System.out.println(username);
}
}
其他功能:
1.获取动求参数通用方式
1.string getParameter(string name):根据参数名称获取参数值username=zs&password=123
2. string[ ]getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
3.Enumeration<String>getParameterNames():获取所有计求的参数名称4.Map<String,string[]>getParameterMap():获取所有参数的map集合
中文乱码问题:
get方式:tomcat8已经将get方式乱码问题解决了
post方式:会乱码
*解决:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、设置流的编码
request.setCharacterEncoding("utf-8");
}
2.请求转发
1、概念:一种在服务器内部的资源跳转方式
servlet的作用:
servlet由servlet容器管理,servlet容器也叫 servlet引擎,是servlet的运行环境,给发送的请求和响应之上提供网络服务
步骤:
①通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
②使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
//转发到demo9资源 // RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9"); // requestDispatcher.forward(request,response); request.getRequestDispatcher("/requestDemo9").forward(request,response);
2、特点
1、浏览器地址栏路径不发生变化。
2、只能转发到当前服务器内部资源中。
3、转发是一次请求
3.共享数据
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中去共享数据
方法:
1、void setAttribute(String name,Object obj):存储数据
2、Object getAttribute(String name):通过键获取值
3、 void removeAttribute(String name):通过键移除键值对
4.获取servletcontext
ServletContext getServletContext()