对比jsp、servlet、dispatcherServlet

1,三者区别

  1. Servlet技术出现的最早,Servlet使用输出流(OutputStream)动态生成HTML页面。
    编写servlet类,将servlet类配置到web.xml中,指定映射。
<servlet>
     <servlet-name>streamServlet</servlet-name>
     <servlet-class>com.hzq.demo.StreamServlet</servlet-class>
 </servlet>
 <servlet-mapping>
     <servlet-name>streamServlet</servlet-name>
     <url-pattern>/stream/*</url-pattern><!-- 该servlet匹配/stream 开头的url请求 -->
 </servlet-mapping>
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;
}
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<String, Object> mergedModel = createMergedOutputModel(model, request, response);
        prepareResponse(request, response);
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);

2,servet相关配置

  1. DispatcherServlet的配置简介
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<url-pattern>/</url-pattern>,也能拦截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中
    }
<mvc:resources location="/resources/admin/images/" mapping="/admin/images/**"/>
<mvc:resources location="/resources/admin/styles/" mapping="/admin/styles/**"/>
<mvc:resources location="/resources/admin/javascript/" mapping="/admin/javascript/**"/>

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

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
</servlet-mapping>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容