原来我们每个请求要写一个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请求,怎么处理请求携带的参数。怎么处理返回页面和返回数据,然后再去理解廖大的代码就很容易多了。
Sign in to make a reply
Loading...
原来我们每个请求要写一个servlet,去处理请求和返回的数据。
现在我们想这么搞,把所有请求通过一个dispatchers去处理,就像廖大画的这样,统一处理请求,统一返回数据
每一个路径对应一个controller,这种数据结构当然选Map(k,v)
然后再往上加东西就好了,加的时候又会碰到各种问题,根据路径去找对应的转发器的时候,这个时候转发器还是空的。是不是应该提前初始化?这就引出HttpServlet里的init方法,怎么区分get请求,post请求,怎么处理请求携带的参数。怎么处理返回页面和返回数据,然后再去理解廖大的代码就很容易多了。