目录
在学习servlet之前我们学到了Tomcat服务器,那么首先我们复习一下Tomcat服务器相关知识;
Tomcat服务器相关知识点
-
Tomcat服务器是一款免费且开源的轻量级web服务器;
在安装Tomcat服务器之前我们要做的事:
在此之前我们需要在电脑上安装Java,因为Tomcat服务器是用纯Java代码完成的,所以要想使用Tomcat服务器就必须有Java环境; 如何查看自己是否安装了JavaJDK呢?
-
在终端输入Java,看是否能出现Java相关东西。然后还可以输入java version查看Java的版本;
Tomcat下载与安装
-
在官网Apache Tomcat® - Welcome!下载并安装,官网下载会比较慢属于正常现象;
-
进行环境变量配置,右键此电脑打开属性后打开高级属性在系统变量中新建系统变量,后再path中新建环境变量并保存;
-
系统变量: 变量名:CATALINA_HOME 变量值:解压后的路径 环境变量: %CATALINA_HOME%\bin
-
-
然后在DOS命令窗口检验是否安装成功;
-
startup.bat 启动Tomcat服务器命令; shutdown.bat 关闭Tomcat服务器命令;
-
这里我们建议将shutdown.bat文件的文件名改为stop.bat;
-
-
这里可能会出现闪退问题,和乱码问题;
-
问题一解决办法:
-
造成这个的原因有很多,最常见的是Tomcat服务器的版本和Java版本不匹配;
-
还有一个就是环境变量配置出错;
-
-
问题二解决办法:
-
设置一下编码格式
-
-
如何在idea中关联Tomcat服务器
-
首先新建一个工程,并创建一个modules;
-
在工程的窗口右上角有个蓝色锤子,点开之后左上角点击加号添加local,本地的Tomcat包;
-
然后在配置页面配置相关设置;
-
之后可以使用debug的方式启动服务器;
编写一个自己的servlet
-
新建工程(new project),创建模块(modules);
-
在modules下的src中创建包,然后在包下编写servlettest类并继承HttpServlet类重写方法;
-
将业务代码写在service方法中;
-
为模块添加框架支持;
-
在WEB-INF下创建lib文件夹,并将JDBC驱动jar包导入;
-
需要用的jar包导入到lib后,此时还未能真正使用jar包相关依赖,
-
如果是在 IDAE 上,需要在导入的jar包点击鼠标右键在最下方点击 add as library,发现jar包前有个小三角符号后才代表jar包的相关依赖可以在项目中使用。
-
-
然后在WEB-INF下的web.xml文件中,注册servlettest类(请求路径和Servlet之间对应起来)示例如下:
<servlet> <servlet-name>ServletTest</servlet-name> <servlet-class>com.lypcode.javaweb.servlet.ServeletTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletTest</servlet-name> <url-pattern>/servlet/student</url-pattern> </servlet-mapping>
servlet—HTTPservlet是如何过度的
-
在刚开始我们编写一个自己的servlettest 需要继承Jakarta包下的Servlet类,然后重写其中的五个方法,但是其中的四个方法我们并不会去修改,意思也就是说五个方法中只有一个方法是我们所需要的,此时我们想到使用适配器设计模式,创建一个GenericServlet抽象类来过渡;
-
其中我们让GenericServlet抽象类实现Servlet接口,实现init();destory();getServletConfig();getServleInfo();然后将service方法设置成抽象方法;然后添加一个空参构造函数;
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
ServletConfig
-
ServletConfig是init()方法中的参数,是servlet对象的配置信息对象;
-
一个servlet对象对应一个ServletConfig,servletconfig对象是由Tomcat服务器创建并在调用init方法之前传递给init方法;
-
常用方法:
public String getInitParameter(String name); // 通过初始化参数的name获取value public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name public ServletContext getServletContext(); // 获取ServletContext对象 public String getServletName(); // 获取Servlet的name
-
ServletConfig对象中存储<servlet>。。。</servlet>中的配置信息;
<servlet> <servlet-name>ServletTest</servlet-name> <servlet-class>com.lypcode.javaweb.servlet.ServeletTest</servlet-class> </servlet>
servletcontext
-
ServletContext是ServletConfig对象的方法的参数;
-
ServletContext对象被称为servlet上下文对象(servlet对象的四周环境对象)、一个ServletContext对象通常对应的是一个web.xml文件;
-
ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。ServletContext对象是应用级对象。
-
ServletContext接口中有哪些常用的方法:
public String getInitParameter(String name); // 通过初始化参数的name获取value public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
servletcontext对象中存储<context-param>。。。</context-param>中的信息;
<!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配置信息--> <context-param> <param-name>pageSize</param-name> <param-value>10</param-value> </context-param> <context-param> <param-name>startIndex</param-name> <param-value>0</param-value> </context-param> <!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中。--> <!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->
-
servletcontext细节;
// ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域) // 如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中 // 为什么是所有用户共享的数据? 不是共享的没有意义。因为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。 // 为什么数据量要小? 因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。 // 为什么这些共享数据很少的修改,或者说几乎不修改? // 所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。 // 数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。 // 存(怎么向ServletContext应用域中存数据) public void setAttribute(String name, Object value); // map.put(k, v) // 取(怎么从ServletContext应用域中取数据) public Object getAttribute(String name); // Object v = map.get(k) // 删(怎么删除ServletContext应用域中的数据) public void removeAttribute(String name); // map.remove(k)
-
-
注意:以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它是专门为HTTP协议准备的一个Servlet类。我们编写的Servlet类要继承HttpServlet。(HttpServlet是HTTP协议专用的。)使用HttpServlet处理HTTP协议更便捷。
-
继承结构:
jakarta.servlet.Servlet(接口)【爷爷】 jakarta.servlet.GenericServlet implements Servlet(抽象类)【儿子】 jakarta.servlet.http.HttpServlet extends GenericServlet(抽象类)【孙子】 我们以后编写的Servlet要继承HttpServlet类。