关于请求域对象和请求跳转

关于请求域对象和请求跳转

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

  • URIEncodingThis 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请求就不会乱码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值