JavaWeb
本文就是个人自己入坑记的笔记
(相关内容参考自狂神说b站视频 https://www.bilibili.com/video/BV12J411M7Sj)
1. http
1.1 什么是http
http(超文本传输协议)是一个简单的请求-响应协议,通常运行在TCP上
- 文本: html 字符串
- 超文本:图本,音乐,视频,定位,地图
- 80
https:安全的
- 443
1.2 两个时代
- http1.0
- HTTP/1.0:客户端介意与web服务器连接后 只能获得一个web资源,断开连接
- http2.0
- HTTP/1.1:客户端可以与web服务器连接后 获得多个web资源
1.3 HTTP请求
- 客户端-发请求-服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET // get方法
Status Code: 200 OK // 状态码200
Remote Address: 14.215.177.39:443
Referrer Policy: strict-origin-when-cross-origin
- 请求行中的请求方式:GET
- 请求方式:Get,Post,Head,DELETE,PUT,TRACT…
- get: 请求能够携带的参数比较小 大小有限制 会在浏览器URL地址栏显示数据的内容 不安全 但高效
- post:请求能够携带的参数没有限制 大小没有限制 不会在浏览器URL地址栏显示数据的内容 安全 但不高效
-
消息头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate, br //支持哪种编码 GBK UTF-8 等等 Accept-Language: zh-CN,zh;q=0.9 //语言 Cache-Control: max-age=0 Connection: keep-alive Cookie: BIDUPSID=A11CD8CAEBE6953BD4C732D879035A58; PSTM=1604232386; BAIDUID=A11CD8CAEBE6953B3DE48B25834E3723:FG=1; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDUSS=dlYUhEQ1lrUThYZVkxV0FFbTRhaFVzZ0t5Y0l1SWRKb05MTnp0Q1ZUTHF-c1pmRVFBQUFBJCQAAAAAAAAAAAEAAAAGWNfPX19fTFdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOpxn1~qcZ9fOW; BDUSS_BFESS=dlYUhEQ1lrUThYZVkxV0FFbTRhaFVzZ0t5Y0l1SWRKb05MTnp0Q1ZUTHF-c1pmRVFBQUFBJCQAAAAAAAAAAAEAAAAGWNfPX19fTFdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOpxn1~qcZ9fOW; MCITY=-233%3A; H_PS_PSSID=32812_1448_33049_33058_31660_32974_33099_33101_32961_32937_32846; BAIDUID_BFESS=A11CD8CAEBE6953B3DE48B25834E3723:FG=1; COOKIE_SESSION=90569_1_6_5_3_9_0_0_5_2_0_2_115047_0_2_0_1605532466_1605441903_1605532464%7C9%2373519_24_1605441895%7C9; BD_HOME=1; delPer=0; PSINO=6; H_PS_645EC=6d79q7cxuX3KuZAfFOA93yP1IGHzWpBnQLVRMo5iue6K5e7wB6l8QW3PRLQ; BA_HECTOR=052galah0h8k0k3hit1fr500c0p; sug=3; sugstore=0; ORIGIN=0; bdime=0 Host: www.baidu.com Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
1.4 HTTP响应
- 服务器–响应–客户端
百度:
Bdpagetype: 2
Bdqid: 0x965ba8ca0003aba1
Cache-Control: private // 缓存控制
Connection: keep-alive // 连接
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Mon, 16 Nov 2020 13:36:09 GMT
Expires: Mon, 16 Nov 2020 13:36:08 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=459; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=32812_1448_33049_33058_31660_32974_33099_33101_32961_32937_32846; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1605533769048945204210834438914106960801
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1
响应体
响应状态码
200:请求响应成功
3**:请求重定向
- 重定向:重新到给定的新位置
404:找不到资源
- 资源不存在
5**:服务器代码错误 500 502:网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
2. Maven
- javaweb开发中 导入jar包
- 配置jar包
2.1 Maven项目架构管理工具
Maven核心思想:约定大于配置
- 有约束,不要去违反
2.2 Maven下载安装
网上比较多教程
下载 解压 配置环境变量等等
2.3 阿里云镜像
<mirror>
<id>aliyun</id>
<name>aliyun Maven</name>
<mirrorOf>*</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
2.4 本地仓库
放在本地一个文件夹
<localRepository>F:\environment\MavenRepository\maven_jar</localRepository>
远程仓库
2.5 Maven idea项目
之后等待项目初始化下载完毕
2.6 配置tomcat
配置可参考:
https://blog.csdn.net/wahahage/article/details/106255356?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242
2.7 POM文件
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven 版本和头文件-->
<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>
<!--自己配置的GAV-->
<groupId>com.stevia</groupId>
<artifactId>tomcatAndMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>tomcatAndMaven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--外面下的jar包 项目依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建的东西-->
<build>
<finalName>tomcatAndMaven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
导入新的jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
maven由于他的约定大于配置 后面可能会遇到自己写的配置文件 无法被到处或者生效的问题 解决方案:
build后面加个resource
<build>
.......
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
......
</build>
2.8 idea目录树
3. Servlet
3.1 Servlet简介
- Servlet是sun公司开发的动态web技术
- Sun在API中提供一个接口Servlet
- 编写一个类实现Servlet接口
- 吧开发好的java类部署到web服务器中
3.2 Hello Servlet
-
编写一个maven项目,删掉里面的src目录 该空的工程即为maven的主工程
-
后面建立新的module
Maven父子工程
父项目中pom.xml会有
<modules>
<module>servlet1.0</module>
</modules>
3.3 maven环境优化
- web.xml换成最新的
- 将maven目录补充完整
3.4 编写一个Servlet接口
直接继承HttpServlet
package com.stevia.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.io.PrintWriter;
public class HelloServlet extends HttpServlet {
// 由于get或者post只是请求实现的不同方式 可以相互调用 业务逻辑一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();// 响应流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.5 编写Servlet映射
为什么需要映射:写的是java程序 但是要通过浏览器访问 而浏览器需要连接web服务器 所以需要在web服务中注册自己写的Servlet,并配置访问路径
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.stevia.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.6 配置tomcat
3.7 启动设置
4 Servlet原理
4.1 Mapping 问题
- 一个Servlet指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 一个Servlet指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.一个Servlet指定通用映射路径
即固定的前缀或后缀
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
<!-- 404 错误-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.stevia.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5. Response常见应用
5.1 Response下载
下载文件
- 获取下载文件的路径
- 下载的文件名是啥
- 设置想办法让浏览器能够支持下载的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
package com.stevia.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;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取下载文件的路径
String realPath = "F:\\java相关\\javaWeb\\ServletDemo\\response\\target\\classes\\1.png";
System.out.println("下载文件的路径"+realPath);
// 2. 下载的文件名是啥
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 3. 设置想办法让浏览器能够支持下载的东西
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
// 4. 获取下载文件的输入流
FileInputStream in=new FileInputStream(realPath);
// 5. 创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
// 6. 获取OutputStream对象
ServletOutputStream out= resp.getOutputStream();
// 7. 将FileOutputStream流写到buffer缓冲区
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
// 8. 使用OutputStream将缓冲区中的数据输出到客户端
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.2 Response验证码
package com.stevia.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.io.IOException;
import java.util.Random;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 让浏览器3秒自动刷新一次
resp.setHeader("refresh","3");
// 在内存中创建一个图片
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");
// 图片写个浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
// 生成随机数
private String makeNum(){
Random random=new Random();
String num=random.nextInt(9999999)+"";
StringBuffer sb=new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
num=sb.toString()+num;
return num;
}
}
5.3 重定向
重定向和转发的区别
相同点
- 页面都会跳转
不同点
- 请求转发的时候 URL不会产生变化
- 重定向的时候 URL会发生变化
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("进入这个请求");
// 处理请求
String username = req.getParameter("username");
String password = req.getParameter("password");
//重定向
resp.sendRedirect("/r/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6. cookie Session
ps:这一小节代码来自:https://blog.csdn.net/bell_love/article/details/105667638和https://www.cnblogs.com/xdp-gacl/p/3803033.html#Cookie
6.1 会话
会话 用户打开一个浏览器 点击了很多超链接 访问了多个web资源 关闭浏览器 该过程就是会话
有状态会话:
客户端 服务端
- 服务端给客户端一个新建 客户端喜爱访问服务端带上信件就可以了;cookie
- 服务器登记你来过了 下次你来的时候来匹配你 session
6.2 保存会话的两种技术
cookie
- 客户端技术 响应 请求
session
- 服务器技术 利用这个技术 可以保存用户会话信息 我们可以把信息或者数据放在session中
常见例子 网站登陆之后 下次自动登录
cookie和session的区别
区别 | Cookie | Session |
---|---|---|
存在 | Cookie是客户端技术,通常保存在客户端,即本地,IE浏览器把Cookie信息保存在类似于C:\windows\cookies的目录下。因为Cookie在客户端所以可以编辑伪造,不是十分安全 | Session是服务器端技术,在服务端,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务 |
存储数据 | 只能存储 String 类型的对象 | 能够存储任意的 java 对象 |
性能 | Cookie存在客户端对服务器没影响 | Session过多时会消耗服务器资源,大型网站会有专门Session服务器 |
作用域 | Cookie通过设置指定作用域只能在指定作用域有效 | Session在整个网页都有效 |
作用时间 | Cookie可以通过 setMaxAge设置有效时间,即使浏览器关闭了仍然存在 | 关闭网页Session就结束了 |
cookie实现原理
Session实现原理
package gac.xdp.cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置服务器端以UTF-8编码进行输出
response.setCharacterEncoding("UTF-8");
//设置浏览器以UTF-8编码进行接收,解决中文乱码问题
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取浏览器访问访问服务器时传递过来的cookie数组
Cookie[] cookies = request.getCookies();
//如果用户是第一次访问,那么得到的cookies将是null
if (cookies!=null) {
out.write("您上次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastAccessTime")) {
Long lastAccessTime =Long.parseLong(cookie.getValue());
Date date = new Date(lastAccessTime);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是您第一次访问本站!");
}
//用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
//将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在上面的例子中,在程序代码中并没有使用setMaxAge方法设置cookie的有效期,所以当关闭浏览器之后,cookie就失效了,要想在关闭了浏览器之后,cookie依然有效,那么在创建cookie时,就要为cookie设置一个有效期。如下所示:
//用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
//设置Cookie的有效期为1天
cookie.setMaxAge(24*60*60);
//将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
response.addCookie(cookie);
Cookie注意细节
- 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的>Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内>存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出>一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
package gac.xdp.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 删除cookie
*/
public class CookieDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个名字为lastAccessTime的cookie
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
//将cookie的有效期设置为0,命令浏览器删除该cookie
cookie.setMaxAge(0);
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
// cookie中存储中文
Cookie cookie = new Cookie("userName", URLEncoder.encode("中文", "UTF-8"));
URLEncoder.encode("","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")
session
package com.kuang.servlet;
import com.kuang.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
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",new Person("秦疆",1));
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else {
resp.getWriter().write("session以及在服务器中存在了,ID:"+sessionId);
}
//Session创建的时候做了什么事情;
// Cookie cookie = new Cookie("JSESSIONID",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//得到Session
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
7. MVC三层架构
什么是MVC: Model view Controller 模型、视图、控制器
Model
- 业务处理 :业务逻辑(Service)
- 数据持久层:CRUD (Dao - 数据持久化对象)
View
- 展示数据
- 提供链接发起Servlet请求 (a,form,img…)
Controller (Servlet)
- 接收用户的请求 :(req:请求参数、Session信息….)
- 交给业务层处理对应的代码
- 控制视图的跳转
8. Filter
Filter:过滤器 ,用来过滤网站的数据;
- 处理中文乱码
- 登录验证…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLO717CW-1606291206053)(JavaWeb.assets/20200508154536177.png)]
-
导包
-
编写
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain : 链
/*
1. 过滤中的所有代码,在过滤特定请求的时候都会执行
2. 必须要让过滤器继续同行
chain.doFilter(request,response);
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前....");
chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
System.out.println("CharacterEncodingFilter执行后....");
}
//销毁:web服务器关闭的时候,过滤器会销毁
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
- 在web.xml中配置 Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
<!-- 别偷懒写个 /* -->
</filter-mapping>
9. Listener
导入jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IzB5uf2-1606291206054)(JavaWeb.assets/2020050820562995.png)]
//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建Session就会触发一次这个事件!
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
//销毁session监听
//一旦销毁Session就会触发一次这个事件!
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
/*
Session销毁:
1. 手动销毁 getSession().invalidate();
2. 自动销毁
*/
}
<!--注册监听器-->
<listener>
<listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame("中秋节快乐"); //新建一个窗体
Panel panel = new Panel(null); //面板
frame.setLayout(null); //设置窗体的布局
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(0,0,255)); //设置背景颜色
panel.setBounds(50,50,300,300);
panel.setBackground(new Color(0,255,0)); //设置背景颜色
frame.add(panel);
frame.setVisible(true);
//监听事件,监听关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
}
});
}
}
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
response.sendRedirect("/error.jsp");
}
chain.doFilter(request,response);
10. JDBC
rame frame = new Frame(“中秋节快乐”); //新建一个窗体
Panel panel = new Panel(null); //面板
frame.setLayout(null); //设置窗体的布局
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(0,0,255)); //设置背景颜色
panel.setBounds(50,50,300,300);
panel.setBackground(new Color(0,255,0)); //设置背景颜色
frame.add(panel);
frame.setVisible(true);
//监听事件,监听关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
}
});
}
}
```java
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
response.sendRedirect("/error.jsp");
}
chain.doFilter(request,response);
10. JDBC
[外链图片转存中…(img-EMh5ADSL-1606291206055)]