文章目录
http
网络超文本数据传输协议
不支持中文,传输中文时将字符分割为十六进制的字节以百分号分割而进行传输
URL编码: URLEncoder.encode(String, "编码");
以指定编码将字符串转换成URL编码
URL解码: URLDecoder.decode(String, "编码");
将URL编码以指定编码转换成字符串
浏览器 -> 服务器 : 请求
服务器 -> 浏览器 : 响应
请求行 GET html.html?username=abc&password=123 HTTP/1.1 //GET(请求方式) html.html(请求网址)?(问号分割)username=abc&password=123(get独有,数据参数) HTTP/1.1(协议版本)
请求头 //告诉浏览器/服务器一些自身信息,帮助兼容性判断
//空行 (空一行以分割请求头和请求体)
请求体 //post独有,数据参数
常用请求头:
user-agent //浏览器的版本信息
referer //获取前一个页面(从哪里跳转过来)
servlet
服务器与网页关联的通道
实现servlet接口并重写以下方法
方法 | 说明 |
---|---|
init() | 第一次访问Servlet时,只执行一次 |
service() | 每次访问servlet时执行 |
destroy() | 当服务器关闭时,只执行一次 |
更改Servlet的创建时机:
在web.xml中的标签中添加值 //负数(默认):第一次访问时创建 /正整数:服务器启动时创建Servlet,值越小优先级越高
HttpServlet
继承带 Http协议 的 servlet接口 实现类
重写带 Http协议 的 service()方法
package cn.yang.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;
@WebServlet("/abc")
public class DemoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //解决中文乱码
resp.setContentType("text/html;charset=UTF-8"); //解决中文乱码
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("name = "+ name);
writer.close();
}
}
配置文件驱动
web.xml
<servlet>
<servlet-name>匹配名</servlet-name>
<servlet-class>全类名</servlet-class> <!-- 对应service方法 -->
</servlet>
<servlet-mapping>
<servlet-name>匹配名</servlet-name> <!-- 与上相同 -->
<url-pattern>/访问路径</url-pattern> <!-- 注意别忘了"/" -->
</servlet-mapping>
浏览器根据<url-pattern>
路径找到<servlet-name>
根据<servlet-name>
找到<servlet-class>
注解驱动
@WebServlet("/访问路径"): 根据访问路径调用方法
ServletContext
关联tomcat,可以获取tomcat相关内容
方法 | 返回值 | 说明 |
---|---|---|
this.getServletContext() | 构造方法 | 获取ServletContext对象 |
getMimeType(String str) | String | 获取web规则中的 str后缀 对应的mime类型 / MIME类型: 网络中媒体类型的规则,让指定的引擎解析指定的数据 |
getRealPath(String str) | String | 根据相对于web的路径获取绝对路径 |
ServletContext域
全局共享数据的map集合(全局域)
方法 | 返回值 | 说明 |
---|---|---|
getAttribute(key) | Object | 获取全局域中key对应的值 |
removeAttribute(key) | boolean | 删除全局域中key及对应的值 |
setAttribute(String key, Object value) | void | 添加/修改全局域 |
Request
Servlet中传递的参数表示浏览器向服务器的请求的数据
HttpServlet类中传递的为Request接口的实现类HttpRequest 其对象名一般为: req
方法 | 返回值 | 说明 |
---|---|---|
req.setCharacterEncoding(“UTF-8”) | void | 更改tomcat默认编码 |
req.getInputStream() | InputStream | 调用字节流接收数据 |
req.getReader() | Reader | 调用字符流接收数据 |
req.getServletContext() | ServletContext | 获取ServletContext |
req.getSession() | Session | 获取Session |
请求行:
方法 | 返回值 | 说明 |
---|---|---|
req.getContextPath() | String | 获取虚拟路径 |
req.getRequestURI() | String | 获取统一资源标识符(只有路径,范围更广) |
req.getRequestURL() | String | 获取统一资源定位符(全部IP路径) |
req.getQueryString() | String | get方式获取参数的方法(旧) |
请求头:
方法 | 返回值 | 说明 |
---|---|---|
req.getHeader(String str) | String | 获取请求头str的值 |
req,getCookies() | Cookie[] | 获取到从浏览器带过来的Cookie |
请求参数:
方法 | 返回值 | 说明 |
---|---|---|
req.getParameter(key) | String | 获取key对应的单个值 |
req.getParameterValues(key) | String[] | 获取key对应的多个值 |
req.getParameterMap() | Map<String,String[]> | 获取所有key和对应的值 |
Request域
一次请求中共享(请求域!)
方法 | 返回值 | 说明 |
---|---|---|
req.setAtt(String key, Object value) | void | 增/改 |
req.getAtt(key) | Object | 查 |
req.removeAtt(key) | boolean | 删 |
req.getRequestDispatcher(String str).forward(req,resp) | void | 转发到str路径(带资源跳转,只跳转Servlet,不跳转浏览器路径) |
Response
Servlet中传递的参数表示服务器向浏览器的响应的数据
HttpServlet类中传递的为Response接口的实现类HttpResponse 其变量名一般为: resp
方法 | 返回值 | 说明 |
---|---|---|
resp.setContentType(“text/html;charset=UTF-8”) | void | 告诉浏览器使用什么编码 |
resp.getOutputStream() | OutputStream | 调用字节流发布数据 |
resp.getWriter() | Writer | 调用字符流发布数据 |
resp.setHeader(“content-disposition”, “attachment;filename=” + “文件名”) | void | 配合 getWriter输出流 ,以该文件名下载文件,中文文件名需URL编码 |
resp.sendRedirect(String str) | void | 重定向至str(二次请求,浏览器地址发送变化) |
resp.addCookie(cookie对象) | void | 将Cookie添加到浏览器 |
Cookie
会话共享数据(饼干)
存储在浏览器端
方法 | 返回值 | 说明 |
---|---|---|
Cookie(String key, String value) | 构造方法 | 创建一个Cookie |
setMaxAge(int) | void | 调整Cookie的存活时间,以’秒’为单位,负数(默认):关闭浏览器后cookie消失 |
Session域
一次会话中共享(会话域)
数据储存在服务器端,浏览器端以Cookie记录一个key,一个key对应一个Session //默认存在时间30分钟
方法 | 返回值 | 说明 |
---|---|---|
setAttr() | void | 增/改 |
getAttr() | Object | 查 |
removeAttr() | boolean | 删 |
Filter
过滤器,添加过滤的页面被访问时会先经过过滤器,放行后才可被访问
@WebFilter("/*") //添加WebFilter注释, 过滤多个路径:({"/路径", "/路径", "/路径"}), 通配符:("/*")所有路径, ("*.jsp")固定结尾路径, ("/student*")固定开头路径
public class MyFilter implements Filter { //需要实现javax.servlet.Filter接口
@Override //重写doFilter方法
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//配置,判断等
chain.doFilter(req, resp); //放行
}
}
Listener
监听器,监听某个域对象被创建或销毁,一般只监听ServletContext域的创建
@WebListener //添加WebListener注释,表明这是一个监听器
public class MyListener implements ServletContextListener { //需要实现ServletContextListener接口
@Override //重写contextInitialized方法
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext(); //获取ServletContext对象
//ServletContext域对象创建时需要的操作
}
}
例
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<groupId>cn.yang</groupId>
<artifactId>web</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/yang</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
index.html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>开始页面</title>
</head>
<body>
<form action="abc" method="post">
<label>
账号: <input type="text" name="username" value="abc" required>
</label><br/>
<label>
密码: <input type="password" name="password" value="abc" required>
</label><br/>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
abc.html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>登录失败</title>
</head>
<body>
<a href="index.html">重新登陆</a>
</body>
</html>
DemoServlet.java
package cn.yang.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;
@WebServlet("/abc")
public class DemoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("abc".equals(username) && "abc".equals(password)){
resp.sendRedirect("https://baidu.com/");
}else {
req.getRequestDispatcher("abc.html").forward(req,resp);
}
}
}
运行结果;
浏览器打开 localhost:8080/yang
登录成功重定向至百度
登陆失败转发至 abc.html