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("这是字符流");
}
}
- 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
- 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相关配置
- 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>