1.2、web应用程序
web应用程序:可以提供浏览器访问的程序
eg:a.html,b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务
我们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
URL
这个统一的web资源会被放在同一个文件夹下,web应用程序—>Tomcat:服务器
一个web应用服务器由多个部分组成(静态web,动态web)
html,css,js
jsp,servlet
java应用程序
jar包
配置文件
web应用程序编写完毕后,若想提供给外界访问:
1.3、静态web
.html,.htm这些都是网页的后缀,如果服务器上一直存在这些东西,我们就直接进行读取。
静态web存在的缺点
web页面无法动态更新,所有的用户看到的是同一个页面
轮播图,点击特效,伪动态
JavaScript实际开发中,它用的最多
VBScript
它无法和数据库进行交互(数据无法持久化,用户无法交互)
1.4、动态Web
缺点:
加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布
优点:
web页面可以动态更新,所有的用户都不是同一个页面
它可以与数据库进行交互(数据持久化:注册、商品信息、用户信息)
2、web服务器
2.1、技术讲解
ASP:
微软:国内最早流行的ASP
在html中嵌入VB的脚本,ASP+COM
在ASP开发中,基本一个页面
维护成本高
C#
PHP:
PHP开发速度很快,功能很强大,跨平台,代码很简单
无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览器和服务器
C/S:客户端和服务器
sun公司主推的B/S架构
基于java语言的(所有的大公司,或者一些开源的组件,都是用java写的)
可以承载三高带来的影响
语法像ASP, ASP---->JSP,加强市场强度
2.2、web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
3、Tomcat
应用服务器==
面向百度编程
高难度面试题:
请你谈谈网站是如何进行访问的
1、输入一个域名;回车
2、检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射
4、Http
4.1、什么是HTTP
HTTP是一个简单的请求响应协议,通常运行在TCP之上
- 80
Https:安全的 - 443
4.2、两个时代
- http1.0:
HTTP/1.0:客户端可以与web服务器连接后,只获得一个web资源 - http2.0
HTTP/1.1:客户端可以与web服务器连接后,可以获取多个web资源
4.3、Http请求
客户端发送请求(request)
1、请求行
请求行中的请求方式:GET
请求方式:GET、POST、HEAD、PUT、DELETE
2、消息头
4.4、Http响应
服务端–响应–客户端
1、响应体
2、响应状态码
200:请求响应成功
3xx:请求重定向
4xx:找不到资源
404资源不存在
5xx:服务器代码错误
502网关错误
常见面试题:
当你的浏览器中地址栏输入地址栏并回车的一瞬间到页面能够展示出来,经历了什么?
5、Maven
1、在JavaWeb开发中,需要使用大量的jar包,我们手动导入
2、如何能够让一个东西自动帮我们导入和配置这个jar包。
5.1、Maven项目架构管理工具
Maven核心思想:约定大于配置
6、Servlet
6.1、Servlet简介
servlet是Sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫做:Servlet
6.2、HelloServlet
6.3、servlet原理
6.4、mapping问题
1.优先级问题:指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kiki.servlet.HelloServlet</servlet-class>
</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.kiki.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
6.5、ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
- 共享数据:我在这个Servlet中
6.6HttpServletResponse
web服务器接收客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse
- 如果要获取客户端请求过来的参数,就找HttpServletRequest
- 如果要获取客户端响应的一些信息:找HttpServletResponse
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
2、常见应用
(1)向浏览器输出消息
(2)下载文件
1.要获取下载文件的路径
2.下载文件名是什么?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端
文件下载案例:
package com.kiki.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;
/**
* @author kiki
* @version 1.0
* @create 2020/8/14 21:18
*/
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.要获取下载文件的路径
//E:\kikistuday\es-study\javaweb\response\src\main\resources\2.png
//String realPath = this.getServletContext().getRealPath("/2.png");// /代表当前web中找2.png
String realPath ="E:\\kikistuday\\es-study\\javaweb\\response\\src\\main\\resources\\2.png";
System.out.println("下载文件的路径:" + realPath);
//2.下载文件名是什么?
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);// +1代表截取 /的下一个位置
//3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8"));
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6.获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();
//7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
while ((len=in.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
//8.关闭流
in.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3、验证码功能
验证怎么来的?
- 前端实现
- 后端实现,需要用到java的图片类
package com.kiki.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;
/**
* @author kiki
* @version 1.0
* @create 2020/8/14 22:13
*/
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器5秒自动刷新一次
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(makeName(),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());
}
//创建随机数
private String makeName(){
Random random = new Random();
String num = random.nextInt(9999999) + "";
System.out.println(num);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
//如果产生的随机数有0,保证生成的随机数一定是7位,如果不足这里用0填充
sb.append("0");
}
num= sb.toString() + num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4、实现重定向
一个web资源收到客户端请求后,它会通知客户端去访问另外一个web资源,这个过程叫做重定向
常见场景:
- 用户登录
void sendRedirect(String var1) throws IOException;
重定向代码
package com.kiki.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author kiki
* @version 1.0
* @create 2020/8/14 23:10
*/
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/** 重定向原理
* resp.setHeader("Location","/r/img");
* resp.setStatus(HttpServletResponse.SC_FOUND);//302
*/
//重定向一个页面
// resp.setHeader("Location","/r/img");
// resp.setStatus(HttpServletResponse.SC_FOUND);//302
resp.sendRedirect("/r/img");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
面试题:请你聊聊重定向和转发的区别?
相同点:
- 页面都会实现跳转
不同点:
- 请求转发 的时候,url不会产生变化 307
- 重定向的时候,url地址栏会发生变化 302
6.7、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,
HTTP请求中所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,可以获得客户端的所有信息
1、获取前端请求的参数
2、请求转发
package com.kiki.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;
/**
* @author kiki
* @version 1.0
* @create 2020/8/15 8:25
*/
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
resp.setCharacterEncoding("utf-8");
System.out.println(req.getContextPath());
//通过请求转发,这里的斜杠代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7、Cookie、Session
7.1、会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:cookie
2.服务器登记你来过了,下次你来的时候我来匹配你:session
7.2、保存会话的两种技术
cookie:
- 客户端技术(响应,请求)
session:
- 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在session中!
7.3、Cookie
1、从请求中拿到cookie信息
2、服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得Cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的值
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie()//响应给客户端一个cookie
cookie一般保存在本地的用户目录下appdata
一个网站的cookie是否会存在上限?
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- Cookie大小有限制4kb
- 300个cookie浏览器上限
删除Cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
7.4、Session(重点)
什么是session:
- 服务器给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
- 用户登录之后,整个网站它都可以访问—>保存购物车的信息
Session和Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session 把用户的数据写到用户独占Session中,服务端保存(保存重要的信息),减少服务器资源的浪费
- Session对象由服务创建
使用场景:
- 保存一个登录用户的x信息
- 购物车信息
- 在整个网站中经常被使用到的数据,我们将它保存到Session中
会话自动过期:web.xml中配置
package com.kiki.servlet;
import com.kiki.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author kiki
* @version 1.0
* @create 2020/8/17 21:14
*/
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("喜洋洋",18));
//获取Session的Id
String sessionId = session.getId();
System.out.println(session.getId());
//判断session是不是新创建的
if (session.isNew()){
resp.getWriter().write("Session Create Success,ID=" + session.getId());
}else {
resp.getWriter().write("Session is exist in Server,ID=" + session.getId());
}
//Session创建的时候做了什么?
// Cookie cookie = new Cookie("JSESSIONID", sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kiki.servlet;
import com.kiki.pojo.Person;
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;
/**
* @author kiki
* @version 1.0
* @create 2020/8/17 21:28
*/
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kiki.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;
/**
* @author kiki
* @version 1.0
* @create 2020/8/17 21:46
*/
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//注销(和关闭浏览器效果一样),sessionId消失,生成新的
//手动注销
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>CookieDemo01</servlet-name>
<servlet-class>com.kiki.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo01</servlet-name>
<url-pattern>/c1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CookieDemo02</servlet-name>
<servlet-class>com.kiki.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo02</servlet-name>
<url-pattern>/c2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CookieDemo03</servlet-name>
<servlet-class>com.kiki.servlet.CookieDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo03</servlet-name>
<url-pattern>/c3</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionDemo01</servlet-name>
<servlet-class>com.kiki.servlet.SessionDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo01</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionDemo02</servlet-name>
<servlet-class>com.kiki.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo02</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效 -->
<session-timeout>15</session-timeout>
</session-config>
</web-app>
8、JSP
8.1、什么是JSP?
Java Server Page
最大特点:
- 写JSP就像是在写HTML
区别:
- HTML只给用户提供静态数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据
8.2、JSP原理
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servelt
JSP最终也会被转换成为一个java类,本质就是一个Servlet
在JSP页面中,只要是java代码,就会原封不动的输出
如果的HTML代码,就会被转换为:
out.write("<html>\r\n");
这样的格式,输出到前端!
8.3、JSP基础语法及其指令
Java所有的语法都支持
JSP表达式<%= %>
JSP脚本片段<% %>
JSP声明<%! %>
jsp声明会被编译到JSP生成的java类中!其他的就会被生成到_jspService方法中!
JSP的注释不会在客户端显示,而HTML的注释会在客户端显示
JSP指令
注意:
<%--
@include会将两个页面合在一起
--%>
<%@include file="common/header.jsp"/>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"/>
<%--
jsp:include 拼接页面,本质还是三个
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
8.5、9大内置对象
- pageContext 存东西
- Request
- Response
- Session
- Application【ServerContext】存东西
- config【ServerConfig】
- out
- page
- exception
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("name1","喜洋洋1");//保存的数据只在一个页面中有效
request.setAttribute("name2","喜洋洋2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","喜洋洋3");//保存的数据在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","喜洋洋4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
%>
<%--
脚本片段中的代码会被原封不动的生成到.jsp .java
注意:这里边的代码,必须保证java语法的正确性
--%>
<%
//从pageContext,我们通过寻找的方法
//从底层到高层(作用域)
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<hr>
<h1>取出的值为</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>
</html>
8.6、JSP标签、JSTL标签、EL表达式
<!--jstl表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义许多标签,可以供我们使用,标签的功能和Java 代码一样
9、JavaBean
实体类
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般跟数据库的字段做映射 ORM(对象关系映射)
- 表—>类
- 字段–>属性
- 行记录–>对象
10、MVC三层架
什么是MVC:Model view Controller 模型、视图、控制器
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 展示数据
- 提供链接发起Servlet请求(a,from,img)
Controller(Servlet)
- 接收用户的请求:(req:请求参数,Session信息…)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录—>接收用户的登录请求---->处理用户的请求(获取用户登录的参数,username,password)—>给业务层处理登录业务(判断用户名密码是否正确:事务)---->Dao层查询用户名和密码是否正确—>数据库
11、Filter
Filter:过滤器
package com.kiki.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @author kiki
* @create 2020/8/19 21:47
*/
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("[debug]==>CharacterEncodingFilter初始化");
}
/**
*
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
* 1.过滤中的所有的代码,在过滤特定请求的时候都会执行
* 2.必须要让过滤器继续通行 chain.doFilter(request,response);
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
System.out.println("CharacterEncodingFilter执行前......");
chain.doFilter(request,response);//让我们的请求继续走,如果不放行,程序在此处被拦截
System.out.println("CharacterEncodingFilter执行后......");
}
//销毁
@Override
public void destroy() {
System.out.println("[debug]==>CharacterEncodingFilter销毁");
}
}
package com.kiki.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author kiki
* @create 2020/8/19 21:49
*/
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好啊,世界");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.kiki.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kiki.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--过滤/servlet/* 下所有的请求-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
12、监听器
实现一个监听器的接口
package com.kiki.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author kiki
* @create 2020/8/19 22:11
*/
public class OnlineCountListener implements HttpSessionListener {
//创建session监听,看你的一举一动
//一旦创建一个session就会触发一次事件
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
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就会触发一次事件
@Override
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.手动销毁
* 2.自动销毁
*/
}
<!--注册监听器-->
<listener>
<listener-class>com.kiki.listener.OnlineCountListener</listener-class>
</listener>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人在线</h1>
</body>
</html>
13、过滤器、监听器的常见应用
package com.kiki.listener;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* @author kiki
* @create 2020/8/19 22:41
*/
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,255,255));//设置背景元素
panel.setBounds(50,50,300,300);
panel.setBackground(new Color(0,255,0));
frame.add(panel);
frame.setVisible(true);
//监听关闭窗体事件
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
System.out.println("打开");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("关闭ing");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("关闭end");
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("打开");
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("激活");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("未激活");
}
});
}
}
用户登录之后才能进入主页!用户注销后就不能进入主页了
14、JDBC
package com.kiki.test;
import java.sql.*;
/**
* @author kiki
* @create 2020/8/20 8:31
*/
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.配置信息,解决中文乱码
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
String username = "root";
String password = "123456";
//2.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.连接数据库
Connection connection = DriverManager.getConnection(url, username, password);
//4.向数据库发送SQL的对象
Statement statement = connection.createStatement();
//5.编写SQL
String sql = "select * from users";
//6.执行查询sql
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("name="+resultSet.getObject("name"));
System.out.println("password="+resultSet.getObject("password"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birthday="+resultSet.getObject("birthday"));
}
//7.关闭连接
resultSet.close();
statement.close();
connection.close();
}
}
事务
要么都成功,要么都失败!
ACID原则:保证数据的安全