Servlet的基础配置
servlet是一种相对动态的web开发技术,对于用户输入不同的参数,可以得到不同的输出结果,因此我们说servlet是相对动态的,servlet在实际web开发时,也以动态开发为主。对于servlet而言,实际上它是javaee的十三个规范之一,我们在进行开发的时候,通常首先要有一个关于它的实现类(继承servlet接口)。
servlet的简单演示(试着练习两边)
-
在中导入servlet的相关依赖坐标:
<dependency> <groupId></groupId> <artifactId>-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
定义一个类,实现servlet接口,并且重写接口中的方法(主要是servlet方法),并在servlet方法中加入一些输出语句,并在实现类的基础上加上注释@WebServlet(访问的最后路径)
@WebServlet("/helloWorld") public class myServlet 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() {} }
-
最后启动Tomcat(我这里安装的是本地的Tomcat服务器)即可,在浏览器的url中输入相应的访问路径。
-
注意事项:
有时候,我们打开了完成了servlet的相关部署,但是却并不能运行自己的java代码,这一点在已经部署完成servlet相关坐标后即将要运行实现servlet的实现类的时候,特别需要注意,对于控制台会显示出"java5无法运行"的字样,对于这一点我们可以在中导入如下配置,即可解决版本问题:(需要注意我的jdk版本是十七,需要先调节成为自己的jdk版本)
<properties> <>17</> <>17</> </properties>
servlet的运行相关机理(包括内部实现与生命周期)
servlet通常是作为一种Web程序的服务,它由Web服务器去执行(我这里用的是本地的Tomcat服务器),servlet由Web服务器去创建,关于servlet方法也是由Web服务器去调用,具体来说Web服务器首先去寻找servlet接口,进而可以寻找到我们创建的servlet实现类,进而它可以找出servlet的方法,然后便可以去执行。
servlet的生命周期可以类比于线程的执行,包括了从出生到死亡的过程,其实主要还是受Web服务器的控制,一般来说有:
servlet受Web服务器的响应开始执行实现接口化
初始化阶段:servlet对象生成以后,要先进行初始化操作,完成一些初始化操作,这个过程由servlet中的init()方法完成,且该方法仅仅调用一次
init()方法一般会在启动服务的时候调用一次,完成初始化,默认情况下,它会在启动的时候调用。但是这个参数是可以调整的,要是想要它的运行效率更高一些,我们可以让这个初始化的过程提前就完成操作(在servlet项目启用之前) 在@WebServlet()中加入loadOnStartup 参数,使其大于等于0即可(默认情况下是小于0的)
下面演示代码与运行过程:默认
package ServletDemo;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(urlPatterns = "/helloWorld")
public class myServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我永远维护~不顾个人");
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("万岁~");
}
//还有其他方法一定需要重写,在这里暂且忽略
//运行结果:
我永远维护~不顾个人
万岁~
[2022-09-23 11:31:21,523] 工件 Tomcat-MavenWeb:war: 正在部署工件,请稍候…
[2022-09-23 11:31:21,524] 工件 Tomcat-MavenWeb:war exploded: 正在部署工件,请稍候…
[2022-09-23 11:31:22,141] 工件 Tomcat-MavenWeb:war: 工件已成功部署
[2022-09-23 11:31:22,141] 工件 Tomcat-MavenWeb:war: 部署已花费 618 毫秒
[2022-09-23 11:31:22,276] 工件 Tomcat-MavenWeb:war exploded: 工件已成功部署
[2022-09-23 11:31:22,276] 工件 Tomcat-MavenWeb:war exploded: 部署已花费 752 毫秒
23-Sep-2022 11:31:31.378 信息 [localhost-startStop-1] 把web 应用程序部署到目录 [D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\manager]
23-Sep-2022 11:31:31.501 信息 [localhost-startStop-1] Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\manager]的部署已在[121]毫秒内完成
我永远维护~不顾个人
下面演示代码与运行过程:在servlet项目正式启动之前就先进行初始化
package ServletDemo;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//提前初始化,就是使得loadOnStartup >= 0 即可,默认是负整数
@WebServlet(urlPatterns = "/helloWorld",loadOnStartup = 1)
public class myServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我永远维护~不顾个人");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("万岁~");
}
//还有其他方法一定需要重写,在这里暂且忽略
}
[2022-09-23 12:01:47,559] 工件 Tomcat-MavenWeb:war: 正在部署工件,请稍候…
[2022-09-23 12:01:47,559] 工件 Tomcat-MavenWeb:war exploded: 正在部署工件,请稍候…
我永远维护~不顾个人
[2022-09-23 12:01:48,128] 工件 Tomcat-MavenWeb:war: 工件已成功部署
[2022-09-23 12:01:48,128] 工件 Tomcat-MavenWeb:war: 部署已花费 570 毫秒
我永远维护~不顾个人
[2022-09-23 12:01:48,263] 工件 Tomcat-MavenWeb:war exploded: 工件已成功部署
[2022-09-23 12:01:48,263] 工件 Tomcat-MavenWeb:war exploded: 部署已花费 704 毫秒
若将loadOnStartup参数调成非负数,则在Web服务器启动阶段就完成了servlet的初始化init(),不用打开相关的Web项目。
对于整个Servlet生命周期中,我们最需要的就是Servlet接口调用servlet方法,当我们访问浏览器时,就会执行相应的相关的servlet方法,每次访问浏览器时,都会访问一遍相关方法。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("万岁~");
}
最后我们要关闭项目(正常的关闭),需要调用destory方法,相当于一个清理资源的作用。
servlet的简单架构
-
一个常见的方法getServletConfig方法
@Override public ServletConfig getServletConfig() {return null;} //可以看到用来生成一个ServletConfig对象
-
servlet的体系结构
其作用是用来简化servlet的开发,servlet中只有servlet方法会经常调用,所以我们寻找一种更加简单的代码编写方式。Servlet其实就是一种接口,一个Servlet体系的最根本的接口,开发人员为了简化使用它进行开发,已经定义了属于它的专有实现类,比如GenericServlet(Servlet抽象实现类),HttpServlet(对HTTP进行过封装的servlet实现类)
开发Web项目是需要基于HTTP协议的,所以我们会借助HttpServlet来简化我们的开发(继承这个类),范例如下:
package ServletDemo1; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/helloWeb") public class ServletWeb2 extends HttpServlet { //可以表明两种不同的请求方式 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get...请求方式"); //浏览器用get方式进行请求 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post...请求方式"); //浏览器用post方式进行请求 } }
一般的,默认情况下用的是get请求方式
23-Sep-2022 16:54:30.486 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb1_war]的部署已在[79]毫秒内完成 23-Sep-2022 16:54:30.486 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb_war] 23-Sep-2022 16:54:30.574 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\迅雷下载\apache-tomcat-8.5.82-windows-x64\apache-tomcat-8.5.82\webapps\Tomcat_MavenWeb_war]的部署已在[88]毫秒内完成 get...请求方式 get...请求方式
我们也可以利用post请求方式(效果更好)
首先创建一个html文件,加上表单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>子网站</title> </head> <body> <!--加载一个图片--> <img src="" height="400" width="200"> <!--添加一个请求路径,浏览器将输出的东西通过请求发送给服务器,服务器接收后做出响应--> <!--请求的方式是post请求--> <form action="http://localhost:8080/MavenWeb_Tomcat_war/helloWeb" method="post"> <input name="username"><input type="submit"> </form> </body> </html>
然后启动Web程序,借助其中内置的servlet启动运行机制,进而帮助我们将浏览器中的数据传给后台进行处理,传递时进行请求,而请求的方式就是post方式。不同的请求方式对应不同的处理逻辑。HttpServlet的使用:1.继承HttpServlet 2.重写doGet和doPost的方法,doGet方法来写相应的Get请求的逻辑语句,doPost方法来写相应的Post请求的逻辑语句。
servlet相关的urlPatten配置
-
servlet中一个Servlet可以配置多个urlPatten
urlPatten存在于@WebServlet()之中是用来配置不同的访问路径的比如: @WebServlet(urlPatten={“demo1”,“demo2”})
@WebServlet({"/Get","/Post"}) public class ServletWeb3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("do GET..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("do Post..."); } }
的配置规则
1.精确匹配:精确匹配是我们最为常用的一种方式,把需要在浏览器扩展的目录名称全部写出来,写到@WebServlet()中去,这是企业开发中最为常见的一种匹配方式
2.目录匹配(/确定的目录/任意的目录) 3.扩展名匹配(任意的路径.固定的扩展名) 4.任意匹配(“/”,“/*”)(最好别用)