对比jsp、servlet、dispatcherServlet

1,三者区别

  1. Servlet技术出现的最早,Servlet使用输出流(OutputStream)动态生成HTML页面。
    编写servlet类,将servlet类配置到web.xml中,指定映射。

     streamServlet
     com.hzq.demo.StreamServlet
 
 
     streamServlet
     /stream/*
 
package com.hzq.demo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by hzq on 2017/9/7.
 */
public class StreamServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletOutputStream outputStream = response.getOutputStream();//1字节流
        //out.print("使用字节流输出中文会出现乱码");
        outputStream.write("必须将字符转换成字节".getBytes());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter printWriter = response.getWriter();
        printWriter.println("这是字符流");
    }

}

  1. JSP是Servlet的扩展,也是Servlet的一种简化。Servlet容器(如tomcat)会生成对应的Servlet。eg:pack_005fstatus_jsp.class pack_005fstatus_jsp.java。当访问这个jsp页面时,实际是是在访问Servlet。
    JSP页面生成的Servlet放在work路径对应的Web应用下。
public final class pack_005fstatus_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent{
    //....
  //HttpJspBase,抽象类,继承了httpservlet实现了httpJspPage接口。
}

//在tomcat的jar包jasper中
public abstract class HttpJspBase extends HttpServlet
        implements HttpJspPage {
    private static final long serialVersionUID = 1L;

    public final void init(ServletConfig config)
            throws ServletException {
        super.init(config);
        jspInit();
        _jspInit();
    }

    public String getServletInfo() {
        return Localizer.getMessage("jsp.engine.info");
    }

    public final void destroy() {
        jspDestroy();
        _jspDestroy();
    }

    public final void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        _jspService(request, response);
    }

    public void jspInit() {
    }

    public void _jspInit() {
    }

    public void jspDestroy() {
    }

    protected void _jspDestroy() {
    }

    public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
            throws ServletException, IOException;
}
对比jsp、servlet、dispatcherServlet_第1张图片
image.png
  1. DispatcherServlet 是Spring MVC的入口,在调用完controller的方法之后,会进行视图渲染。(解析jsp会使用到 InternalResourceViewResolver)。
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//处理视图mv
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
//最后也会通过response写入输出流中。

//thymeleaf
viewTemplateEngine.process(templateName, processMarkupSelectors, context, response.getWriter());

//jsp
Map mergedModel = createMergedOutputModel(model, request, response);
        prepareResponse(request, response);
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);

2,servet相关配置

  1. DispatcherServlet的配置简介

  dispatcherServlet
  
  org.springframework.web.servlet.DispatcherServlet
  
  1
  

  
  dispatcherServlet
  /

/,也能拦截js,css,png等静态资源的访问。
/ 是tomcat默认的tomcat,能处理静态资源和文件下载等,当我们配置了"/",会覆盖掉tomcat中的default servlet,所以springMVC中需要手动配置静态资源。

/**
     * 配置静态资源的访问。 tomcat中需要增加DefaultServlet,SpringMVC需要增加mvc:resources标签
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/admin/statics/**").addResourceLocations("/resources/statics/");
        super.addResourceHandlers(registry);
//使用ResourceHttpRequestHandler处理,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中
    }



2)如果配置了/*,返回jsp页面,还会再次被拦截,这样导致404错误。
使用tomcat默认的default Servlet


  default
  *.jpg
  
  
  default
  *.js
  
  
  default
  *.css

你可能感兴趣的:(对比jsp、servlet、dispatcherServlet)