文章目录
1. Tomcat:
默认端口localhost:8080 ipv4可以省略的端口为80
一闪而过问题:没有正确配置JAVA_HOME环境变量
启动报错
- 找到占用8080的进程,结束它 netstat -ano
- 修改自身端口 conf目录下的sever.xml 找其中的port改主端口号
关闭
- 强制:点启动的红×
- 正常:调用shutdowm.bat ctrl+c
部署项目
1.直接将项目放到apps目录下即可
以虚拟目录访问
简单部署:将项目打成war包,再将war包放置到apps目录下。war包会自动解压缩,删除时会自动删除
2.配置conf/sever.xml
在Host标签体中:<context docBase="实际路径" path="虚拟路径" />
3.在conf\catalina\localhost创建任意名称的xml文件。
在文件中编写<context docBase="实际路径" /> 项目的虚拟目录就是文件的名称
java动态项目的目录结构
项目的根目录
-WEB-INF目录:
-web.xml:web项目的核心配置文件
-classes目录:放置字节码文件的目录
-lib目录:放置依赖的jar包
将Tomcat集成到idea中,并且创建JavaEE的项目并部署项目
2. Servlet
servlet:运行在服务器端的小程序,就是一个接口,定义了java类被浏览器访问到(Tomcat)的规则
将来我们自己实现一个类,实现Servlet接口,复写方法。
快速入门
- 创建javaEE项目
- 定义一个类,实现Servlet接口
- 实现接口中的抽象方法
- 配置Servlet
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.lixiang.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容
- 如果有,则在找到对应的全类名
- Tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet的方法
被创建:init初始化方法,在Servlet被创建是执行,只会执行一次,说明在内存中只存在一个实例化的Servlet对象
默认情况下第一次被访问时被创建
可以指定Servlet的创建时间
提供服务:service提供服务的方法,每一次servlet被访问时都执行。执行多次
被销毁:destroy销毁方法,在Servlet,服务器被 正常 关闭前执行
指定Servlet的创建时间(在Servlet标签下配置)
1.第一次被访问时创建:<load-on-startup>负数(默认-1)</load-on-startup>
2.在服务器启动时创建:<load-on-startup>0或正数</load-on-startup>
内存中只存在一个实例化的Servlet对象
多线程访问时安全问题:解决方案:尽量不在Servlet中定义成员变量,即使定义了,也不要赋值;
Servlet3.0
好处:支持注解配置,不需要web.xml了
步骤:
- 创建javaEE项目,选Servlet3.0以上,可不创建web.xml
- 定义一个类实现Servlet接口
- 复写方法
- 在类上使用@webServlet注解进行配置:
@WebServlet(urlPatterns = "/Servlet资源路径")
简便写法:@WebServlet("/Servlet资源路径")
一个Servlet可以定义多个访问路径@WebServlet({"/d4","/dd4","/ddd4"})
Servlet体系结构
Servlet--接口
实现类:
-GenericServlet --抽象类 将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象,继承后只需实现service()方法
-HTTPServlet --抽象类 对Http协议的封装,简化操作
1. 定义类继承HTTPServlet
2. 需要重写doGet、doPost方法
@WebServlet({
"/demo3","/d3","/de3"})
public class myservlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do Get....");
//获取数据msg
ServletContext servletContext= this.getServletContext();
String msg= (String) servletContext.getAttribute("msg"