Servlet笔记
什么时Servlet
- Servlet 是运行在服务器端的小程序
- Servlet在java中就是一个接口,定义了浏览器访问tomcat的规则
- Servlet : Server appleet
快速入门
-
创建一个JavaEE项目
-
定义一个类,且该类必须实现Servlet接口中的抽象方法
public interface Servlet { void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy(); }
-
配置Servlet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYfAYmPj-1638320462743)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129093704451.png)]
在浏览器中输入
http://localhost:8080/servlet_01/test1
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello,servlet");
}
控制台
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITTcqy0t-1638320462747)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129095057887.png)]
Serverlet执行原理
1.浏览器解析
http://localhost:8080/servlet_01/test1
localhost: 本机
8080端口号:tomcat
servlet_01:项目名称
test1:xml文件中的/test1
2.xml映射
执行如下4步
1浏览器通过test1找到该路径
2通过该路径找到名字为test1的servlet程序
3通过该名字找到对应的全类路径
4通过这个全类路径,在tomcat服务器中,使用Class.forName(com.shun.web.ServletTest1)
造出对应的对象,再调用service.invok(),执行service方法中的sout语句
<servlet>
<servlet-name>test1</servlet-name>//3
<servlet-class>com.shun.web.ServletTest1</servlet-class>//4
</servlet>
<servlet-mapping>
<servlet-name>test1</servlet-name>//2
<url-pattern>/test1</url-pattern>//1
</servlet-mapping>
Servlet的生命周期
- 在类被加载的时候调用init方法只会执行一次,
- 在浏览器解析的时候执行service方法,可以被执行多次
- 在关闭服务器的时候调用destroy方法,也是只会执行一次(正常关闭),
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sas0VQ1z-1638320462751)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129105259356.png)]
public class ServletTest2 implements Servlet {
/**
* 再Servlet被创建的时候执行,只执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init方法执行了");
}
/**
* 获得ServletConfig对象
* ServletConfig servlet的配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法,
* 每一次Servlet被访问时,执行,可以执行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service 方法执行了");
}
/**
* 获取servlet的信息,版本
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* Servlet的销毁方法,该方法在服务器正常关闭时执行一次
* 也是只执行一次
*/
@Override
public void destroy() {
System.out.println("destroy方法执行了");
}
可以通过xml配置servletd的创建时机
<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>com.shun.web.ServletTest2</servlet-class>
<!--指定Servlet的创建时机
1.在第一次被访问时创建,当值为负数的时候(也是默认值)
<load-on-startup>-1</load-on-startup>
2在服务器启动时候被创建:设置其中的值大于等于0就行了
<load-on-startup>-1</load-on-startup>
-->
<load-on-startup>1</load-on-startup>
</servlet>
特别说明:一个servlet在内存中只存在一个对象,是单例的多个用户访问时会存在线程安全,所以尽量不要在Servlet中定义成员变量,在方法中定义局部变量就行了,就算定义了也不要定义,或修改
使用注解配置
-
jdk必须大于jdk6
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKfibYGL-1638320462753)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129111328353.png)]
-
实现接口
@WebServlet() public class ServletTest1 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("注解开发"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
点开@WebServlet()注解
@Target({ElementType.TYPE})//表明该注解只能用于描述类、接口(包括注解类型) 或enum声明 @Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 @Documented//生成文档时被保留 public @interface WebServlet { String name() default "";//等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 String[] value() default {};//该属性等价于 urlPatterns 属性。两个属性不能同时使用。 String[] urlPatterns() default {};//指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。 int loadOnStartup() default -1;//指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。 WebInitParam[] initParams() default {};//指定一组 Servlet 初始化参数,等价于<init-param>标签。 boolean asyncSupported() default false;//声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签 String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default "";//该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签 }
- 配置urlPatterns的路径,再通过浏览器http://localhost:8080/servlet_anno/test1刷新,即可完成注解配置,当然也可以使用默认的value,即 @WebServlet("/test1")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNsgy3Qm-1638320462756)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129113153337.png)]
继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G99ndDTJ-1638320462757)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129142757392.png)]
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {
}
public void destroy() {
}
public String getInitParameter(String name) {
return this.getServletConfig().getInitParameter(name);
}
public Enumeration<String> getInitParameterNames() {
return this.getServletConfig().getInitParameterNames();
}
public ServletConfig getServletConfig() {
return this.config;
}
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
}
public String getServletInfo() {
return "";
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public void log(String msg) {
this.getServletContext().log(this.getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
this.getServletContext().log(this.getServletName() + ": " + message, t);
}
//在继承该类的时候只需要重写service方法
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
public String getServletName() {
return this.config.getServletName();
}
}
在HttpServlet类中:对http协议的一种封装
-
该类继承了HttpServlet
-
腹泻了doGet/doPost方法
@WebServlet("/test3") public class ServletTest3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doget"); } //如果传入的是doPost请求则调用不同的方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("dopost"); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avIEH5zk-1638320462758)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144540267.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqmkSeOY-1638320462759)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144633653.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5zswYpt-1638320462760)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129144802306.png)]
Servlet相关配置
urlpartten属性配置规则
-
一个Servlet可以定义多个访问路径
@WebServlet(urlPatterns = {"/test4","/test44","/aaa"}) public class ServletTest4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("test4执行了"); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPeLTX0F-1638320462761)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145446754.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CfwxSmO-1638320462762)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145541293.png)]
-
路径定义规则
1
@WebServlet("/user/test4") public class ServletTest4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("test4执行了"); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFol33nH-1638320462763)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129145949027.png)]
2使用/* 后面写什么都可以
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiOdhjpA-1638320462764)(C:\Users\24913\AppData\Roaming\Typora\typora-user-images\image-20211129150241608.png)]