Java学习笔记7-Tomcat和Servlet
0X0a Tomcat
1、基本使用
配置
修改启动端口号:conf/server.xml
<Connector port="8080">
启动时候可能出现的问题
Address already in use:端口号冲突
启动窗口一闪而过:检查JAVA_HOME环境变量是否正确配置
2、Maven Web项目结构(开发中的项目)
Java 项目名称
src 主目录
main
java Java代码
resource 资源文件
webapp Web项目特有目录
html HTML文件目录
web-INF Web项目核心目录(固定名称)
web.xml web项目配置文件
test 测试目录
pom.xml
3、IDEA使用Tomcat
-
在IDEA中使用本地Tomcat进行项目部署,相对来说步骤比较繁琐,所以我们需要一种更简便的方式来替换它,那就是直接使用Maven中的Tomcat插件来部署项目,具体的实现步骤,只需要两步,分别是:
-
在pom.xml中添加Tomcat插件
<build> <plugins> <!--Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>
-
使用Maven Helper插件快速启动项目,选中项目,右键–>Run Maven --> tomcat7:run
-
【注】
如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的操作方式为: File -->Settings --> Plugins --> Maven Helper ---> Install,安装完后按照提示重启IDEA,就可以看到了。
0X0b Servlet
1、快速入门
创建Web项目,导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
// ServletDemo.java
package com.company;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo")
public class ServletDemo implements Servlet {
// 五种方法全部重写,此处只写一个
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet Hello World!");
}
}
2、Servlet生命周期
1、加载和实例化阶段
2、初始化
3、请求处理
4、服务终止
package com.company;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//负整数:第一次被访问时创建Servlet对象
//0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
@WebServlet(urlPattern("/demo"), loadOnSatrtup=1)
public class ServletDemo implements Servlet {
/*
* 初始化方法
* 调用时机:默认情况下,Servlet第一次被访问时,调用
* 调用次数:1次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/*
* 提供服务
* 调用时机:每一次Servlet被访问调用
* 调用次数:多次
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet Hello World!");
}
/*
* 销毁
* 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁
* 调用次数:1次
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
}
3、Servlet体系结构
每个Servlet类中都会使用HttpServlet类中的doGet和doPost方法。因此每个类都需要将请求区分,我们可以使用自定义一个MyHttpServlet类来封装判断处理业务
因此在Servlet只需要继承MyHttpServlet类,并且重写doGet和doPost方法即可
// MyHttpServlet.java
package com.company;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyHttpServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String method = request.getMethod();
if ("GET".equals(method)){
doGet(servletRequest, servletResponse);
}
else if("POST".equals(method)){
doPost(servletRequest, servletResponse);
}
}
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse){
}
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse){
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy...");
}
}
//ServletDemo.java
package com.company;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebServlet("/demo")
public class ServletDemo extends MyHttpServlet {
@Override
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse){
System.out.println("get...");
}
@Override
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("post...");
}
}
4、Servlet的urlPattern配置
一个Servlet,可以配置多个urlPattern
@WebServlet(urlPatterns = {"/demo1", "/demo2"})
匹配规则:
1、精确匹配:"/user/demo" 路径必须为/user/select
2、目录匹配:"/user/*" 路径为/user/aaa、/user/bbb等等
3、扩展名匹配:"*.do" 路径为/aaa.do、/bbb.do等等,不能以/开头
4、任意匹配:"/" 路径为所有