服务器Tomcat配置
部署项目
1 .直接将项目放到webapps目录下即可
简单部署: 直接将项目打包成war包, 再将war包放到webapps目录下, war包会自动解压
2 .配置conf.server,xml文件
在标签中配置
docBase: 项目存放的路径
path: 虚拟目录
静态项目和动态项目
目录结构
Java动态项目的目录结构
项目的根目录
WEB-INF目录
web.xml: web项目的核心配置文件
classes目录: 放置字节码文件的目录
lib: 放置依赖的jar包
Servlet
Servlet是服务器上运行的小程序, 也就是一个Java类, 但是比较特殊, 不需要new, 自己就可以运行, 也有创建,垃圾回收和销毁的过程, Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener), 属于动态资源. Servlet的作用是处理请求, 服务器会把接受到的请求交给Servlet来处理, 在Servlet中通常需要:
接受请求数据
处理请求
完成响应
简单案例实现步骤
1 .创建一个JavaEE项目
2 .定义一个类, 实现Servlet接口
public class ServletTest implements Servlet
3 .实现接口中的抽象方法
void init(ServletConfig servletConfig)
void service(ServletReques servletRequest, ServletResponse ServletResponse) throws ServletException ,IOException
String getServletInfo();
void destory()
4 .配置Servlet
在web.xml中配置
demo
com.freework…
demo
/demo
执行原理 :
当服务接受到客户端浏览器的请求之后, 回解析请求URL路径, 获取访问的Servlet的资源路径
查找web.xml文件, 是否有对应的标签体内容
如果有, 则在找到对应的全类名
tomcat会将字节码文件加载进内存, 并且创建其对象
调用其方法
Servlet的生命周期
1 .被创建: 执行init方法, 只执行一次
Servlet什么时候创建?
默认情况下, 第一次被访问时, Servlet被创建
也可以通过配置改变创建时机
标签下配置
的值为负数时 ---- 第一次被访问时创建 || 值为0或正数 ---- 在服务器启动时创建
2 .被销毁: 执行destory方法, 只执行一次
Servlet被销毁时执行, 服务器关闭时, Servlet被销毁
只有服务器正常关闭时, 才会执行destroy方法
destroy方法在Sevlet被销毁之前执行, 一般用于释放资源
注意: 在Servlet 3.0 ,可以不需要web.xml文件
Servlet的实现
实现Servlet有三种方式:
实现java.servlet.Servlet接口
实现javax.servlet.GenericServlet类
实现javax.servlet.http.HttpServlet类
Servlet接口中提供了规范接口,
GenericServlet是一个实现了Servlet接口的抽象类, 并且对init()和destroy()方法做了空实现, 并且将service()定义为抽象方法, 让子类必须实现service方法
HttpServlet类是一个继承了GenericServlet的抽象类, 在该类中有两个service()方法其中一个是对GenericServlet类的service方法(service01)进行的实现, 另外一个是HTTPServlet自定义的, 当浏览器发送求服务器时, 会首先进入service01中, 主要是判断请求对象的类型是否为HTTPServletRequest并且响应对象是否为HTTPServletResponse类型, 如果是则直接调用service02, HttpServlet在类中定义了其中请求类型, 在service02方法中会先获取request请求对象, 获取请求对象的请求方法, 判断方法类类型, 进而调用不同的方法接受请求.
Http源码
七种请求类型
private static final String METHOD_DELETE = “DELETE”;
private static final String METHOD_HEAD = “HEAD”;
private static final String METHOD_GET = “GET”;
private static final String METHOD_OPTIONS = “OPTIONS”;
private static final String METHOD_POST = “POST”;
private static final String METHOD_PUT = “PUT”;
private static final String METHOD_TRACE = “TRACE”;
继承service方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
this.service(request, response); //调用自定义service方法
} else {
throw new ServletException(“non-HTTP request or response”);
}
}
HttpServlet自定义的service方法, 作用为请求类型方法路由
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals(“GET”)) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(“If-Modified-Since”);
if (ifModifiedSince < lastModified) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals(“HEAD”)) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals(“POST”)) {
this.doPost(req, resp);
} else if (method.equals(“PUT”)) {
this.doPut(req, resp);
} else if (method.equals(“DELETE”)) {
this.doDelete(req, resp);
} else if (method.equals(“OPTIONS”)) {
this.doOptions(req, resp);
} else if (method.equals(“TRACE”)) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString(“http.method_not_implemented”);
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
关于HttpServletRequest和HttpServletResquest
HTTPServletRequest是继承ServletRequest接口的接口
public interface HttpServletRequest extends ServletRequest {
HTTPServletResponse是继承ServletResponse接口的接口
public interface HttpServletResponse extends ServletResponse {
这两个都是接口, 至于实现类不必自定义, 直接使用即可
HTTP
概念: Hyper Text Transfer Protocol 超文本传输协议
HTTP定义了客户端和服务器端通信时, 发送数据的格式
特点:
1 .是基于TCP/IP通信协议的高级协议
2 .默认端口为: 80
3 .请求/响应模型为: 一次请求对应一次响应
4 .每次请求之间相互独立, 不能交互数据
5 .版本特性: 1.0(每次请求响应都会建立新的连接) 1.1: 复用连接, 节省资源
请求消息数据格式
1 . 请求报文包括: 请求行、请求头部、空行、请求体
1.1 请求行
包括方法字段、URL字段、HTTP版本字段 之间使用空格分开
常用的请求方式主要是:GET 和 POST
GET: 当客户端要从服务器中读取某个资源时,使用GET方法
GET请求参数和对应的值加载URL后面(请求行中),请求的URL长度有限制,请求行不保密所以安全性不高
POST:当客户端给服务器提供信息较多时可以使用POST方法
POST将请求参数放在请求体中,URL长度没有限制,信息安全性较高
GET一般用于获取查询信息 ,POST一般用于更新资源
1.2 请求头
请求头部分的格式是:关键字:值,每对信息占用一行,告诉服务器一些客户端的信息
User-Agent : 发送求的浏览器类型 可用来解决: 浏览器兼容性问题
Accept-Encoding : 客户端可接受的编码压缩方式
Accept-Language : 客户端可接受的语言类型
Accept-Charset : 可接受的应答字符集
Host : 请求的主机名, 允许多个域名同处一个IP地址, 即虚拟机主机
Cookie : 向同一个域名的服务器发送该域内的cookie
Referer : http: //… 告诉服务器我(当前请求)从哪里来 可用来做: 防盗链 ,统计工作
1.3 请求空行
用来分隔POST请求的请求头和请求体的, 通知服务器下面不是请求头了
1.4 请求体(正文)
在GET中不使用, POST中使用
2 .响应消息数据格式