scholar--2

URL

url

url

springMVC

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>   <!--   3  <== servlet 名称    -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>   <!--   4  <== servlet 名称    -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>     <!--   5  <== servlet 名称    -->
        classpath:xml/websocket-config.xml
        classpath:xml/springMVC.xml
      </param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>      <!--   2  <== servlet 名称    -->
    <url-pattern>/</url-pattern>  <!--   1  <== url 地址    -->
  </servlet-mapping>

加载


Central dispatcher for HTTP request handlers/controllers, e.g. for web UI controllers
 * or HTTP-based remote service exporters. Dispatches to registered handlers for processing
 * a web request, providing convenient mapping and exception handling facilities.
相当于把一个http请求分配给handlers/controllers


@Override
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
       ...
        FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
        if (inputFlashMap != null) {
            request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
        }
        request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
        request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, this.flashMapManager);

        try {
            doDispatch(request, response);  // 这个是重点
        }
        finally {
            if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted()) {
                // Restore the original attribute snapshot, in case of an include.
                if (attributesSnapshot != null) {
                    restoreAttributesAfterInclude(request, attributesSnapshot);
                }
            }
        }
    }

// 这个是重点
doDispatch(HttpServletRequest request, HttpServletResponse response) {
   ...
}


我晕了,并没看懂,上面:

大概是会将 所有请求拦截,然后分配给对应的 控制器 controller

DispatcherServlet: 会初始化两个参数

init-param 'contextConfigLocation'
WebApplicationContext webApplicationContext 《 == 注意这个 设为 A

DispatcherServlet 继承了 servlet. httpservlet 类(熟悉了吧)

init()

public final void init() throws ServletException {
        if (logger.isDebugEnabled()) {
            logger.debug("Initializing servlet '" + getServletName() + "'");
        }

        // Set bean properties from init parameters. 初始化一些参数
        try {
            PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
            ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
            initBeanWrapper(bw);
            bw.setPropertyValues(pvs, true);
        }
        catch (BeansException ex) {
            logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
            throw ex;
        }

        // Let subclasses do whatever initialization they like.  注意这个!!!!
        initServletBean();

        if (logger.isDebugEnabled()) {
            logger.debug("Servlet '" + getServletName() + "' configured successfully");
        }
    }

@Override
    protected final void initServletBean() throws ServletException {
        getServletContext().log("Initializing Spring FrameworkServlet '" + getServletName() + "'");
        if (this.logger.isInfoEnabled()) {
            this.logger.info("FrameworkServlet '" + getServletName() + "': initialization started");
        }
        long startTime = System.currentTimeMillis();

        try {
                      // 这里: A   Initialize and publish the WebApplicationContext for this servlet.
            this.webApplicationContext = initWebApplicationContext();
            initFrameworkServlet();
        }
        catch (ServletException ex) {
            this.logger.error("Context initialization failed", ex);
            throw ex;
        }
        catch (RuntimeException ex) {
            this.logger.error("Context initialization failed", ex);
            throw ex;
        }

        if (this.logger.isInfoEnabled()) {
            long elapsedTime = System.currentTimeMillis() - startTime;
            this.logger.info("FrameworkServlet '" + getServletName() + "': initialization completed in " +
                    elapsedTime + " ms");
        }
    }

妹子四连:

先说简单的

  1. 为啥要跳转到post jsp?

因为这是展示页面,这是与用户交互的地方;
它是如何跳过去的, 这个要看源码

 Every view name returned from a handler will be translated to a JSP
* resource (for example: "myView" -> "/WEB-INF/jsp/myView.jsp"), using
* this view class by default. 

大致是会对路径进行拼接


/**
     * A convenience constructor that allows for specifying {@link #setPrefix prefix}
     * and {@link #setSuffix suffix} as constructor arguments.
     * @param prefix the prefix that gets prepended to view names when building a URL
     * @param suffix the suffix that gets appended to view names when building a URL
     * @since 4.3
     */
    public InternalResourceViewResolver(String prefix, String suffix) {
        this();
        setPrefix(prefix);
        setSuffix(suffix);
    }


protected AbstractUrlBasedView buildView(String viewName) throws Exception {
        AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(getViewClass());
        view.setUrl(getPrefix() + viewName + getSuffix()); 《=== here

  1. 为啥要在jsp里foreachpost?

这里用的是 jsp 的标签库,如果是原生的话大概是:很不方便,所以引入了 jsp 标签库

    
     <%@ page import="com.hsjfans.scholar.entity.Post" %>
     <%@ page import="java.util.List" %>
    <%@ page import="javafx.geometry.Pos" %>
     <% List<Post> posts= (List<Post>) request.getAttribute("posts");
                            if(posts!=null){ 
                                  for(Post post:posts) {
              %>
                 <time datetime="<%=post.getCreateTime()%>"><%=post.getCreateTime()%>
                     </time>
                       
              <%}}%>
  1. 为啥会return json?

@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用;
在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。例如,异步获取 json 数据,加上 @Responsebody 注解后,就会直接返回 json 数据。
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象

这个问题就很有内涵了?

下面这个方法有没有印象: 其实 @Responsebody 注解就类似这个方法,它一般用于与 ajax交互使用



 @RequestMapping(value = "/sd")
    private void test(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter writer=response.getWriter();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("laaal","meizihao");
        writer.print(jsonObject.toString());
    }

/**
 *  上传图片 界面
 *  /jsp/addsubscribe.jsp 中的内容
 *  以下字段未被参数化,请严格使用
 *  ImgPr 展示图片的 id
 *  <img id="ImgPr" width="120" height="120"  />
 *  avatar  表单中的 logo或头像信息输入框 id
 *  <input type="text" class="form-control" id="avatar" name="avatar" readonly  >
 * @param url  get 或 post 的 url
 * @param domId 代表form 表单的 id

 *
 */
//选择图片后无需点击上传,直接上传图片
function updataFile(url,domId,uploadId){
    // 提交表单
    $('#'+domId).ajaxSubmit({
        url : url, // 请求的url
        type : "post", // 请求方式
        dataType : "json", // 响应的数据类型
        async :true, // 异步
        success: function (data) {
            if(data.url!=null){
                $("#ImgPr").attr('src',data.url)
                $('#'+uploadId).css('display','none')
                $("#avatar").attr('value',data.url)
            }else {
                alert(data.error)
            }

        },
        error : function(status){
            alert("服务器连接出错,请稍后重试...")
        }
    });
}

4 .嗯嗯我就是流程没搞明白?

最好的办法是debug 启动一下,加断点 然后看参数传递;

  1. 关于jsp像 servlet内传参:

    1. 类似于以前的servlet方法可以获取:
      取参数
     @RequestMapping(value = WebInfo.EDIT,method = RequestMethod.GET)
       private String editPost(@RequestParam(value = "id") Long id, Model model)...
        
      可以改写成:
        @RequestMapping(value = WebInfo.EDIT,method = RequestMethod.GET)
       private String editPost( Model model){...
         Long id=Long.valueOf(request.getParameter("id"));  
         @RequestParam 类似于 定义参数,还可以定义类型
    
        Model 类似于 request.setAttribute(); 
        然后 还有一个 ModelAndView(),类似 不过 它要配置一个 view 相当与  页面地址(也可以跳转)
     
    
    1. @PathVariable: url参数注解, 一般用于从url中获取参数:、
        @RequestMapping(value = "/{domain}",method = RequestMethod.POST)
         @ResponseBody
         private String replyMessage(HttpServletRequest request,@PathVariable(value = "domain") String domain){
    
             log.info(" 被动回复消息...");
              Map<String,Object> params=new HashMap<>();
             params.put("domain",domain);
       
    

以前没有jsp的时候,我们写页面都是在servlet中拼的字符串;
其实jsp就是servlet

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,313评论 1 92
  • Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servl...
    alexpdh阅读 2,638评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 今天看了休叔的电影,感觉结尾有点太惨烈了,整个电影氛围就是很压抑的一种感觉,不过最后还是有新人接过了传承。 看完这...
    ascetic阅读 153评论 0 0
  • 3学号:33 ID:剑眉三指宽 LOL是美国拳头公司开发的一款moba类游戏。游戏分为红色方和蓝色方两个队伍,每个...
    剑眉三指宽阅读 525评论 0 0