HTML&CSS&JavaScript&JQuery之Servlet篇
1 Servlet
- 什么是Servlet:是一种JavaEE规范(接口),是JavaEE三大组件之一,是运行在服务器上的java程序,可以接收和响应客户端请求。三大组件分别是Servlet程序、Filter过滤器、Listener监听器
2 创建Servlet
- 创建一个类实现Servelt接口
- 实现service方法,处理请求和响应
package servlet_;
import javax.servlet.*;
import java.io.IOException;
/**
* @author linxi
* @project webhelloworld01
* @package servlet_
* @date 2020/3/12-5:43 下午
*/
public class helloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 专门用来处理请求和相应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("helloworldservelt");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 配置xml文件: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">
<!--Servlet标签给Tomcat配置Servelt配置程序-->
<servlet>
<!--Servelt程序别名-->
<servlet-name>helloServlet</servlet-name>
<!--Servelt程序全类名-->
<servlet-class>servlet_.helloServlet</servlet-class>
</servlet>
<!--给Servelt程序配置访问地址-->
<servlet-mapping>
<!--告知服务器配置的地址给哪个Servelt程序使用-->
<servlet-name>helloServlet</servlet-name>
<!--配置访问地址
/ 表示地址为http://ip:port/工程路径
/hello 表示http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
3 Servlet生命周期
- 执行Servlet构造器方法(只执行一次)
- 执行init初始化方法(只执行一次)
- 执行service方法(每次访问都会执行)
- 执行destroy销毁方法(web停止时调用)
4 通过集成HttpServlet实现Servlet程序
- 一般实际开发中都使用集成HttpServlet实现Servlet程序
- 方法:
- 编写一个类去集成HttpServlet
- 根据业务需要重写doGet或doPost方法
- 到web.xml中的配置Servelt程序访问地址
package servlet_;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author linxi
* @project webhelloworld01
* @package servlet_
* @date 2020/3/12-8:43 下午
*/
public class helloServelt1 extends HttpServlet {
/**
* 在get请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("doget方法");
}
/**
* 在post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("dopost方法");
}
}
5 使用IDEA创建Servlet程序
- 取消选择Creat JavaEE6 annotated class
6 Servlet继承体系
Interface Servlet <-实现- Class GenericServlet <-继承- Class HttpServlet <-继承- 自定义Servlet类
7 ServletConfig类(Servlet配置信息类)
-
Servelt程序和ServeltConfig对象由tomcat服务器创建,Servelt是第一次访问的时候创建,ServeltConfig是每个Servelt程序创建时就创建一个对应的ServeltConfig对象
-
作用
- 获取Servelt程序别名servlet-name的值
- 获取初始化参数init-param
- 获取ServeltContext对象
@Override public void init(ServletConfig servletConfig) throws ServletException { //获取Servelt程序别名servlet-name的值 servletConfig.getServletName(); //获取初始化参数init-param servletConfig.getInitParameter("username"); servletConfig.getInitParameter("url"); //获取ServeltContext对象 servletConfig.getServletContext(); }
8 ServletContext接口类(表示Servelt上下文对象)
-
每个工程只有一个ServeltContext对象实例
-
ServeltContext在工程部署时候创建,在工程停止时销毁
-
ServeltContext是一个域对象。
- 域对象是一个可以像Map一样存取数据的对象
存数据 取数据 删除数据 Map put() get() remove() 域对象 setAttribute() getAttribute() removeAttribute() -
作用:
- 获取web.xml中配置的上下文参数context-param
- 获取当前工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存取数据
例子:
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取web.xml中配置的上下文参数context-param ServletContext servletContext = getServletConfig().getServletContext(); servletContext.getInitParameter("username"); //获取当前工程路径,格式:/工程路径 servletContext.getContextPath(); //获取工程部署后在服务器硬盘上的绝对路径 /** * /代表http://ip:port/工程名/ */ //获取工程部署路径 servletContext.getRealPath("/"); //获取css部署路径 servletContext.getRealPath("/css"); //像Map一样存取数据 servletContext.setAttribute("key1","value1"); servletContext.getAttribute("key1"); servletContext.removeAttribute("key1"); }
9 HTTP协议
- 客户端域服务器通信时发送的数据需要遵守HTTP协议,发送的数据叫报文
9.1 get请求
- 请求行:
- 请求的方式:GET
- 请求的资源路径[+?+请求参数]
- 请求的协议的版本号:http/1.1
- 请求头:
- key:value组成,不同的键值对表示不同的含义
9.2 post请求
- 请求行:
- 请求的方式:GET
- 请求的资源路径[+?+请求参数]
- 请求的协议的版本号:http/1.1
- 请求头:
- key:value组成,不同的键值对表示不同的含义
- 空行
- 请求体:
- 发送给服务器的数据
10 GET和POST的区别
- GET的请求:
- from标签 method=get
- a标签
- link标签引入css
- Script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后回车
- post请求
- from标签 method=post
11 相应的HTTP协议格式
- 相应行
- 相应的协议和版本号
- 相应状态码
- 响应状态描述符
- 相应头
- key:value 不同的相应头,有其不同含义
- 相应体:回传给客户端的数据
12 常见响应码
- 200:请求成功
- 302:重新定向
- 404:请求地址错误
- 500:服务器收到请求但服务器内部错误
13 HttpServletRequest类
- 每次有请求进入TomCat服务器,TomCat会把请求过来的信息解析好封装到Request对象中然后传递到service方法中供使用,所以可以通过HttpServletRequest对象获取到所有的请求信息。
- 常用方法
getRequestURI();//获取请求的资源路径
getRequestURL();//获取请求的同意资源定位符(绝对路径)
getRemoteHost();//获取客户端ip地址
getHeader();//获取请求头
getParameter();//获取请求参数
getParameterValues();//获取多个请求参数
getMethod();//获取请求的方式GET和POST
setAttribute(key,value);//设置域数据
getAttribute(key);//获取域数据
getRequestDispatcher();//获取请求转发对象
14 请求的转发
-
服务器收到请求后从一个资源跳到另一个资源
-
特点
- 浏览器地址栏没变化
- 只有一次请求
- 共享Request域中数据
- 可以转发到WEB-INF目录下
- 不可以访问工程以外的目录
-
base:设置页面相对路径工作路径参照的地址
<base href="参考地址">
15 HttpServletResponse类
-
每次有请求进入TomCat服务器,TomCat会把请求过来的信息解析好封装到Request对象中然后传递到service方法中供使用,所以可以通过HttpServletResponse对象获取到所有的响应信息。
-
包含的两个输出流
- 字节流(
getOutputStream();
):传递二进制数据 - 字符流(
getWriter();
):回传字符串
- 注意:两个流只能同时使用一个。
- 字节流(
-
回传数据:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//往客户端回传数据
PrintWriter writer = response.getWriter();
writer.write("回传内容");
}
16 请求重定向
-
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
-
特点
- 浏览器地址栏有变化
- 两次请求
- 不共享Request域中数据
- 不可以转发到WEB-INF目录下
- 可以访问工程以外的目录
-
方式一:
// 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
- 方式二:推荐
resp.sendRedirect("http://localhost:8080");