web服务器软件
部署项目方式:
1.直接将项目放到webapps目录下即可
简化部署:将项目打成一个war包,再将war包放置到webapps下
2.配置conf/server.xml文件
在Host标签体中配置
< Context doBase=“项目存放路径” path=“虚拟目录”/ >
3.在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
< Context doBase=“项目存放路径” >
虚拟目录即使xml文件的文件名
静态项目和动态项目:
Java动态项目的目录结构:
项目根目录->
WEB-INF目录->
web.xml:web项目核心配置文件
classes目录:放置字节码文件的目录
lib目录:放置依赖jar包
Tomcat集成到IDEA:
Server Applet,运行在服务器端的小程序,本质上Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则
在web.xml中配置Servlet
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>demo01.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
使用注解进行配置:
@WebServlet("/demo")
实现Servlet接口
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello World");
}
1.当服务器接收到客户端浏览器的请求后,会解析请求url路径,获取访问Servlet的资源路径
2.查找web.xml文件,是否有对应的< url-pattern >标签体内容
3.如果有,则在找对应的< servlet-class >全类名
4.Tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
默认情况下,第一次被访问时Servlet被创建
public void init(ServletConfig servletConfig) :初始化方法。在Servlet被创建时执行,只会执行一次
第一次被访问时创建:< load-on-startup >值为负数
服务器启动时创建:< load-on-startup >值为0或者负数
每次访问Servlet方法都会被调用一次
public void service(ServletRequest servletRequest, ServletResponse servletResponse):提供服务方法,每一次Servlet被访问时执行,执行多次
Servlet被销毁时执行。服务器关闭时,Servlet被销毁。只有服务器正常关闭才会执行destroy方法。destroy方法在Servlet被销毁之前执行,一般用于释放资源
public void destroy():销毁方法,在服务器被正常关闭时执行一次
public ServletConfig getServletConfig():获取ServletConfig对象
public String getServletInfo():获取Servlet的信息,版本,作者等
Servlet–接口
GenericServlet–抽象类
将Servlet接口中其他方法做了空实现,只将service()作为抽象
将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
@WebServlet("/demo2")
public class ServletDemo02 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("demo2");
}
}
HttpServlet–抽象类
推荐使用
对http协议的封装,简化操作
1.定义类继承HttpServlet
2.复写doGet/doPost
@WebServlet("/demo3")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
}
Hyper Text Transfer Protocol超文本传输协议
传输协议:定义了客户端和服务器端通信时传输模式
特点:
1.基于TCP/IP的高级协议
2.默认端口号80
3.基于请求/响应模型:一次请求对应一次响应
4.无状态的:每次请求之间相互独立,不能交互数据
请求行
请求方式 请求url 请求协议/版本
请求头
请求头名称:请求头值
请求空行
作为分隔作用
请求体
请求参数
1.Tomcat服务器会根据请求yrl中的资源路径,创建对应的ServletDemo对象
2.Tomcat服务器会创建Request与Response对象,Request对象中封装请求和消息数据
3.Tomcat将Request和Response两个对象传递给Service方法并且调用
4.程序员可以通过Request对象获取请求消息数据,通过Response对象设置响应消息数据
获取请求方式:String getMethod()
获取虚拟目录:String getContextPath()
获取Servlet路径:getServletPath()
获取get方式请求参数:String getQueryString()
获取请求uri:String getRequestURI()
获取协议与版本:String getProtocol()
获取客户机IP地址:String getRemoteAddr()
String getHeader(String name):根据请求头的名称获取请求头的值
Enumeration< String > getHeaderNames():获取所有的请求头名称
获取流对象,从流对象中获取数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求消息体
//获取字符流
BufferedReader br = request.getReader();
//读取数据
String line=null;
while ((line=br.readLine())!=null){
System.out.println(line);
}
}
String getParameter(String name):根据参数名称获取参数值
String[] getParameter(String name):根据参数名称获取参数值的数组
Enumeration< String > getParameterNames():获取所有请求的参数名称
Map< String,String[] > getParameterMap():获取所有参数的Map集合
一种在服务器内部的资源跳转方式
步骤:
1.通过Request对象获取请求转发器对象
2.使用对象进行转发
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello Servlet demo2");
//转发到RequestDemo3
request.getRequestDispatcher("/requestDemo3").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
特点:
1.浏览器地址栏路径不会发生变化
2.只能转发到当前服务器内部资源中
3.转发是一次请求
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:一次请求的范围,一般用于请求转发的多个资源中共享数据
setAttribute(String name,Object obj):存储数据
getAttribute(String name):通过键获取值
removeAttribute(String name):通过键移除键值对
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello Servlet demo2");
//存储数据到request域中
request.setAttribute("msg","hello");
//转发到RequestDemo3
request.getRequestDispatcher("/requestDemo3").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("Hello Servlet demo3");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
getServleContext()
1.响应行
组成:协议/版本 响应码状态 状态吗描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
2.响应头
3.响应空行
4.响应体
格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sc)
setHeader(String name,String value)
//完成重定向
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1");
/* //访问这个资源会自动跳转到Demo2
//设置状态吗为302
response.setStatus(302);
//设置响应头为location
response.setHeader("location","/Day20/responseDemo2");*/
response.sendRedirect("/Day20/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
重定向特点:
1.地址栏发生变化
2.重定向可以访问其他站点的资源
3.重定向是两次请求。不能使用request对象共享数据
转发的特点:
1.转发栏路径不变
2.转发只能访问当前服务器下的资源
3.转发是一次请求。可以使用request对象来共享数据
动态获取虚拟目录:
request.contextPath()
设置编码:
response.setContentType(“text/html;charset=utf-8”)
使用步骤:
1.获取输出流
2.使用输出流,将数据输出到浏览器
代表整个web应用,可以和程序的容器进行通信
通过request获取:getServletContext();
通过HttpServlet获取:getServletContext();
1.获取MIME类型
String getMimeType(String file)
2.域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
3.获取文件真实路径
getRealPath(String name)