Discuss / Java / 分享一下我看时候的思路,由简及繁。

分享一下我看时候的思路,由简及繁。

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

原来我们每个请求要写一个servlet,去处理请求和返回的数据。

@WebServlet(urlPatterns = "/index")
public class HelloServlet extends HttpServlet {
    doget(){处理请求数据};
    dopost(){返回数据}
}

@WebServlet(urlPatterns = "/signin")
public class SignInServlet extends HttpServlet {
    doget(){处理请求数据};
    dopost(){返回数据}
}

现在我们想这么搞,把所有请求通过一个dispatchers去处理,就像廖大画的这样,统一处理请求,统一返回数据

   HTTP Request    ┌─────────────────┐
──────────────────>│DispatcherServlet│
                   └─────────────────┘
                            │
               ┌────────────┼────────────┐
               ▼            ▼            ▼
         ┌───────────┐┌───────────┐┌───────────┐
         │Controller1││Controller2││Controller3│
         └───────────┘└───────────┘└───────────┘
               │            │            │
               └────────────┼────────────┘
                            ▼
   HTTP Response ┌────────────────────┐
<────────────────│render(ModelAndView)│
                 └────────────────────┘

每一个路径对应一个controller,这种数据结构当然选Map(k,v)

@WebServlet(urlPatterns = "/")
public class DispatchServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //所有get请求都交给process去处理。
        process(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //所有post请求都交给process去处理。
       process(req, resp);
    }
  	private void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取到路径;
		String path = req.getRequestURI();
       //从大map里获取到路径对应的dispatch(转发器)
		AbstractDispatcher dispatcher = dispatcherMap.get(path);
        //如果没有找到路径对应的dispatch返回空
		if (dispatcher == null) {
			resp.sendError(404);
			return;
		}
       //我们在dispatch里面定义一个方法去具体处理请求,比方我们把用户的邮箱密码给这个invoke,他会把处理好
       //的数据,比方应该返回哪个页面,页面上包含的用户的详细信息.包装成一个ModelView对象给我们
       //mv.view可以拿到要给用户返回哪个页面的页面路径,mv.model可以拿到用户具体信息
		mv = dispatcher.invoke(req, resp);
	    //调用输出流
		PrintWriter pw = resp.getWriter();
        //this.viewEngine.render的作用是把用户信息填到页面上,并写入到输出流中所以这里为什么要传入modelview和pw对象,
        //就和最基础的servlet一样writer.wirte("<h1>tom</h1>")
		this.viewEngine.render(mv, pw);
       //然后返回给页面就可以了
		pw.flush();
	}
}

然后再往上加东西就好了,加的时候又会碰到各种问题,根据路径去找对应的转发器的时候,这个时候转发器还是空的。是不是应该提前初始化?这就引出HttpServlet里的init方法,怎么区分get请求,post请求,怎么处理请求携带的参数。怎么处理返回页面和返回数据,然后再去理解廖大的代码就很容易多了。


  • 1

Reply