writedby 张艳涛,在学第9章session的时候,做了个实验在给的demo代码中添加了

package com.zyt.tomcat.ex09.core;

public class SimpleWrapperValve implements Valve, Contained {

    protected Container container;

    public void invoke(Request request, Response response, ValveContext valveContext)
throws IOException, ServletException { SimpleWrapper wrapper = (SimpleWrapper) getContainer();
ServletRequest sreq = request.getRequest();
ServletResponse sres = response.getResponse();
Servlet servlet = null;
HttpServletRequest hreq = null;
if (sreq instanceof HttpServletRequest)
hreq = (HttpServletRequest) sreq;
HttpServletResponse hres = null;
if (sres instanceof HttpServletResponse)
hres = (HttpServletResponse) sres; //-- new addition -----------------------------------
Context context = (Context) wrapper.getParent();
request.setContext(context);
//-------------------------------------
// Allocate a servlet instance to process this request
try {
servlet = wrapper.allocate();
if (hres!=null && hreq!=null) {
servlet.service(hreq, hres);
}
else {
servlet.service(sreq, sres);
}
}
catch (ServletException e) {
}
} public String getInfo() {
return null;
} public Container getContainer() {
return container;
} public void setContainer(Container container) {
this.container = container;
}
}

当看看11章的时候,使用 StandardWrapper,再次调用

        System.setProperty("catalina.base", System.getProperty("user.dir"));
HttpConnector connector = new HttpConnector();
StandardWrapper wrapper1 = new StandardWrapper();
wrapper1.setName("Primitive");
wrapper1.setServletClass("PrimitiveServlet");
wrapper1.setDebug(2); StandardWrapper wrapper2 = new StandardWrapper();
wrapper2.setName("Modern");
wrapper2.setServletClass("ModernServlet");
wrapper2.setDebug(2); Wrapper wrapper3 = new StandardWrapper();
wrapper3.setName("SessionZYT");
wrapper3.setServletClass("SessionServletZYT");
//wrapper3.setDebug(2); Context context= new StandardContext();
context.setPath("/myApp");
context.setDocBase("myApp"); LifecycleListener listener = new SimpleContextConfig();
((Lifecycle) context).addLifecycleListener(listener); context.addChild(wrapper1);
context.addChild(wrapper2);
context.addChild(wrapper3);
context.addServletMapping("/myApp/SessionZYT","SessionZYT");

这是如果你调用/myApp/SessionZYT  会报错,追随代码的时候发现了request对象没有context成员变量,所以

SessionServletZYT 类编译了,放在app目录下
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter; public class SessionServletZYT extends HttpServlet implements SingleThreadModel {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("SessionServlet -- service");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>SessionServlet</title></head>");
out.println("<body>");
String value = request.getParameter("value");
HttpSession session = request.getSession(true);
out.println("<br>the previous value is " +
(String) session.getAttribute("value"));
out.println("<br>the current value is " + value);
session.setAttribute("value", value);
out.println("<br><hr>");
out.println("<form>");
out.println("New Value: <input name=value>");
out.println("<input type=submit>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}

这句报错,要通过request.getContext() -->再次context.getManager(),查了半天也没答案,所以看到13章host就找到了设置的地方了

StandardHostMapper类中
public Container map(Request request, boolean update) {
// Has this request already been mapped?
if (update && (request.getContext() != null))
return (request.getContext()); // Perform mapping on our request URI
String uri = ((HttpRequest) request).getDecodedRequestURI();
Context context = host.map(uri); // Update the request (if requested) and return the selected Context
if (update) {
request.setContext(context);
if (context != null)
((HttpRequest) request).setContextPath(context.getPath());
else
((HttpRequest) request).setContextPath(null);
}
return (context); }

标记的就是 给request 设置了context的了

最新文章

  1. php:Header
  2. GCC选项
  3. UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本
  4. Nginx 开启PATHINFO支持ThinkPHP框架实例
  5. SharpZipLib要支持unicode的文件名称
  6. Netsharp产品标识自定义设置:产品名称、版权、LOGO等
  7. ace-min.css
  8. (一)u-boot2013.01.01 for TQ210:《Uboot简介》
  9. BZOJ 1067 降雨量
  10. twemproxy 简介
  11. 极光推送CTO黄鑫:技术人员要建立自己的知识图谱
  12. (转)$.extend()方法和(function($){...})(jQuery)详解
  13. redis bind的坑
  14. 如何在C#Asp.Net MVC使用Redis缓存
  15. 【原创】从策略模式闲扯到lambda表达式
  16. 解决samtools报错:[main_samview] region &quot;chr2:20,100,000-20,200,000&quot; specifies an unknown reference name. Continue anyway.
  17. ListBox、ListCtrl
  18. linux下memcached安装 和redis安装,jdk,tomcat,mysql 安装
  19. 一致性 hash 算法(转)
  20. OK335xS-Android pack-ubi-256M.sh hacking

热门文章

  1. Linux命令大全之查看登陆用户信息
  2. 为什么catch了异常,但事务还是回滚了?
  3. 每日三道面试题,通往自由的道路10——JMM篇
  4. 配置中心之Nacos简介,使用及Go简单集成
  5. 32、JavaScript介绍
  6. Docker:虚拟机挂起后,再启动docker容器连接失败
  7. 6-x2 echo命令:将指定字符串输出到 STDOUT
  8. WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率
  9. konga的初步使用
  10. QT单进程下载