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 | 获取配置文件 |
| 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存储数据在客户端浏览器
- 浏览器对于单个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可以共享
- 假设在一个Tomcat服务器中,部署了多个Web项目,那么在这些Web项目中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操作步骤
- 导入JAR包 jsoup-1.14.3.jar
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
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());