文章目录
1、Web服务器软件简介
硬件上的服务器指的是装了服务器软件的计算机,服务器软件的作用就是接受用户的请求、处理请求并做出响应。Web服务器软件就是服务器软件的一种,在Web服务器中部署Web项目,让用户通过浏览器来访问这些项目。
常见的Java相关的web服务器软件有:
webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
JavaEE指的是Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。
2、Tomcat
2.1 下载和安装
下载:http://tomcat.apache.org/
安装:解压压缩包到一个不带中文和空格的目录上即可。
启动:双击 bin/startup.bat 文件。
关闭:双击 bin/shutdown.bat 文件。
启动后即可通过浏览器输入http://localhost:8080 来访问。
注意,Tomcat是基于Java的web服务器软件,必须正确配置JAVA_HOME环境变量,启动了Tomcat后,8080端口即被占用,要启动多个就得修改端口。
2.2 配置和部署
Tomcat启动后,用户通过浏览器访问 http://localhost:8080 后,Tomcat服务器软件就会接收到请求,处理请求并做出响应。
部署项目的方式:
1. 直接将项目放到webapps目录下即可。直接放置项目文件夹或者将项目打成一个war包,再将war包放置到webapps目录下。
2. 项目放任意地方,比如C:\hehe01,里面只有一个hehe01.html文件 ,然后配置conf/server.xml文件,在<host>标签体中配置<Context docBase="C:\hehe01" path="/hehe" />
,其中docBase表示项目在计算机中的绝对路径,path表示在地址栏显示的路径,即虚拟路径。浏览器访问:http://localhost:8080/hehe/hehe01.html
3.项目放任意地方,比如C:\hehe02,然后在 conf\Catalina\localhost 中创建任意名称的xml文件,在文件中编写<Context docBase="C:\hello02" />
,docBase和方式2一样,是项目在计算机中的绝对路径,这是的虚拟路径为xml文件的名称,比如这个xml文件是hehe02.xml,则浏览器的地址栏输入:http://localhost:8080/hehe02/hehe02.html
对于conf/server.xml文件,是尽量不要去改,只要稍微有点问题就会导致Tomcat启动不了,所以建议使用方式3。
2.3 静态项目和动态项目
静态项目就是只有一些不变的文件,比如html、css、js文件等。而动态项目则不仅能保存静态文件,还能保存一些动态的比如javaclass等。动态项目目录结构如下所示:
-- 根目录
|-- WEB-INF目录
|-- web.xml:web项目的核心配置文件
|-- classes目录:放置字节码文件的目录
|-- lib目录:放置依赖的jar包
3、Servlet基础
Servlet全称是server applet,表示运行在服务器端的小程序。在Java中就是一个接口,定义了Java类被浏览器访问到的规则。使用方法就是写一个类来实现Servlet接口,Tomcat就可以调用该类的方法。
3.1 Tomcat集成到IDEA中
首先理解,Tomcat是一个web服务器软件,IDEA是一个集成开发环境,我们通过IDEA编写项目文件,Tomcat来调用我们写的项目文件。集成步骤如下:
1.在Run菜单中选择Edit Configurations…
2.选择 Templates -> Tomcat Sercer -> Local
3.点击Configure选择Tomcat的解压目录,点击OK即可
3.2 IDEA与Tomcat的相关配置
IDEA会为每一个Tomcat部署的项目单独建立一份配置文件,也就是Tomcat目录里的conf,通过查看控制台的log:Using CATALINA_BASE就可以看到,里面主要就是conf、logs、work文件夹和一些配置文件。
IDEA是来写web工程项目的,Tomcat是来访问我们写好并部署的web工程项目的,这个wen工程项目对应着“工作空间项目”的wen目录下的所有资源。WEB-INF目录下的资源不能被浏览器直接访问。
3.3 Servlet简单使用
创建一个JavaEE项目,定义一个类实现Servlet接口。
package cn.klb;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo 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("Servlet 配置成功!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
然后在 web -> WEB-INF -> web.xml文件中添加:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>cn.klb.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/hehe</url-pattern>
</servlet-mapping>
</web-app>
<servlet>
标签表示定义了一个servlet,<servlet-name>
是这个servlet的名字,然后启动Taomcat后,从浏览器要输入一个地址,对应Tomcat里的虚拟路径,所以<servlet-mapping>
就是映射servlet和虚拟路径,其中<url-pattern>
就是配置虚拟路径的。最后可以通过浏览器访问:http://localhost:8080/hehe,即可在IDEA控制台看到以下输出:
当Tomcat服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径(虚拟路径),然后查找web.xml文件,是否有对应的<url-pattern>
标签体内容,如果有,则在找到对应的<servlet-class>
全类名,Tomcat会将字节码文件加载进内存,并且创建其对象并调用其方法。
实现了Servlet的类要重写方法:init(ServletConfig servletConfig)
、ServletConfig getServletConfig()
、service(ServletRequest servletRequest, ServletResponse servletResponse)
、getServletInfo()
和destroy()
。
其中,init()
方法在被创建的时候执行且只执行一次,一个Servlet在内存中只存在一个对象,Servlet是单例的。service()
方法是提供服务的方法,每次访问Servlet时,Service方法都会被调用一次。destroy()
方法是在Servlet被销毁时执行,一般用于释放资源。
3.4 使用注解配置Servlet
每定义一个Servlet,就得配置一次web.xml,在大型工程中比较繁琐。随着技术的升级,Servlet 3.0可以直接用注解的形式来配置Servlet。我们在定义一个Servlet实现类时,只需要在类的前面写上@WebServlet
注解即可。
package cn.klb;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/zhujie")
public class ServletDemo02 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("注解Servlet配置成功!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
然后浏览器访问 http://localhost:8080/zhujie 即可在IDEA控制台看到以下输出:
注解的源码如下:
package javax.servlet.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
回忆注解的笔记,所有注解都是有一个注解解析程序的,但是我们不用管,只要会用注解即可。
4、Servlet体系
如果每次编写Servlet的实现类都像上面那样也太麻烦了,为此,又提供了一些更高级的实现了Servlet接口部分方法的抽象类:
|- Servlet 接口
|- GenericServlet 抽象类
|- HttpServlet 抽象类
GenericServlet
实现Servlet
接口,对其他的方法做了默认空实现,只将service()
方法作为抽象,将来定义Servlet
类时,可以继承GenericServlet
,实现service()
方法即可。
HttpServlet
继承GenericServlet
,是对http协议的一种封装,简化操作,使用时只需要定义一个类继承HttpServlet
,然后重写doGet()
和doPost()
方法即可。
一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
路径定义规则:
/xxx
:路径匹配
/xxx/xxx
:多层路径,目录结构
*.do
:扩展名匹配