Tomcat,Servlet学习笔记
Web概念
软件架构
1.C/S:客户端/服务器端
2.B/S:浏览器/服务器端(常用)
服务器可以由浏览器通过【IP,端口,传输协议】访问(请求),内含静态资源,动态资源。
静态资源:所有用户访问后,得到相同的结果,可以直接返回给浏览器(响应)。浏览器内含静态资源解析引擎,可以直接解析静态资源。如html,css,JavaScript(这部分我略过没学)
动态资源:每个用户访问相同资源后,得到不同的结果。动态资源需要转化成静态资源,才能被浏览器解析。如Servlet,jsp,php,asp等
Web服务器软件
服务器:安装了服务器软件的计算机
服务器软件:接收了用户的请求,处理请求,做出响应
Web服务器软件:接收用户的请求,处理请求,做出响应。部署Web项目,让用户通过浏览器来访问Web项目。
常见的Web服务器软件:WebLogic,WebSphere,JBOSS均要收费,Tomcat免费
Tomcat
下载后解压得到文件夹即可。
bin目录:存放可执行文件
conf:存放配置文件
lib:存放依赖的jar包
logs:存放日志文件,可以用来调试程序
temp:临时文件
webapps:存放web项目
work:存放运行时的数据
启动方法:bin目录下,双击startup.bat
我启动的时候遇到了闪退+乱码,通过配置环境变量和更改字符集得到了解决,具体百度上很多。
启动后,不要关闭窗口,打开浏览器输入127.0.0.1:8080或localhost:8080就可以看到tomcat的页面
通过在cmd中输入ipconfig命令可以得到本机IP,我查到的本机IP为192.168.1.107。在浏览器中输入192.168.1.107:8080就可以让别人访问自己的tomcat了。(也可以用别人的IP访问别人的tomcat)
关闭方法:在不关闭startup.bat窗口的情况下,双击执行shutup.bat即可。或者直接按ctrl+C关闭。
部署项目的方式:将项目放到webapps中。
访问:localhost/虚拟目录/资源名.html
1.普通部署
虚拟目录:项目的访问路径(项目文件夹名称)
简化部署方式:将虚拟目录下的资源压缩后,改后缀名为war,将war包直接放到webapps目录中
2.通过配置部署
在conf目录下的server.xml文件中在<Host>标签体写入:<Context docBase = "项目存放路径" path= "虚拟目录"/>
3.热部署
在conf/Catalina/localhost中创建一个xml文件该文件名称就是虚拟目录,在文件中编写
<Context docBase = "项目存放路径"/>
webapps中项目分类:
1.静态项目:html,css,JavaScript等
2.动态项目:动态项目为WEB-INF目录,内含核心配置文件web.xml,class目录(放置字节码文件),lib目录(放置依赖的jar包)
将Tomcat集成到IDEA中:
run—>editorconfigurations—>Templates—>tomcat Server—>loca—>server—>configure—>选择tomcat的安装目录。
然后我们通过创建一个项目,再来使用tomcat部署。
创建项目:在idea中创建一个Java Enterprise的project或module,选择Java EE7,已默认使用tomcat服务器。在下面的列表中勾选Web application。
创建完成后,web-WEB-INF目录中index.jsp,可以写一些内容,然后点绿色三角启动部署。
默认主页为index,故用localhost:8080就可以访问。如果新建新的html文件,就要加上html的文件名(虚拟目录)来访问。
Servlet
通俗的解释:浏览器访问服务器中的动态资源时,需要java代码来表现动态逻辑。这里的java代码是一些特殊的类,依赖于服务器才能运行,由tomcat来执行它们。而这些java类需要遵守一定的规则(接口),才能被tomcat所识别,这些接口就是Servlet。将来我们会自定义一个类,实现Servlet接口,复写其中的方法。
概念:运行在服务器端的小程序
快速入门:
在之前创建好的project的src文件下创建一个包,然后创建一个class,实现Servlet接口,并实现接口中所有的方法。
为了测试,我们在service()方法中打印一行内容。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class servletdemo implements Servlet { 2 3 @Override 4 public void init(ServletConfig servletConfig) throws ServletException { 5 6 } 7 8 @Override 9 public ServletConfig getServletConfig() { 10 return null; 11 } 12 //提供服务的方法 13 @Override 14 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 15 System.out.println("Hello Servlet!"); 16 } 17 18 @Override 19 public String getServletInfo() { 20 return null; 21 } 22 23 @Override 24 public void destroy() { 25 26 } 27 }
在WEB-INF文件夹下的web.xml文件中进行配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 version="3.1"> 6 <!--配置Servlet --> 7 <servlet> 8 <servlet-name>demo</servlet-name> 9 <servlet-class>servlet.servletdemo</servlet-class> 10 </servlet> 11 12 <servlet-mapping> 13 <servlet-name>demo</servlet-name> 14 <url-pattern>/demo</url-pattern> 15 </servlet-mapping> 16 17 </web-app>
运行tomcat服务器后,访问localhost:8080/xxx(xxx为xml中配置的名字,上面配置的叫demo),就可以在idea控制台看到之前打印的内容了。
执行原理:
1.服务器接收到客户端浏览器的请求后,会解析请求URL路径。localhost:8080可以定位到访问的Servlet资源路径
2.查找web.xml文件,是否有对应的<url-pattern>标签体内容,如例子中就由url路径中的demo查到了xml文件中的demo
3.找到对应的<service-class>中配置好的全类名
4.tomcat会将字节码文件加载进内存,并且创建类对象(反射)
5.tomcat调用其方法。在快速入门程序中,就调用了seivice()方法。
Servlet中的生命周期:
1.被创建:执行init()方法,只执行一次
注意:默认情况下,Servlet在第一次被访问时被创建,可以配置创建的时机。
配置方法:在<servlet>标签下配置<load-on-startup>,负数表示第一次被访问时创建,0或正数表示服务器启动时创建。
2.提供服务:执行service()方法,执行多次(每一次访问时)重点方法
3.被销毁:执行destroy()方法,只执行一次(点红色小方块关闭服务器时)
注意:只有服务器正常关闭时,才执行destroy()方法,且执行于Servlet被销毁前执行,用于释放资源
介绍一种用注解来配置的方法:
需要Servlet3.0以上的版本。
1.重新创建一个module,选择JavaEE6及以上的版本,不需要勾选创建web.xml选项。
2.定义一个类,实现Servlet接口。
3.复写所有的方法。
4.在类上使用@WebServlet注解进行配置。
配置路径完整写法:@WebServlet(urlPatterns="/demo")
配置路径省略写法:@WebServlet("/demo")
配置多个路径写法(均可访问同一个资源):@WebServlet({"/demo1","/demo2","/demo3"})
配置多层路径写法(需要完整路径才可访问资源):@WebServlet("/user/demo")
使用通配符*配置路径写法(*表示任意内容均可访问,但是在存在其他指定的资源时,优先级最低):@WebServlet("/user/*")
使用*.do格式配置路径写法(注意没有/):@WebServlet("*.do")
Idea与tomcat相关配置:
1.Idea会为每一个tomcat部署的项目单独建立一份配置文件
如何查看:启动服务器后,控制台中找到Using CATALINA_BASE: "C:\Users\Dexin\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\_IdeaProjects"语句,用后面的路径访问即可查看。
2.tomcat真正访问的是“tomcat部署的web项目”,即对应“工作空间项目”的web目录下的所有资源。
WEB-INF目录下的资源不能被浏览器直接访问。
3.断点调试需要使用小虫子按钮启动debug界面。
Servlet体系结构
Servlet接口——>GenericServlet抽象类——>HttpServlet抽象类
GenericServlet抽象类:只将service()方法设置为抽象类,必须实现,其他方法做了默认空实现,不一定要实现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @WebServlet("/demo2") 2 public class TestGenericServlet extends GenericServlet { 3 4 @Override 5 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 6 System.out.println("GenericServlet 测试成功!"); 7 } 8 }
HttpServlet抽象类:对http协议的一种封装,简化操作。
因为在实际操作中,我们必然需要在service()方法中写获取数据的代码,要获取数据,首先需要判断获取的方式是doGet/doPost,然后做出不同的处理。HttpServlet抽象类就为我们封装好了这些代码,并在其中调用了doGet()&doPost(),我们只需要在service()方法中实现这两个方法即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @WebServlet("/demo3") 2 public class TestHttpServlet extends HttpServlet { 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 System.out.println("doGet测试成功!"); 6 } 7 8 @Override 9 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 10 System.out.println("doPost测试成功!"); 11 } 12 }