JavaWeb-基础知识


// 注册Servlet
@WebServlet(name = "helloServlet", value = "/hello-servlet")
// 注册过滤器
@WebFilter(filterName = "HelloFilter", urlPatterns = {"/*"})
// 注册监听器
@WebListener

Servlet

pom文件依赖-Servlet & JSP

    jstl
    jstl
    1.2


    taglibs
    standard
    1.1.2

Servlet代码案例
@WebServlet(name = "loginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        // 方式一:获取请求参数并封装到User对象中
        // String username = request.getParameter("username");
        // String password = request.getParameter("password");
        // User user = new User();
        // user.setUsername(username);
        // user.setPassword(password);
        // 方式二:使用BeanUtils包将参数封装到User对象中
        Map map = request.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        UserDao userDao = new UserDao();
        User login = userDao.login(user);
        // 请求转发
        if (login == null) {
            request.getRequestDispatcher("/failServlet").forward(request, response);
        } else {
            request.setAttribute("user", login);
            request.getRequestDispatcher("/successServlet").forward(request, response);
        }
        // 重定向
        // response.sendRedirect(request.getContextPath()+"/successServlet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
Servlet接口
常用方法 返回值类型 说明
init(ServletConfig) void 初始化Servlet
service(ServletRequest var1,ServletResponse var2) void 处理客户端响应请求
destroy void 销毁Servlet
getServletConfig() ServletConfig 获取ServletConfig对象
getServletInfo() String 该方法返回servlet信息,如:作者、版本号、版权等
ServletConfig接口:获取在web.xml中配置的初始化参数(标签内的信息)
常用方法 返回值类型 说明
getServletContext() ServletContext 获取ServletContext对象
getServletName() String 获取配置文件标签中的Servlet名字
getInitParameter(String name) String 获取指定名字的初始化参数值;如果该变量不存在,返回null
getInitParameterNames() Enumeration 获取所有的初始化参数列表
ServletRequest接口
常用方法 返回值类型 说明
getRequestDispatcher(String path) RequestDispatcher 获取转发器
setAttribute(String name, Object o) void 在域对象中存储数据
getAttribute(String name) Object 通过键获取值
getAttributeNames() Enumeration 获取所有的键名字
removeAttribute(String name) void 通过键名移除键值对
setCharacterEncoding(String env) void 设置字符编码;Tomcat8已经将GET方式乱码解决了
getCharacterEncoding() String 获取字符编码
getContentType() String 返回请求数据体的MIME类型,如果类型未知返回空值
getParameter(String name) String 根据参数名称获取参数值
getParameterValues(String name) String[] 根据参数名称获取参数值的数组
getParameterNames() Enumeration 获取所有请求的参数名称
getParameterMap() Map 获取所有参数的Map集合
getServletContext() ServletContext
getProtocol() String 获取请求所用的协议,其形式是协议/主版本号.次版本号
getServerName() String 获取接收请求的服务器的主机名
getServerPort() int 获取接收请求的服务器的端口号
getRemoteAddr() String 获取客户机的IP地址
getRemoteHost() String 获取客户机的完整主机名
getRemotePort() int 获取客户机端口号
getLocalName() String 返回WEB服务器的主机名
getLocalAddr() String 返回WEB服务器的IP地址
getLocalPort() int 返回WEB服务器的端口号
getInputStream() ServletInputStream 获取字节输入流,可以操作所有类型数据
getReader() BufferedReader 获取字符输入流,只能操作字符数据
getContentLength() int 返回请求正文的长度(以字节为单位)
getScheme() String 返回请求所使用的URL的模式
getRealPath(String path) String 返回与虚拟路径相对应的真实路径
ServletResponse接口
常用方法 返回值类型 说明
setCharacterEncoding(String charset) void 设置发送到客户端的响应的字符编码(MIME 字符集)
setContentType(String type) void 如果响应尚未提交,则设置发送给客户端的响应的内容类型
setContentLength(int len) void 设置响应中内容主体的长度
setContentLengthLong(long len) void 设置响应中内容主体的长度
setBufferSize(int size) void 设置响应正文的首选缓冲区大小
setLocale(Locale loc) void 如果响应尚未提交,则设置响应的语言环境
getOutputStream() ServletOutputStream 设置响应体;字节输出流
getWriter() PrintWriter 设置响应体;字符输出流
getCharacterEncoding() String 返回用于在此响应中发送的正文的字符编码(MIME 字符集)的名称
getContentType() String 返回用于在此响应中发送的 MIME 正文的内容类型
getBufferSize() int 返回用于响应的实际缓冲区大小
getLocale() Locale 返回为此响应指定的语言环境
flushBuffer() void 强制将缓冲区中的任何内容写入客户端
resetBuffer() void 清除响应中底层缓冲区的内容,而不清除标头或状态代码
reset() void 清除缓冲区中存在的任何数据以及状态代码、标头
isCommitted() boolean 返回一个布尔值,指示响应是否已提交
HttpServlet抽象类
常用方法 返回值类型 说明
doGet(HttpServletRequest req, HttpServletResponse resp) void 处理GET方法
doPost(HttpServletRequest req, HttpServletResponse resp) void 处理POST方法
service(HttpServletRequest req, HttpServletResponse resp) void
service(ServletRequest req, ServletResponse res) void
getLastModified(HttpServletRequest req) long 返回这个请求实体的最后修改时间
getAllDeclaredMethods(Class c) Method[]
maybeSetLastModified(HttpServletResponse resp,long lastModified) void
HttpServletRequest
常用方法 返回值类型 说明
getMethod() String 获取请求方式(GET/POST)
getContextPath() String 获取虚拟目录(/HelloWorld)
getServletPath() String 获取Servlet路径(HelloServlet)
getQueryString() String 获取请求URL所包含的查询字符串(name=zhangsan)
getRequestURI() String 获取请求URI(/HelloWorld/HelloServlet)
getRequestURL() StringBuffer 获取请求URL(http://localhost/HelloWorld/HelloServlet)
getPathInfo() String 返回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息
getRemoteUser() String 返回作了请求的用户名,这个信息用来作HTTP用户论证
getPathTranslated() String 获得这个请求的URL的Servlet路径之后的额外的路径信息,并将它转换成一个真实的路径
getAuthType() String 返回这个请求的身份验证模式
getCookies() Cookie[] 返回一个数组,该数组包含这个请求中当前的所有cookie
getSession() HttpSession 返回与这个请求关联的当前的有效的session
getSession(boolean create) HttpSession 返回与这个请求关联的当前的有效的session
getRequestedSessionId() String 返回这个请求相应的session id
changeSessionId() String
getHeader(String name) String 通过请求头的名称获取请求头的值
getHeaders(String name) Enumeration 获取指定请求头名称的所有对应的值
getHeaderNames() Enumeration 获取所有的请求头名称
getIntHeader(String name) int 返回指定的请求头域的值,这个值被转换成一个整数
getDateHeader(String name) long 返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数
isUserInRole(String role) boolean
isRequestedSessionIdValid() boolean 检查与此请求关联的session当前是不是有效
isRequestedSessionIdFromCookie() boolean 如果这个请求的session id是通过客户端的一个cookie提供的,该方法返回真,否则返回假
isRequestedSessionIdFromURL() boolean 如果这个请求的session id是通过客户端的URL的一部分提供的,该方法返回真,否则返回假
HttpServletResponse
常用方法 返回值类型 说明
sendRedirect(String location) void 重定向
setStatus(int sc) void 设置状态码
setHeader(String name, String value) void 设置响应头
addHeader(String name, String value) void 添加响应头
containsHeader(String name) boolean 检查是否设置了指定的响应头
getStatus() int 设置响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值
getHeader(String name) String
getHeaders(String name) Collection
getHeaderNames() Collection
setIntHeader(String name, int value) void
addIntHeader(String name, int value) void
setDateHeader(String name, long date) void 用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自1970-1-1日以来的精确到毫秒的长整数
addDateHeader(String name, long date) void
encodeURL(String url) String 对包含session ID的URL进行编码
encodeRedirectURL(String url) String 对sendRedirect方法使用的指定URL进行编码
addCookie(Cookie cookie) void 在响应中增加一个指定的cookie
sendError(int sc, String msg) void 用给定的状态码发给客户端一个错误响应
sendError(int sc) void 用给定的状态码发给客户端一个错误响应
setTrailerFields(Supplier supplier) void
getTrailerFields() Supplier
ServletContext接口:所有Servlet共享同一个ServletContext对象
常用方法 返回值类型 说明
setAttribute(String name, Object object) void
getAttribute(String name) Object
getAttributeNames() Enumeration
removeAttribute(String name) void
setInitParameter(String name, String value) boolean
setSessionTimeout(int sessionTimeout) void
setSessionTrackingModes(Set sessionTrackingModes) void 设置会话的跟踪模式
setRequestCharacterEncoding(String encoding) void
setResponseCharacterEncoding(String encoding) void
getRealPath(String path) String 根据相对路径获取服务器上资源的绝对路径
getResource(String path) URL 将指定路径的资源封装成URL实例并返回
getResourcePaths(String path) Set 根据传入的路径,列出该路径下的所有资源路径
getResourceAsStream(String path) InputStream 根据相对路径获取服务器上资源的输入字节流
getRequestDispatcher(String path) RequestDispatcher 返回一个RequestDispatcher对象
getDefaultSessionTrackingModes() Set 获取默认的会话跟踪模式
getContext(String uripath) ServletContext 返回一个指定URL地址的ServletContext对象
getInitParameter(String name) String 获取web.xml中指定参数名的全局配置参数值()
getInitParameterNames() Enumeration
getNamedDispatcher(String name) RequestDispatcher 为指定名字的servlet对象返回一个RequestDispatcher对象
getServerInfo() String 返回servlet容器的名称和版本,格式为servername/versionnumber
getServletContextName() String 返回应用的名称,这里的名称是web.xml里面配置的display-name,如果没配置则返回null
getVirtualServerName() String 返回servlet上下文(即应用)部署的逻辑主机名;Tomcat返回Catalina/localhost
getMajorVersion() int 返回当前servlet容器支持的Servlet规范最高版本
getMinorVersion() int 返回当前servlet容器支持的Servlet规范最低版本
getEffectiveMajorVersion() int 返回当前应用基于的Servlet规范最高版本
getEffectiveMinorVersion() int 返回当前应用基于的Servlet规范最低版本
getMimeType(String file) String 返回文件的MIME类型;在web.xml中的标签内配置
getClassLoader() ClassLoader 获取当前servlet上文的类加载器
getSessionTimeout() int 获取Session过期时间
addServlet(String servletName, String className) ServletRegistration.Dynamic 提供了编程式的向servlet容器中注入servlet的方式
addServlet(String servletName, Servlet servlet) ServletRegistration.Dynamic
addServlet(String servletName,Class servletClass) ServletRegistration.Dynamic
addJspFile(String servletName, String jspFile) ServletRegistration.Dynamic
addFilter(String filterName, String className) FilterRegistration.Dynamic
addFilter(String filterName, Filter filter) FilterRegistration.Dynamic
addFilter(String filterName,Class filterClass) FilterRegistration.Dynamic
addListener(String className) void
addListener(T t) void
addListener(Class listenerClass) void
createServlet(Class clazz) T 实例化一个servlet,得到一个servlet实例
createFilter(Class clazz) T
createListener(Class clazz) T
getServletRegistration(String servletName) ServletRegistration 根据servlet名称查找其注册信息,即ServletRegistration实例
getFilterRegistration(String filterName) FilterRegistration
getJspConfigDescriptor() JspConfigDescriptor 获取web.xml中配置的数据
getSessionCookieConfig() SessionCookieConfig 返回SessionCookieConfig实例,这个实例可以用于获取和设置会话跟踪的cookie的属性
getServletRegistrations() Map 查询当前servlet上下文中所有的servlet的注册信息
getFilterRegistrations() Map
getEffectiveSessionTrackingModes() Set
getRequestCharacterEncoding() String
getResponseCharacterEncoding() String
declareRoles(String... roleNames) void 该方法用于申明安全角色
log(String msg) void 把指定的信息写进servlet日志文件
log(String message, Throwable throwable) void 把指定的信息写进servlet日志文件

客户端会话技术:Cookie

  • cookie存储数据在客户端浏览器
  • 浏览器对于单个Cookie的大小有限制(4KB),以及对同一个域名下的总Cookie数量也有限制(20个)
  • 默认情况下,当浏览器关闭后,Cookie数据被销毁
  • 持久化存储:setMaxAge(int seconds)
    • 正数:将Cookie数据写到硬盘的文件中,持久化存储.并指定cookie存活时间,时间到后,cookie文件自动失效
    • 负数:默认值
    • 零:删除Cookie信息
  • 在Tomcat8之前,cookie中不能直接存储中文数据,需要将中文进行URL编码;在Tomcat8之后,cookie支持中文数据,但对于特殊字符还是不支持(如空格32),建议使用URL编码存储,URL解码解析
  • Cookie共享问题
    • 假设在一个Tomcat服务器中,部署了多个Web项目,那么在这些Web项目中Cookie能不能共享?
      • 默认情况下Cookie不能共享
      • setPath(String path):设置Cookie的获取范围.默认情况下,设置当前的虚拟目录.如果要共享,将path参数设置为"/"即可
    • 不同的Tomcat服务器间Cookie共享问题?
      • setDomain(String path):如果设置一级域名相同,那么多个服务器之间Cookie可以共享
      • setDomain("./baidu.com"),那么tieba.baidu.com和news.baidu.com中Cookie可以共享

Cookie一般用于存储少量不太敏感的数据,在不登录的情况下,完成服务器对客户端的身份识别

Cookie代码案例
@WebServlet(name = "cookie1", value = "/cookie1")
public class CookieServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie c = new Cookie("hello", "world");
        response.addCookie(c);
    }
}

@WebServlet(name = "cookie2", value = "/cookie2")
public class CookieServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println("name = " + name + "value = " + value);
            }
        }
    }
}

Session

服务端会话技术:Session

  • Session用于在一次会话的多次请求间共享数据,将数据保存在服务器端的HttpSession对象中
  • Session可以存储任意类型,任意大小的数据
  • Session的实现是依赖于Cookie的

当客户端关闭后,服务器不关闭,两次获取的Session是否为同一个?

  • 默认情况下,不是
  • 如果需要相同,则可以创建Cookie,键为 JSESSIONID,并且设置Cookie的最大存活时间,让Cookie持久化保存
HttpSession session = request.getSession();
Cookie jsession = new Cookie("JSESSION", session.getId());
jsession.setMaxAge(60 * 60);
response.addCookie(jsession);

客户端不关闭,服务器关闭后,两次获取的Session是同一个吗?

  • 不是同一个,但是真实情况中需要确保数据不丢失
  • session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
  • session的活化:在服务器启动后,将session文件转换为内存中的session对象即可
  • 在关闭服务器的时候,会在tomcat/work目录下生成一个.ser文件,存储的是钝化的数据;在开启服务器的时候,将该文件中数据保存到内存中,并将其文件删除掉(注意:IDEA中的Tomcat钝化没问题,但在活化时是将work整个文件夹进行删除的)

Session的失效时间?

  • 服务器关闭
  • 使用session对象的 invalidate() 方法
  • session的默认失效时间:30分钟(在Tomcat中的web.xml进行默认配置,也可以自己配置进行覆盖)

    300

Session代码案例
@WebServlet(name = "SessionServlet1", value = "/SessionServlet1")
public class SessionServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setAttribute("msg", "hello world");
    }
}

@WebServlet(name = "SessionServlet2", value = "/SessionServlet2")
public class SessionServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object msg = session.getAttribute("msg");
        response.getWriter().write(msg.toString());
    }
}

Session与Cookie的区别

  • Session存储数据在服务器端,Cookie存储数据在客户端
  • Session没有数据大小限制,Cookie有
  • Session数据安全,Cookie相对不安全

JSP

JSP:Java Server Pages(Java服务器端页面),可以理解为一个特殊的页面,其中既可以指定定义HTML标签,又可以定义Java代码,用于简化书写.JSP本质上就是一个Servlet

JSP页面内的注释

  • HTML注释 : 只能注释HTML代码片段
  • JSP注释 : 可以注释所有[推荐使用]

JSP脚本

JSP的脚本就是JSP定义Java代码的方式

  • <% 代码 %> : 在service方法中可以定义什么,该脚本就可以定义什么
  • <%! 代码 %> : 在JSP转换后的Java类的成员位置
  • <%= 代码 %> : 输出语句中的内容;输出语句中可以定义什么,该脚本中就可以定义什么

JSP指令

JSP指令:用于配置JSP页面,导入资源文件

格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值 %>

  • page : 配置JSP页面
  • include : 页面包含的;导入页面的资源文件
  • taglib : 导入标签库
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" buffer="8kb" errorPage="index.html" isErrorPage="true" %>
<%@ include file="top.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSP的九大内置对象

在JSP页面中不需要创建,直接就能使用的对象

变量名 真实类型 说明
pageContext PageContext [域对象]当前页面共享数据;还可以获取其他八个内置对象
request HttpServletRequest [域对象]一次请求访问的多个资源(转发)
session HttpSession [域对象]一次会话的多个请求间共享数据
application ServletContext [域对象]所有用户间共享数据
response HttpServletResponse 响应对象
page Object 当前页面的对象(即当前Servlet,表示this)
out JspWriter 输出对象,数据输出到页面上
config ServletConfig Servlet的配置对象
exceptioin Throwable 异常对象

EL表达式

EL表达式:Expression Language 表达式语言,用来替换和简化JSP页面中Java代码的编写.主要用来进行运算和获取值

语法:${表达式}

JSP默认支持EL表达式,如果想要忽略EL表达式

  • 设置JSP页面的page指令属性 isElIgnored="true" 忽略当前JSP页面中所有的EL表达式
  • \${表达式} 忽略当前这个EL表达式
运算符类型 具体运算符
算数运算符 + - * /(div) %(mod)
比较运算符 > < >= <= == !=
逻辑运算符 &&(and)
空运算符(判断对象是否为null或者length属性是否为0) empty 或者 not empty

获取普通值:EL表达式只能从域对象中获取值;语法如下,举例:${requestContext.msg}

  • ${域名称.键名} : 从指定域中获取指定键的值
    • pageScope --> pageContext
    • requestScope --> request
    • sessionScope --> session
    • applicationScope --> application(ServletContext)
  • ${键名} : 表示依次从最小的域中查找是否有该键对应的值,直到找到为止,如果没有找到,则返回空字符串

获取对象的属性: ${域名称.键名.属性名} 本质上会去调用对象的getter方法
获取List集合的内容: ${域名称.键名[索引]} 或者 ${域名称.键名[索引].属性名}
获取Map集合的内容: ${域名称.键名.key名称} 或者 ${域名称.键名["key名称"]}


EL表达式有11个隐式对象

  • pageContext可以获取JSP页面中的其他八个内置对象;还可以动态获取虚拟目录 ${pageContext.request.contextPath}

JSTL标签库

JSTL是JSP的标准标签库(JavaServer Pages Tag Library),是由Apache组织提供的开源的免费的JSP标签,用于简化和替换JSP页面上的代码

使用步骤:

  • 导入JSTL相关JAR包
  • 引入标签库: taglib指令
  • 使用标签
JSTL使用案例
<%
    // 测试if语句的数据
    List list = new ArrayList();
    list.add("aaa");
    request.setAttribute("list", list);
    request.setAttribute("num", 3);
    // 测试switch语句的数据
    request.setAttribute("number", 1);
    // 测试循环的数据
    List strList = new ArrayList();
    strList.add("hello");
    strList.add("world");
    request.setAttribute("list", strList);
%>
<%--if语句--%>

    遍历集合


    ${num} 为偶数


<%--switch语句--%> 星期一 星期二 星期三 星期四 星期五 星期六 星期七 数字输入有误
<%--普通遍历--%> 输出内容为:${i},循环状态的索引${s.index},循环状态的循环次数${s.count}
<%--for-each循环--%> 输出内容为:${str},循环状态的索引${s.index},循环状态的循环次数${s.count}

过滤器

过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能;一般用于完成通用的操作,如登录验证/统一编码处理/敏感字符过滤

使用步骤:

  • 定义一个类,实现接口Filter
  • 复写方法
  • 配置拦截路径

过滤器生命周期方法

  • init:在服务器启动后,会创建Filter对象,然后调用init方法;只执行一次,用于加载资源
  • doFilter:每一次请求被拦截资源时,会执行;执行多次
  • destroy:在服务器关闭后,Filter对象被销毁.如果服务器是正常关闭的,则会执行destroy方法;只执行一次,用于释放资源

监听器

事件监听机制

  • 事件:一件事情
  • 事件源:事件发生的地方
  • 监听器:一个对象
  • 注册监听:将事件/事件源/监听器绑定在一次;当事件源上发生某个事件后,执行监听器代码
@WebListener
public class HelloListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {}

HTTP

B/S网络架构的核心是HTTP,HTTP Header控制着用户的数据的传输,此外它还控制着用户浏览器的渲染行为和服务器的执行逻辑.例如当服务器没有用户请求的数据时就会返回一个404状态码,告诉浏览器没有要请求的数据,通常浏览器就会展示一个非常不愿意看到的该页面不存在的错误消息

请求头:用于表示请求消息的附加信息的头字段
请求头 说明
Accept 客户端可支持的数据类型(Content-Type),以MIME类型来表示
Accept-Charset 客户端可支持的字符集
Accept-Encoding 客户端可支持的编码格式(Content-Encoding),一般来说表示数据的压缩格式
Accept-Language 客户端可支持的语言,汉语为zh,英语为en
Host 接收请求的服务器IP地址和端口号
User-Agent 客户端软件的名称和版本号等相关信息
From 请求发送者的邮件地址
Authorization 身份认证数据
Referer 当通过点击超级链接进入下一个页面时,在这里会记录下上一个页面的URI
Range 当需要只获取部分数据而不是全部数据时,可通过这个字段指定要获取的数据范围
If-Modified-Since 询问当前缓存的页面是否是最新的,如果是最新的就返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据
If-Unmodified-Since 当指定日期之后数据未更新时执行请求
Date 表示请求和响应生成的日期
Pragma 表示数据是否允许缓存的通信选项
Cache-Control 控制缓存的相关信息
Connection 设置发送响应之后TCP连接是否继续保持的通信选项
Transfer-Encoding 表示消息主体的编码格式
Via 记录途中经过的代理和网关
响应头:用于表示响应消息的附加信息的头字段
响应头 说明
Server 服务器程序的名称和版本号等相关信息
Location 表示信息的准确位置。当请求的URI为相对路径时,这个字段用来返回绝对路径
WWW-Authenticate 当请求的信息存在访问控制时,返回身份认证用的数据
Accept-Ranges 当希望仅请求部分数据(使用Range来指定范围)时,服务器会告知客户端是否支持这一功能
Date 表示请求和响应生成的日期
Pragma 表示数据是否允许缓存的通信选项
Cache-Control 控制缓存的相关信息
Connection 设置发送响应之后TCP连接是否继续保持的通信选项
Transfer-Encoding 表示消息主体的编码格式
Via 记录途中经过的代理和网关
实体头:用于表示实体(消息体)的附加信息的头字段
响应头 说明
Content-Type 表示消息体的数据类型,以MIME规格定义的数据类型来表示,用来指明发送给接收者的实体正文的媒体类型;如Content-Type:text/html;charset=GBK
Content-Encoding 与请求报头Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码
Content-Language 表示消息体的语言。汉语为zh,英语为en
Content-Length 指明实体正文的长度,用以字节方式存储的十进制数字来表示
Content-Range 当仅请求部分数据时,表示消息体包含的数据范围
Content-Location 表示消息体在服务器上的位置(URI)
Expires 表示消息体的有效期;后面跟一个日期时间,浏览器在发出请求之前检查这个字段是否过期,过期了就重新向服务器发起请求
keep-Alive 保持连接的时间,如Keep-Alive:timeout=5,max=120
Allow 表示指定的URI支持的方法
Last-Modified 表示服务器上资源的最后修改时间,通过判断这个最后修改时间可以判断当前请求的资源是否是最新的
Etag 让服务端给每个页面分配一个唯一的编号,然后通过这个编号来区分当前这个页面是否是最新的,但后端处理复杂
常见的状态码
状态码 说明
1XX 告知请求的处理进度和情况
200 客户端请求成功
302 临时跳转,跳转的地址通过Location指定
304
400 客户端请求有语法错误,不能被服务器识别
403 服务器收到请求,但是拒绝提供服务
404 请求的资源不存在
500 服务器发生不可预期的错误

XML

基础语法:

  • XML文档的后缀名是 .xml
  • XML第一行必须定义为文档声明 <?xml version="1.0" encoding="UTF-8"?>
  • XML文档中有且仅有一个根标签
  • 属性值必须使用引号引起来(单双都可以)
  • 标签必须正确关闭
  • XML标签名称区分大小写

XML组成部分

  • 文档声明
    • 格式 : <?xml 属性列表 ?>
    • 属性列表
      • version : 版本号(必选属性)
      • encoding : 编码方式;告知解析引擎当前文档使用的字符集,默认值为ISO-8859-1
      • standalone : 当前XML文件是否独立;YES表示不依赖其他文件;NO表示依赖其他文件
  • 指令(了解) : 可以结合CSS文件对XML进行样式的设置
    • <?xml-stylesheet type="text/css" heft="a.css" ?>
  • 标签 : 标签名可以自定义
    • 名称可以包含字母/数字一级其他的字符
    • 名称不能以数字或者标点符号开始
    • 名称不能以字母 xml(或者XML/Xml等)开始
    • 名称不能包含空格
  • 属性 : ID属性值唯一
  • 文本
    • CDATA区 : 在该区域中的数据会被原样显式出来
    • CDATA区格式 :

约束

约束 : 规定XML文档的书写规则

约束分类

  • DTD : 一种简单的约束技术(.dtd文件)
    • 内部DTD : 将约束规则定义在XML文档中
    • 外部DTD : 将约束的规则定义在外部的DTD文件中
      • 本地 :
      • 网络 :
  • Schema : 一种复杂的约束技术(.xsd文件)

引入Schema约束流程

  • 填写XML文档的根元素
  • 引入xsi前缀 : xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • 引入xsd文件命名空间 : xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
  • 为每一个xsd约束声明一个前缀,作为表示 : xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"

解析XML

解析 : 操作XML文档,将文档中的数据读取到内存中

  • 解析(读取) : 将文档中的数据读取到内存中
  • 写入 : 将内存中的数据保存到XML文档中(持久化的存储)

解析XML的方式

  • DOM : 将标记语言文档一次性加载进内存,在内存中形成一颗DOM数
    • 优点 : 操作方便,可以对文档进行CURD的所有操作
    • 缺点 : 占内存
  • SAX : 逐行读取,基于时间驱动的
    • 优点 : 不占内存
    • 缺点 : 只能读取,不能增删改

XML常见的解析器(第三方实现XML的工具)

  • JAXP : SUN公司提供的解析器,支持DOM和SAX两种思想
  • DOM4J : 一款非常优秀的解析器
  • Jsoup : Jsoup是一款Java的HTML解析器,可直接解析某个URL地址/HTML文本内容.它提供了一套非常省力的API,可通过DOM/CSS以及类似于jQuery的操作方法来取出和操作数据

JSOUP操作步骤

  1. 导入JAR包 jsoup-1.14.3.jar
  2. 获取Document对象
  3. 获取对应的标签Element对象
  4. 获取数据
String path = ClassLoader.getSystemClassLoader().getResource("Student.xml").getPath();
Document document = Jsoup.parse(new File(path), "UTF-8");
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
Element element = elements.get(0);
System.out.println(element.text());