静态资源:运行在浏览器端,一成不变的;HTML和CSS,JavaScript都属于静态资源
动态资源:运行在服务器端;编写的JSP和Servlet等都属于动态资源
1.本质上也是一个服务器,也是 一个容器,用来装java代码,web服务器也成为web容器
2.可以实现数据共享功能,将服务器上的数据分享给浏览器
3.采用请求和相应的方式来访问,浏览器发送请求request,服务器端做出相应response.
startup.bat:启动
shutdown.bat:停止
Neither the JAVA HOME nor the JRE HOME environment variable is defined
At least one of these environment variable is needed to run this proaram
JAVAHOME和JRE HOME环境变量都没有定义,运行这个程序至少需要这些环境变量中的一个
Caused by: java.net.BindException: Address already in use: bind
主配置文件 conf/server.xml
8080端口:tomcat服务默认端口号.访问url地址后必须手动写:8080
80端口:HTTP协议采用的端口号.访问url地址后不用写:80
方式一:直接复制到webapps下
方式二:修改server.xml文件,在Hose里面添加
方式三:在conf/Catalina/localhost/创建一个xml文件,blog.xml,文件名就是访问地址
找到占用端口的进程并关闭即可,但这种方式可能导致有用的进程被强行关闭,所以不推荐
第一步:cmd打开命令行窗口,执行命令:netstat -aon|findstr “1099”查找占用端口的进程
第二步:根据pid,继续执行命令:taskkill -f -pid 15380关闭该进程
1.首先运行在web应用程序里面
2.做控制器用
3.可以生成动态的网页对请求和响应进行处理
添加创建Servlet的方法a
找不到HttpServlet的包
1.在web/WEB-INF创建一个lib目录
添加到模块库
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//Servlet的步骤
//1.编写一个类继承于抽象类:HttpServlet
//2.重写doGet或者doPost方法
//3.使用xml配置或注解的方法配置servlet的访问地址
public class Demo1Servlet extends HttpServlet {
/**
* 重写doGet方法,只处理get请求
* 注意:直接在浏览器上输出地址,访问方式是get方式
*
* @param request:请求对象
* @param response:响应对象
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应的类型和编码,表示输出的内容是个网页,编码是utf-8
response.setContentType("text/html;charset=UTF-8");
//2.获取响应的打印流,向浏览器打印字符串,用户就可以在浏览器上看到数据
PrintWriter out = response.getWriter();
//3.输出到浏览器上
out.print("你好,我是第一个Servlet
");
}
}
<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">
<servlet>
<servlet-name>demo1servlet-name>
<servlet-class>com.itheima.servlet.Demo1Servletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>demo1servlet-name>
<url-pattern>/demo1url-pattern>
servlet-mapping>
web-app>
package com.itheima.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;
import java.io.PrintWriter;
/**
* 1.编写一个继承类继承于HttpServlet
* 2.重写doGet或doPost
* 3.使用注解@WebServlet("/访问地址")
* 属性:
* name:指定servlet的名字
* urlPatterns/value:指定访问地址,如果只有value属性,则名字可以省略
* 一个Servlet可以同时指定多个访问地址
*/
//@WebServlet(name="demo2", urlPatterns = "/demo2")
//@WebServlet("/demo2"):value省略,也可以
@WebServlet({"/demo2","/demo2000"})
public class Dome2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应的类型和编码
response.setContentType("text/html; charset=utf-8");
//2.获取响应的打印流
PrintWriter out = response.getWriter();
//3.打印到浏览器
out.print("这是第二个Servlet!");
}
}
package com.itheima.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//生命周期的三个方法
@WebServlet("/demo3")
public class Demo3Servlet implements Servlet {
/**
* 初始化方法:第一次用户访问这个Servlet的时候会执行,只会执行1次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("执行初始化的方法啊...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 服务的方法:每次用户请求都会执行
* @param Request:请求对象
* @param Response:响应对象
* ServletRequest是HttpServletRequest的父接口
* ServletResponse是HttpServletResponse的父接口
*/
@Override
public void service(ServletRequest Request, ServletResponse Response) throws ServletException, IOException {
System.out.println("执行服务的方法...");
}
@Override
public String getServletInfo() {
return null;
}
// 销毁的方法:服务器关闭的时候执行一次
@Override
public void destroy() {
System.out.println("执行销毁的方法....");
}
}
@WebServlet({"/demo2","/demo2000"})
每个地址必须以"/"开头
Web.xml文件
<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">
<servlet>
<servlet-name>demo1servlet-name>
<servlet-class>com.itheima.servlet.Demo1Servletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>demo1servlet-name>
<url-pattern>/demo1url-pattern>
<url-pattern>/demo100url-pattern>
servlet-mapping>
web-app>
* 使用通配符的访问地址:
* 1.以/开头:
* 1) /*匹配所有的地址
* 2) /目录名/*匹配某个路径下访问地址
* 2.以扩展名结尾:
* 如 *.do,注意:在前面不加 /
* 3.注意:不能同时在前面使用/,后面使用:通配符.扩展名.这是错误的
*
* 1) 最佳匹配原则:那个路径近,就匹配那个
* 2) /开头的访问地址,优先与扩展名结尾的访问地址
<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">
<servlet>
<servlet-name>demo1servlet-name>
<servlet-class>com.itheima.servlet.Demo1Servletservlet-class>
<init-param>
<param-name>userparam-name>
<param-value>newboyparam-value>
init-param>
<init-param>
<param-name>ageparam-name>
<param-value>20param-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>demo1servlet-name>
<url-pattern>/demo1url-pattern>
<url-pattern>/demo100url-pattern>
servlet-mapping>
web-app>
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
//Servlet的步骤
//1.编写一个类继承于抽象类:HttpServlet
//2.重写doGet或者doPost方法
//3.使用xml配置或注解的方法配置servlet的访问地址
public class Demo1Servlet extends HttpServlet {
/**
* 重写doGet方法,只处理get请求
* 注意:直接在浏览器上输出地址,访问方式是get方式
*
* @param request:请求对象
* @param response:响应对象
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置响应的类型和编码,表示输出的内容是个网页,编码是utf-8
response.setContentType("text/html;charset=UTF-8");
//2.获取响应的打印流,向浏览器打印字符串,用户就可以在浏览器上看到数据
PrintWriter out = response.getWriter();
//3.输出到浏览器上
out.print("你好,我是第一个Servlet
");
//读取web.xml中初始化参数---通过参数名获取参数值
String user = getInitParameter("user");
String age = getInitParameter("age");
out.println("用户名:" + user + "
");
out.println("年龄:" + age + "
");
//获取所有的参数名字,返回值类型枚举类型.得到所有的参数名
Enumeration<String> parameterNames = getInitParameterNames();
//遍历参数名字
while (parameterNames.hasMoreElements()){
//获取一个参数名
String name = parameterNames.nextElement();
//获取一个参数值
String value = getInitParameter(name);
//打印输出
out.print("用户名"+name+"参数值"+value+"
");
}
}
}
方式一:
直接复制都爱webapps目录下
方式二:虚拟路径
修改servlet.xml文件,在host元素下配置Context,指定docBase和path属性
方式三:单独的xml文件
在conf/Catalina/localhost下创建一个xml文件,文件名就是访问地址,内容是Context元素
1.创建一个类继承于HttpServlet;
2.重写doGet或doPost方法
3.使用xml配置或@WebServlet指定访问地址