springmvc 页面传值过程

来源:互联网 发布:好看的单眼皮女生知乎 编辑:程序博客网 时间:2024/05/21 21:49


1.浏览器请求   localhost/index.do, 进入DispatcherServlt,调用doService()


2.controller,添加Object

public class IndexController {@Autowiredprivate CategoryService categoryService;@Autowiredprivate ProductService productService;@RequestMapping("/index.do")public ModelAndView index(HttpServletRequest request){ModelAndView  mav = new ModelAndView();int is_hot = 1;List<Product> hotProducts = this.productService.findByHot(is_hot);mav.addObject("hotProducts", hotProducts);List<Product> newProducts = this.productService.findByNew();mav.addObject("newProducts", newProducts);mav.setViewName("/web/index");return mav;}}

3.doDispatch(),获取ModelAndView

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;boolean multipartRequestParsed = false;WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);try {ModelAndView mv = null;Exception dispatchException = null;try {processedRequest = checkMultipart(request);multipartRequestParsed = (processedRequest != request);// Determine handler for the current request.mappedHandler = getHandler(processedRequest);if (mappedHandler == null || mappedHandler.getHandler() == null) {noHandlerFound(processedRequest, response);return;}// Determine handler adapter for the current request.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// Process last-modified header, if supported by the handler.String method = request.getMethod();boolean isGet = "GET".equals(method);if (isGet || "HEAD".equals(method)) {long lastModified = ha.getLastModified(request, mappedHandler.getHandler());if (logger.isDebugEnabled()) {logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);}if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {return;}}if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// Actually invoke the handler.mv = ha.handle(processedRequest, response, mappedHandler.getHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;}applyDefaultViewName(request, mv);mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) {triggerAfterCompletion(processedRequest, response, mappedHandler, ex);}catch (Error err) {triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);}finally {if (asyncManager.isConcurrentHandlingStarted()) {// Instead of postHandle and afterCompletionif (mappedHandler != null) {mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);}}else {// Clean up any resources used by a multipart request.if (multipartRequestParsed) {cleanupMultipart(processedRequest);}}}}

4.处理跳转结果


/** * Handle the result of handler selection and handler invocation, which is * either a ModelAndView or an Exception to be resolved to a ModelAndView. */private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {boolean errorView = false;if (exception != null) {if (exception instanceof ModelAndViewDefiningException) {logger.debug("ModelAndViewDefiningException encountered", exception);mv = ((ModelAndViewDefiningException) exception).getModelAndView();}else {Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);mv = processHandlerException(request, response, handler, exception);errorView = (mv != null);}}// Did the handler return a view to render?if (mv != null && !mv.wasCleared()) {render(mv, request, response);if (errorView) {WebUtils.clearErrorRequestAttributes(request);}}else {if (logger.isDebugEnabled()) {logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +"': assuming HandlerAdapter completed request handling");}}if (WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {// Concurrent handling started during a forwardreturn;}if (mappedHandler != null) {mappedHandler.triggerAfterCompletion(request, response, null);}}


5.渲染view,,org.springframework.web.servlet.view.AbstractView

/** * Prepares the view given the specified model, merging it with static * attributes and a RequestContext attribute, if necessary. * Delegates to renderMergedOutputModel for the actual rendering. * @see #renderMergedOutputModel */@Overridepublic void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {if (logger.isTraceEnabled()) {logger.trace("Rendering view with name '" + this.beanName + "' with model " + model +" and static attributes " + this.staticAttributes);}//创建包含动态值和静态属性的MapMap<String, Object> mergedModel = createMergedOutputModel(model, request, response);prepareResponse(request, response);renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);}

6.把addObject()添加的属性,设置到request中

/** * Expose the model objects in the given map as request attributes. * Names will be taken from the model Map. * This method is suitable for all resources reachable by {@link javax.servlet.RequestDispatcher}. * @param model Map of model objects to expose * @param request current HTTP request */protected void exposeModelAsRequestAttributes(Map<String, Object> model, HttpServletRequest request) throws Exception {for (Map.Entry<String, Object> entry : model.entrySet()) {String modelName = entry.getKey();Object modelValue = entry.getValue();if (modelValue != null) {request.setAttribute(modelName, modelValue);if (logger.isDebugEnabled()) {logger.debug("Added model object '" + modelName + "' of type [" + modelValue.getClass().getName() +"] to request in view with name '" + getBeanName() + "'");}}else {request.removeAttribute(modelName);if (logger.isDebugEnabled()) {logger.debug("Removed model object '" + modelName +"' from request in view with name '" + getBeanName() + "'");}}}}

7.jsp页面可通过${requestScope.XXX} 或者${XXX}获取值

<ul class="tabContent" style="display: block;"><c:forEach var="n" items="${requestScope.newProducts}"><li><a href="${ctx }/product/find.do?pid=${n.pid}"><img src="${ctx}/${n.image}" style="display: block;"/></a></li></c:forEach></ul>
<ul class="tabContent" style="display: block;"><c:forEach var="n" items="${hotProducts}"><li><a href="${ctx }/product/find.do?pid=${n.pid}"><img src="${ctx}/${n.image}" style="display: block;"/></a></li></c:forEach></ul>



0 0
原创粉丝点击