常用的JavaWeb服务软件
1,Tomcat:由 Apache 组织提供的一种 Web 服务器,提供对 jsp 和 Servlet 的支持。它 是一种轻量级的 javaWeb 容器(服务器),也是当前应用最广的 JavaWeb 服务器(免费)
2,Jboss:是一个遵从 JavaEE 规范的、它支持所有的 JavaEE 规范(免费)
3,GlassFish: 由 Oracle 公司开发的一款 JavaWeb 服务器,是一款商业服务器,达到产 韩顺平Java 工程师 品级质量(应用很少)
4, Resin:是 CAUCHO 公司的产品,是一个非常流行的服务器,对 servlet 和 JSP 提供了 良好的支持, 性能也比较优良(收费)
5,WebLogic【很猛】:是 Oracle 公司的产品,支持 JavaEE 规范, 而且不断的完善以适 应新的开发要求,适合大型项目(收费,用的不多,适合大公司)
Tomcat下载配置流程
1,下载Tomcat:Apache Tomcat® - Welcome!(以8.5版本为例)
2,获取Tomcat安装程序包
3,使用zip包安装Tomcat
找到你需要用的 Tomcat 版本对应的 zip 压缩包,解压到需要安装的目录即可
4,配置JAVA_HOME 环境变量
Tomcat 本质是一个Java程序,所以要jdk, 会去根据JAVA_HOME 使用指定jdk
5,Tomcat启动
双击 bin 目录下的 startup.bat 文件
6,关闭Tomcat服务
进入Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat 服务器(推荐)
7,修改Tomcat服务端口
Tomcat 目录下的 conf 目录,修改 server.xml 配置文件
Tomcat目录结构
Web应用的组成
一个WEB应用由多个WEB资源或其它文件组成,包括html文件、css文件、js文件、动 态web页面、java程序、支持jar包、配置文件等。开发人员在开发web应用时,按照规 定目录结构存放这些文件。否则,在把web应用交给web服务器管理时,不仅可能会使 web 应用无法访问,还会导致web服务器启动报错。
JavaWeb程序/应用/工程目录结构
浏览器访问web服务器文件UMl时序图
IDEA开发配置JavaWeb工程(IDEA2024版)
1,新建java项目
2,右键项目名选择Add FrameWork Support
注:如果右键没有Add FrameWork Support,点击Help搜索Add FrameWork Support
4,选择Web Application,点击ok
5,配置完后,项目路径为
路径介绍
当tomcat 启动时,会生成out目录,该目录就是 原项目资源的映射,我们浏览器访问的 资源是 out目录
6,配置Tomcat,点击项目配置按钮
7,点击左上角加号,选择Tomcat Server->Local
8,点击Configure,配置Tomca的启动路径(前面解压的安装路径)
9,点击Deployment,点击加号,选择Artifact
10,推荐修改为与此项目名相同
11,配置启动选项,推荐为热启动,点击应用,ok
on update action : 表示当我们更新操作是,Tomcat 会自动更新类和资源 (当jsp/html文件修改时,可以生效,但是如果你修改的java文件,需要Redepoly才会生效)
on frame deactivation : 表示 IDEA 失去焦点(比如最小化), 也会导致 jsp/html 发生更 新 , 但是java修改了,还是需要redeploy
动态WEB开发核心-Servlet
什么是Servlet
Servlet 在开发动态WEB工程中,得到广泛的应用,掌握好Servlet非常重要了,Servlet(基 石)是SpringMVC 的基础
Servlet(java 服务器小程序),它的特点:
-
他是由服务器端调用和执行的(一句话:是Tomcat解析和执行)
-
他是用java语言编写的, 本质就是Java类
-
他是按照Servlet规范开发的(除了tomcat->Servletweblogic->Servlet)
-
功能强大,可以完成几乎所有的网站功能(在以前,我们老程员,使用Servlet开发网站) 技 术栈要求高
IDEA实现Servlet开发
1,在Tomcat的安装路径下的lib路径下,复制servlet-api.jar包
2,在新建的Web项目下的web-WEB-INF下新建lib文件夹,并粘贴刚才复制的jar包在这个文件夹下
3,右键这个jar包,选择Add as Library
4,选择默认命名,点击ok,servlet-jar包会出现下级目录,表示配置成功
实现XMl文件配置servlet程序的访问地址
1,在src下新建java文件类,使其实现Servlet接口,重写对应的方法
package com.zhang.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author 子佩
* @version 1.0
* 1,开发Servlet 需要 实现Servlet接口
* 2,实现Servlet接口的方法
*/
public class HelloServlet implements Servlet {
/**
* 初始化servlet
* 当创建HttpServlet 实例时,会调用init方法
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Hello Servlet");
}
/**
* 返回servletConfig 也就是返回Servlet配置信息
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service方法处理浏览器的请求(包括get/post)
* 当浏览器每次请求servlet时,就会调用service
* 当tomcat调用该方法时,会把http请求的数据封装成实现了ServletRequest接口的request对象
* 通过ServletRequest对象,可以得到用户提交的数据
* ServletResponse 对象用于返回数据给tomcat->浏览器
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
/**
* 返回servlet信息
* @return
*/
@Override
public String getServletInfo() {
return "";
}
/**
* 该方法是在servlet销毁时,被调用
* 只调用一次
*/
@Override
public void destroy() {
}
}
2,在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_4_0.xsd"
version="4.0">
<!--web.xml 主要用来配置web应用使用到的servlet-->
<!--配置HelloServlet-->
<!--
<servlet-name>HelloServlet</servlet-name> 给Servlet取名,该名字唯一
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class> Servlet的类的全路径:Tomcat在反射生成该Servlet需要使用
<url-pattern>helloServlet</url-pattern> 这个就是该servlet访问的url的配置(路径)
这时我们应该这样访问servlet http://localhost:8080/web应用名/helloServlet
url-pattern 取名是程序员决定的
load-on-startup 表示在tomcat启动时,会自动的去加载servlet实例
-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
31,启动服务器,浏览器访问http://localhost:8080/web应用名/helloServlet
浏览器调用Servlet流程分析
Servlet生命周期
-
init()初始化阶段
-
service()处理浏览器请求阶段
-
destroy()终止阶段
-
初始化阶段
Servlet 容器(比如:Tomcat)加载 Servlet,加载完成后,Servlet 容器会创建一个Servlet实例 并调用init()方法,init()方法只会调用一次,Servlet容器在下面的情况装载Servlet
处理浏览器请求阶段(service方法)
-
每收到一个http请求,服务器就会产生一个新的线程去处理[线程]
-
创建一个用于封装HTTP请求消息的ServletRequest对象和一个代表HTTP响应消息的 ServletResponse 对象
-
然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去
终止阶段 destory方法(体现Servlet完整的生命周期)
当web应用被终止,或者Servlet容器终止运行,或者Servlet类重新装载时,会调用destroy() 方法 , 比如重启tomcat,或者 redeployweb应用
Servlet注意事项
1,Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,不能独自运行
2,针对浏览器的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,就会驻留在内存中,为后续的其他请求服务,直至web容器退出/或者redeploy该web应用,servlet实例对象才会销毁
3,在Servlet的整个生命周期内,init方法只被调用一次。而每次请求导致Servlet引擎调用一次servlet的service方法
4,对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequset请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的servlce方法,servlce方法再根据请求方式分别调用doXXX方法
5,如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时, 就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法.
Servlet-使用注解开发
使用xml去配置路径太过麻烦,再后面开发中会使用基于注解的开发模式
也就是使用@WebServlet注解配置访问路径
谈谈HttpServlet类
当需要处理不同的Http请求时,如处理POST和GET请求时,需要不同的处理业务,这时继承Servlet接口,不能满足业务需求,需要使用它的子类HttpServlet类
HttpServlet的继承关系图
HttpServlet继承自GenericServlet抽象类(GenericServlet了解就行)
HttpServlet类详解(重点)
1,HttpServlet类重写了service方法,根据不同的请求调用不同的方法
2,新增doGet和doPost方法,用于处理不同的请求(后面实现自己的业务会重写这些方法)
对于新手目前只需要了解这些方法就行,接下来我们做一个使用小案例
1,编写OkServlet去继承HttpServlet
2,注解方式配置OkServlet,一个Servlet支持配置多个urlpattern
package com.zhang.servlet;
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;
/**
* @author 子佩
* @version 1.0
*/
@WebServlet(urlPatterns = {"/ok1","/ok2"})
public class OkServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post请求");
}
}
3,启动服务器,浏览器访问http://localhost:8080/web应用名/ok1或者访问http://localhost:8080/web应用名/helloServlet/ok2
4,响应处理流程
Http请求被tomcat处理,并封装成对应的request,这里继承于HttpServlet类,会被封装成HttpServletRequest对象(里面包括http请求的一些必要参数)。然后调用Servlet实例对象,这里会调用HttpServlet类,然后执行service方法,根据不同的请求方式,调用不同的doXXX方法,最后根据动态绑定机制,调用我们这里重写的doXXX方法(不了解动态绑定机制可能理解有点吃力,本质就是面向对象的知识)
Servlet urlPattern配置
精确匹配
配置路径 :@WebServlet(urlPatterns="/ok/zs")
访问servlet:localhost:8080/web项目名/ok/zs
目录匹配
配置路径 :@WebServlet(urlPatterns="/ok/*")
访问servlet:localhost:8080/web项目名/ok/aaa或者localhost:8080/web项目名/ok/bbb
即会匹配ok路径下的文件
扩展名匹配 配置路径 :@WebServlet("urlPatterns=*.action")注意不能带“/"
访问servlet:localhost:8080/web项目名/zbq/start.action或者 localhost:8080/web项目 名/zbq/ls.action
任意匹配
配置路径:@WebServlet(urlPatterns = "/")
访问servlet:localhost:8080/web项目名/aaa localhost:8080/web项目名/bbb localhost:8080/web项目名/ccc
注意:/ 和 /*的配置,会匹配所有的请求,这个比较麻烦,要避免
优先级遵守
精确路径>目录路径>扩展名路径>/*>/