目录
一、Tomcat详解
网站是如何进行访问的:
- 输入一个域名;
- 检查本机的C:\\Windows\System32\drivers\etc\hosts配置下有没有
- 有:直接返回相应的ip地址
- 没有:去DNS服务器上找 (全世界的域名都在这里)
二、http详解
什么是http
http(超文本传输协议)是一个简单的请求-响应协议,通常运行在tcp之上。
文本:html,字符串,......
超文本:图片,音乐,视频,......
端口:80
https:安全的
端口:443
两个时代
http/1.0:客户端可以与web服务器链接后,只能获得一个web资源,断开连接
http/1.1:客户端可以与web服务器链接后,可以获得多个web资源
http请求(request)
客服端--发送请求--服务器
请求行中的方式:get、post、head、delete、put
get:请求能够携带的参数少,大小有限制,能在浏览器显示,不安全但高效
post:大小没限制,安全但不高效
消息头
http响应
服务器--响应请求--客户端
响应码:
200:响应成功
3××:请求重定向
4××:资源不存在 404 403禁止访问
5××:粗武器代码错误 500 502网关错误
三、Maven详解
maven项目架构管理工具(方便导入jar包的)
Maven的核心思想:约定大于配置
四、Servlet
1.什么是servlet?
编写一个类,实现servlet接口
把开发好的部署到web服务器中
2.配置环境变量?
H2_HOME: maven目录下的bin目录
MAVEN_HOME:maven的目录
在系统变量的path:%MAVEN_HOME%\bin
3.helloservlet
1.构建一个maven项目,删掉src目录。
2.关于父子工程:
父:会有module
子:parent
3.Maven环境优化
修改web.xlm为最新的
将maven的结构搭建完整
4.编写一个servlet程序
编写一个普通类
直接继承servlet接口,继承HttpServlet
5.编写servlet的映射
<!-- 注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.kun.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
6.配置tomcat
7.启动测试
4.servlet原理
5.mapping:
1.可以请求一个映射
2.可以请求多个映射
3.通配符/*
4.可以自定义后缀
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
5.优先级问题:指定了固有的映射路径最高
6.ServletContext
1.在web容器启动的时候,它会为每一个程序创建一个对应的ServletContext对象,他代表了当前的web应用。
共享数据:(先存后取)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter() 初始化参数
// this.getServletConfig() servlet配置
// this.getServletContext() servlet上下文
ServletContext servletContext = this.getServletContext();
String username = "小明";
servletContext.setAttribute("username",username); //将一个数据保存在ServletContext中
System.out.println("hello");
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置web.XML
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kun.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.kun.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
请求转发
ServletContext context = this.getServletContext();
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
requestDispatcher.forward(req,resp); //调用forward实现请求
读取资源文件(properties)
在java目录下新建properties和resources目录下新建properties,
都被打包在同一个目录下,俗称classpath
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop=new Properties();
prop.load(is);
String user=prop.getProperty("username");
String pwd=prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7.HttpServletResponse
响应:web服务器接收到客户端的http请求,针对这个请求分别创建一个代表请求的HttpServletRequest,代表响应的一个HttpServletResponse
- 如果要获取请求过来的参数就找:HttpServletRequest
- 如果要给客户响应一些信息就找:HttpServletResponse
常见应用:
1.向浏览器输出消息
2.下载文件
文件的路径
文件名
设置想办法让浏览器能够支持下载
获取下载文件的输入流
创建缓冲区
获取outputstream对象
将flieOutputStream流写入到buffer缓冲区
使用outputstream将缓冲区的数据输出到客户端
package com.kun.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FlieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 文件的路径
// String realPath = this.getServletContext().getRealPath("/a.jpg");
String realPath="Z:\\javaweb-maven\\response\\src\\main\\resources\\a.jpg";
System.out.println("路径:"+realPath);
// D:\A.javawed\apache-tomcat-9.0.54\webapps\r\a.jpg
// Z:\javaweb-maven\response\src\main\resources\a.jpg
// 文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 设置想办法让浏览器能够支持下载 中文用URLEncoder下载
resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
// 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 创建缓冲区
int len=0;
byte[] bytes = new byte[1024];
// 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
}
out.close();
in.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
验证码功能:
前端实现js
后端实现,需要用到一个java图片类,生产一个图片
package com.kun.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 如何让浏览器5秒刷新一次
resp.setHeader("refresh","1");
// 在内容中创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
// 得到图片
Graphics2D g = (Graphics2D) image.getGraphics(); //笔
g.setColor(Color.white); //背景
g.fillRect(0,0,80,20);
// 给图片写数据
g.setColor(Color.BLUE); //笔的颜色
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
// 告诉浏览器这个请求用浏览器打开
resp.setContentType("image/jpeg");
// 网站存在缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
// 把图片写给浏览器
boolean write = ImageIO.write(image,"jpg",resp.getOutputStream());
}
// 生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(99999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
sb.append("0");
}
num = sb.toString()+num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
实现web.xml
<servlet>
<servlet-name>image</servlet-name>
<servlet-class>com.kun.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>image</servlet-name>
<url-pattern>/img</url-pattern>
</servlet-mapping>
重定向: 一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫做重定向。
重定向编码:302
转发:307
常见场景:
用户登录:
/* resp.setHeader("Location","/r/img"); resp.setStatus(302); //状态码 * */ resp.sendRedirect("/r/img"); //<url-pattern>/img</url-pattern>
界面跳转:表单提交
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径 需要找到项目的路径--%>
<%--${pageContext.request.getContextPath()}代表当前项目--%>
<form action="${pageContext.request.getContextPath()}/login" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>com.kun.servlet.RequestTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
System.out.println("进入请求");
// 处理请求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
// 重定向的时候一定要注意,当前路径问题
resp.sendRedirect("/r/success.jsp");
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>新界面</h1>
</body>
</html>
8.HttpServletRequest
代表客户端的请求,用户通过http协议访问服务器,http中所有的信息都被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端所有信息。
1.获取前端的值
package com.kun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
// 后台接受乱码问题
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
// 通过请求转发
// req.getContextPath()=/req
System.out.println(req.getContextPath());
req.getRequestDispatcher("/success.jsp").forward(req,resp); //转发不用加项目目录名
//resp.sendRedirect("/req/success.jsp"); //重定向加路径名
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
五、cookie
1.会话:用户打开一个浏览器,点击了很多链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
2.一个网站怎么证明你来过?
1.服务器给客户一个cookie,客户端下次访问服务器带上cookie就可以了
2.服务器登记你来过,下次你访问的时候来匹配你。
3.保存会话的两种技术
cookie:客户端技术(响应和请求)
session:服务器技术(利用整个技术,可以保存用户的会话信息,把信息放在session中)
cookie方法:
package com.kun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
// 服务器从客户端获取
Cookie[] cookies = req.getCookies();
// 判断是否存在
if (cookies!=null){
// 如果存在
out.write("你上次访问的时间是:");
// for(Cookie cookie:cookies){ }
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("Time")){ // 获取cookie
// cookie.getValue(); //获取cookie的值
long l = Long.parseLong(cookie.getValue());
Date date=new Date(l);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是你第一次访问");
}
// 服务器响应一个cookie
Cookie cookie = new Cookie("Time",System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Cookie[] cookies = req.getCookies(); //获取所有cookie信息
cookie.getName() //获取cookie的名称
cookie.getValue(); //获取cookie的值
//创建cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(24 * 60 * 60); //设置cookie的有效期
cookie细节问题
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器大宋多个cookid,最多存放20个
- cookie大小限制4kb
- 上限大概为300个(浏览器上限)
删除cookie
- 设置有限期,关闭浏览器,自动失效
- 设置有限期为0
URLEncoder.encode("小明","utf-8") // 编码
URLDecoder.decode(cookie.getValue(),"UTF-8") // 解码
cookie存放位置:C:\Users\14024\AppData
六、session
1.什么是session?
- 服务器会给每一个用户创建一个session对象
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就不会消失
- 用户登录,整个网站都可以访问——保存用户信息——保存购物。。。。
2.cookie和session区别
- cookie是把用户的数据写给用户的浏览器,浏览器去保存
- session是把用户的数据写到独占session中,服务器端保存
3.使用场景(保存用户信息——保存购物)
存数据
package com.kun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//给session存东西
session.setAttribute("name","小明");
// Person person = new Person(18, "小明");
// session.setAttribute("person",person);
//获取session的Id
String id = session.getId();
//判断session是不是新创建
if (session.isNew()){
resp.getWriter().write("session 创建成功,ID"+id);
}else {
resp.getWriter().write("session 已经存在了"+id);
}
//session创建的时候做了什么事情
// Cookie cookie = new Cookie("JSESSIONID", id);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
取数据
package com.kun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//从session中获取数据
String name = (String)session.getAttribute("name");
//Person person = (Person)session.getAttribute("person");
System.out.println(name);
//System.out.println(person);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
4.注销session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
session.removeAttribute("name");
//注销
session.invalidate();
}
<session-config> <!-- 15分钟后session自动失效--> <session-timeout>15</session-timeout> </session-config>