关于请求域对象和请求跳转
request对象又被称为请求域对象
什么是应用域对象:
- ServletContext对象(Servlet上下文对象)
- 什么情况下会考虑往应用域中放置数据
- 第一:被所有用户共享的数据
- 第二:这个共享的数据量很小
- 第三:这个共享的数据很少被修改
- 在以上的三个条件都满足的情况下,可以大大提高我们程序的执行效率
在优化程序的过程中,当一个webapp有超过千万的并发量时,可以考虑将一些数据放置在ServletContext的配置中,实际上向应用域中绑定数据,其实相当于把数据放到了缓存中,
比如从数据库中取数据时,可以将满足条件的数据从数据库中拿出来,放到缓存中去,用的时候直接从缓存中去拿数据,避免每次建立连接对象,节省内存,避免频繁的IO操作,提升系统的性能。
// ServletContext中操作域的方法
void serAttribute(String name, Object obj) //向域中绑定数据
Object getAttribute(String name) // 从域中根据name获取数据
void removeAttribute(String name) // 从域中根据name将绑定的数据移除
// 以上的操作类似于Map集合中的操作
Map<String, Object> map;
map.put("name", obj); // 向map中存数据 key和value
Obejct obj = map.get(:name); // 通过key获取value中的数据
map.remove("name"); // 通过map集合的key删除value
“请求域”对象
请求域对象要比应用域对象的寿命短很多
请求域对象只在用户的一次请求中有效,一次请求结束了之后,这个请求域对象就销毁了
-
请求域也有这三个方法
-
void serAttribute(String name, Object obj) //向域中绑定数据 Object getAttribute(String name) // 从域中根据name获取数据 void removeAttribute(String name) // 从域中根据name将绑定的数据移除
-
请求域和应用域对象的选用原则:
- 尽量使用小的域对象,因为小的域对象占用的资源少
请求跳转(转发)
-
转发
// 1.获取请求转发器对象 RequestDispatcher requestDispatcher = request.getRequestDispatcher("转发的资源路径"); // 2. 调用请求转发器的forward方法 传入RequestAttribute的request和response对象 requestDispatcher.forward(request, response);
// 一行代码完成 request.getRequestDispatcher("/BrequestAttribute/sysTime").forward(request, response);
两个Servlet怎么共享数据
-
将数据放到ServletContext应用域中,当然是可以的,但是应用域的范围太大,占用资源太多,不建议使用
-
可以将数据放到Request域中,然后A转发给B,保证A和B在同一个请求当中,这样就可以做到两个或者多个Servlet共享同一份是数据
-
转发的资源必须是一个Servlet吗?
- 不是
- 只要是Tomcat服务器中的合法资源都是可以转发的,注意路径的写法,不用加项目路径
// 也可以转发一个HTML,只要是WEB容器中的合法资源即可 request.getRequestDispatcher("/welcome.html").forward(request, response);
关于servletr中非常容易获取的方法
// URI(统一资源标识符)
// uri?name=yuluo&userpws=123
String username = request.getparameter(String name)
// 之前一定是执行过:request.setAttribute("name", Object obj);
Object obj = request.getAttribute("name");
// 这两个方法的区别
// 第一个是获取某用户在浏览器上提交的数据
// 第二个是获取request域(请求域)中绑定的数据
request对象中的其他常用方法
// 获取客户端的ip地址
String remoteAdder = request.getRemoteAddr();
out.print(remoteAdder);
System.out.println("服务端获取到的客户端的ip地址:" + remoteAdder);
// 获取应用的根路径
String contextPath = request.getContextPath();
out.print(contextPath);
System.out.println("应用的根路径:" + contextPath);
// 应用的根路径:/HttpServletRequest
// 获取请求方式
String method = request.getMethod();
System.out.println("请求方式:" + method);
// 请求方式:GET
// 获取请求的uri
String requestURI = request.getRequestURI();
System.out.println("请求的uri:" + requestURI);
// 请求的uri:/HttpServletRequest/otherMethod/getAdder
// 获取servlet path
String servletPath = request.getServletPath();
System.out.println("servlet path:" + servletPath);
// servlet path:/otherMethod/getAdder
post和get请求的乱码问题
// 设置请求体的编码集,处理post请求的乱码问题不能处理get请求的乱码问题
// Tomcat10之后的字符集默认就是UTF-8,不需要设置字符集编码,不会出现;乱码问题
// tomcat9之前,包括9在前端提交的是中文的时候,后端显示乱码
request.setCharacterEncoding("UTF-8");
// Tomcat9及其之前get请求乱码的问题:
response.setConteneType("text/html", charset="UTF-8");
- get提交数据的时候乱码问题,get请求的数据实在请求行上提交的,不是在请求体上提交的
file:///F:/Java/webServer_tomcat/apache-tomcat-9.0.56/webapps/docs/config/http.html
-
URIEncoding
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. The default value is UTF-8
. -
tomcat9的connector便签的URIEncoding默认值是UTF-8
F:\Java\webServer_tomcat\apache-tomcat-9.0.56\conf\server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 解决方案:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
注意:在Tomcat8之后,URIEncoding的默认值就是UTF-8,使用Tomcat8之后的版本get请求就不会乱码