servlet 2.5:
(单体架构使用servlet创建的模板用Java Enterprise,可以指定Tomcat版本,JavaEE版本以及Web)
Tomcat的核心
1 servlet ; 2 jsp引擎
servlet作用:
接受浏览器的url到serlvet
拦截url上 /* 的所有链接到DispatchServlet
<servlet>
<servlet-name>dispatchServlet</servlet-name>
<servlet-class>servlet.DispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatchServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
然后把jsp引擎转译成的java页面返回给浏览器 ,并且转译后jsp页面实现了serlvet接口
此时接收和返回流都受控于servlet
public class Jsp引擎转译后的Jsp页面 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//模拟Servlet (DispatchServlet)经过jsp引擎转译后的java页面到浏览器
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1><%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %></h1>");
writer.println("<h1><html></h1>");
writer.println("<h1><head></h1>");
writer.println("<title>Title</title>");
writer.println("<title>Title</title>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h2>我是页面</h2>");
writer.println("</body>");
writer.println("</html>");
}
}
在springMVC中会指定转译后的jsp页面存放地址
(默认Idea绑定Tomcat后 会采用第三种方式发布项目 即:在config.xml中指定目录存放jsp转译后的文件 一般指定在Idea 的 out 目录下)
servlet 3.0
省略Web.xml配置文件(指定url-pattern和servlet-class)
将url-pattern写在了Servlet注解中
@WebServlet(name = "ServletDemo",urlPatterns = "/*")
public class SerrvletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h2>测试2</h2>");
}
}
实际开发中jsp引擎转译后的jsp页面已经实现了Servlet接口,交由Servlet管控 只需要在Web.xml编写url-pattern和servlet-class, 还可以采用servlet3.0方式 在jsp转译后的java类上添加@WebServlet(....)实现Web.xml的功能
Servlet原理:
url请求经过url-pattern到达指定的servlet-class即Servlet接口实现类(转译后的jsp页面) 实现类中的service方法会把页面信息一行一行的返回给浏览器解析 以上代码模拟出了jsp的转译类如何实现信息到浏览器的返回
(Servlet接口中的service方法在实现类HttpServlet中根据请求方式细分出了doGet和doPost方法)
Servlet接口的生命周期
@WebServlet(urlPatterns ={"/demo12","/demo13","*.do"},loadOnStartup = 1)
public class DispatcherServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet初始化时执行该方法, 若loadOnStartup = 1 则在Tomcat启动时时执行该方法且只执行一次");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("每次访问servlet时执行该方法");
}
@Override
public void destroy() {
System.out.println("关闭服务器时执行该方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
操作Web.xml中 init-param 标签
web.xml中会初始化一些参数 init-param 标签中的代码
<servlet>
<servlet-name>DispacherServlet</servlet-name>
<servlet-class>servlet.DispatcherServletSDemo</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>张三</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>25</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
url请求进入servlet时就携带了 init-param 初始化参数, 需要在servlet中的init方法中获取init-param里的参数
public void init(ServletConfig config) throws ServletException {
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+" :"+value);
}
}
细节
@WebServlet(name = "SerrvletDemo",urlPatterns = "/*")
urlPatterns是一个String类型的数组容器 String[] urlPatterns() default {};
Servlet默认第一次被访问时init会和service方法一起执行, 当loadOnStartup = 1时init方法会在Tomcat启动时执行 会比service方法早执行 (SpringMVC在Web.xml中会设置loadOnStartup =1,使init方法比service方法早执行)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
HttpServletResponse接口继承了ServletResponse接口
public interface HttpServletResponse extends ServletResponse {