1、web相关概念回顾
软件架构
C/S 客户端/服务器端
B/S 浏览器/服务器端
资源分类
静态资源
所有用户访问后,得到的结果都是一样的,称为静态资源,
静态资源可以直接被浏览器解析
如:html css JavaScript
动态资源
每个用户访问相同资源后,得到的结果可能不一样,称为动态资源,
动态资源被访问后,需要先转换为静态资源,再返回给浏览器
如:servlet/jsp PHP asp
网络通信三要素
IP 电子设备(计算机)在网络中的唯一标识
端口 应用程序在计算机中的唯一标识 0-65536
传输协议 规定了数据传输的规则
基础协议
TCP 安全协议,三次握手,速度较慢
UDP 不安全协议,速度较快
2、web服务器软件
服务器
安装了服务器软件的计算机
服务器软件
接收用户的请求,处理请求,做出响应
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项大的规范
3、Tomcat web服务器软件
下载
http://tomcat.apache.org/
安装
解压即可 安装目录建议不要包含中文
卸载
删除安装目录即可
安装目录的结构
bin
可执行文件 .bat .exe .sh
conf
配置文件 .xml .properties
lib
依赖jar包
logs
日志文件
temp
临时文件
webapps
存放web项目
work
存放运行时的数据
启动
双击bin/startup.bat
浏览器访问自己localhost:8080
访问别人 别人的ip:8080 8080是tomcat默认端口
可能遇到的问题
启动tomcat,黑窗口一闪而过
原因:没有正确配置JAVA_HOME这个环境变量,
而startup.bat中用到了JAVA_HOME变量
启动报错
启动两次tomcat就会报错端口号被占用,错误可以在logs中看到
解决
将占用端口号的应用程序杀死
cmd输入netstat -ano找到要使用的端口号对应的进程ID,即PID
任务管理器打开进程选项卡,点击查看-选择列-勾上PID,
找到对应的进程,右键结束进程
或自己改一个端口号
conf/server.xml 将两个Connector标签中的port和redirectPort,
以及一个Server标签中的port改为别的
注意
一般会将tomcat的端口改为80,因为其为HTTP协议的默认端口,改完访问就不用输入端口号
关闭
正常
双击shutdown.bat
或在黑窗口中输入ctrl+c
强制
点击右上角的叉
配置
部署项目的方式 开发了解法1 运维了解全部
法1 直接将项目hello放到webapps目录下,就可以用浏览器访问了
/hello 项目的访问路径(虚拟目录)
简化部署
将项目里的资源打包,改后缀名为war
好处:打包后占用内存小,传输快
复制war包到webapps下会自动解压,
删除war包会自动删除其解压出的资源
缺点:需要复制到webapps下
法2 编辑conf/server.xml
在标签体中配置
需要重启服务器生效
缺点:server.xml文件是用来配置tomcat整体的,
在里面部署项目可能会损坏文件
法3 推荐
在conf/Catalina/localhost中创建一个任意名称的xml文件
<Context docBase="项目存放的路径"/>
访问路径就是该xml文件的名称
优点:热部署,不想用这个xml文件了直接加上后缀_bak,不需要重启服务器就访问不到了
静态项目
只能放静态资源
动态项目
可以放静态资源和动态资源
Java动态项目的目录结构
– 项目的根目录
– WEB-INF目录
--web.xml web项目的核心配置文件
--classes目录 放置字节码文件的目录
– lib目录 放置依赖的jar包
将tomcat集成到idea中,并创建JavaEE的项目,部署项目
集成
Run->Edit Configurations->Defaults->Tomcat Server->Local
Application server 点击Configure… 选择tomcat安装目录,点击OK
创建项目
创建Java项目,右键添加web框架,不勾选web.xml
部署项目
Run->Edit Configurations->Tomcat->Deployment
点击+,将项目对应的war exploded加上
并修改项目对应的虚拟目录
修改On update action和On frame deactivation为Update Resources,就可以不重启服务器就访问修改后的页面
4、Servlet 查找JavaEE的api文档
Server Applet
概念
运行在服务器端的小程序
不同用户看到的动态资源可能不一样,因为动态资源存在一定的逻辑性,由Java代码体现,封装在java类中
浏览器请求动态资源找的是对应的java类,这种java类依赖于服务器执行,没有主方法,需要遵守一定的规则(接口)才能被Tomcat所识别
Servlet就是一个接口,定义了java类被浏览器访问到(被tomcat识别到)的规则
定义这个接口的实现类就可以被tomcat所识别
快速入门
创建JavaEE项目
实现一个类,实现servlet接口
实现接口中的抽象方法
配置servlet 将上述实现类映射为虚拟目录,即访问的URL中最后的那项
在web.xml中
<!--配置Servlet-->
<servlet>
<!--映射后的URL的最后一项-->
<servlet-name>demo01</servlet-name>
<!--要进行映射的Servlet接口实现类的全类名(全类名想到反射)-->
<servlet-class>web.servlet.Demo01Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
实现Servlet接口的步骤:
在web.servlet包中新建一个类文件,实现Servlet接口,重写方法
在web.xml中配置这个类文件所对应的资源路径
public class Demo01Servlet 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("hello,servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
执行原理
补充:修改虚拟目录路径 Run->Edit Configuration->Tomcat9.0.40->Deployment->Application context
浏览器输入URL:http://localhost:8080/day13/demo01
localhost:8080找到tomcat day13找到当前项目
/demo01找到资源
tomcat先找到web.xml,遍历寻找是否有url-pattern标签中是/demo01,然后找对应的servlet-name->demo01,
接着通过servlet-name找到对应servlet标签里的servlet-class,
(1)tomcat将全类名对应的字节码文件加载进内存 Class.forName();
(2)创建对象 cls.newInstance();
(3)调用方法 service();因为我们实现了Servlet接口,其中有service方法,所以实现类中必须重写service方法
Servlet方法
生命周期
init 初始化方法 用于加载资源
在Servlet被创建时执行,只会执行一次
默认清况下,第一次被访问时创建
可以修改创建时机为服务器启动时
web.xml->servlet标签中的load-on-startup标签
标签体为负数则访问时创建 默认-1
标签体为0或正数则启动时创建 一般0-10
只会执行一次说明Servlet在内存中只存在一个对象,是单例的
多线程访问同一对象可能存在多线程访问安全问题(多用户同时访问)
加锁(同步代码块)会严重影响性能
解决:尽量不要在Servlet中定义成员变量,而在方法中定义局部变量
即使定义了成员变量,也不要对其修改值
service 提功服务方法
每一次Servlet被访问时执行,执行多次
destroy方法 销毁方法 用于释放资源
在服务器正常关闭时执行,关闭时servlet被销毁,执行一次。
在servlet被销毁之前执行
getServletConfig
获取ServletConfig对象
getServletInfo
获取ServletInfo对象(Servlet的一些信息,如版本、作者等等)
public class Demo02ServletMethod 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet3.0 JavaEE6之后才支持
好处:
支持注解配置 可以不需要web.xml进行配置
步骤:
(1)创建JavaEE项目,选择Servlet的版本3.0以上 可以不勾选创建web.xml
(2)定义Servlet实现类
(3)重写方法
(4)在类上使用@WebServlet注解进行配置
@WebServlet(urlPatterns = “/demo01”)
或@WebServlet("/demo01")
注解中有一个特别的变量value表示最重要的属性,赋值时可以省略value=
IDEA与tomcat的相关配置
(1)IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log
Using CATALINA_BASE:
“C:\Users\Administrator\AppData\Local\JetBrains
\IntelliJIdea2020.2\tomcat\Tomcat_9_0_40_JavaWeb”
(2)工作空间项目和tomcat部署的web项目
tomcat真正访问的是tomcat部署的web项目
tomcat部署的web项目对应着工作空间项目的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问
(3)tomcat的断点调试 使用启动按钮旁边的小虫子按钮 debug启动
Servlet体系结构
Servlet接口 有1个实现类
GenericServlet 抽象类 有1个子类 只有一个抽象方法service,其它方法做了默认空实现
要实现Servlet接口只要继承GenericServlet类,重写service方法即可
在service方法中需要实现:判断请求方式并获取数据
String method = req.getmethod();
if(“GET”.equals(method)) //常量放在equals前面防止空指针异常
{
GET方式获取数据
}
else if(“POST”.equals(method))
{
POST方式获取数据
}
而在HttpServlet中封装了这些代码,在判断请求中调用了doGet和doPost方法
String method = req.getmethod();
if(“GET”.equals(method)) {doGet();}
else if(“POST”.equals(method)) {doPOST();}
HttpServlet 抽象类 对http协议的一种封装,简化操作 推荐
使用步骤:
(1)定义类继承HttpServlet
(2)重写doGet/doPost
通过浏览器直接访问是get
Servlet相关配置
urlPatterns Servlet访问路径
可以为一个Servlet定义多个路径 要用大括号括起来
@WebServlet({"/demo02","/d4"})
定义规则
/***
@WebServlet("/") 任意匹配 写什么都可以访问到 优先级最低
/*/*** 目录结构 多层路径
@WebServlet("/user/demo02")
@WebServlet("/user/") 第2层路径任意匹配
.do do可以替换为别的词 如action等等
@WebServlet(".do")
可以通过localhost:8080/demo4.do访问
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。