1、基本概念
1.1、前言
web开发:
- web,网页的意思,www.baidu.com
- 静态web
- html,css
- 提供给所有人看的数据始终不会发生变化!
- 动态web
- 淘宝,几乎是所有的网站
- 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!
- 技术栈:Servlet/JSP,ASP,PHP
在Java中,动态web资源开发的技术统称为JavaWeb;
1.2、Web应用技术
Web应用程序:可以提供浏览器访问的程序;
- a.html、b.html…多个web资源,这些web资源可以被外界访问,,对外界提供服务;
- 你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
- URL
- 这个同一的web资源会被放在同一个文件夹下,web应用程序–>Tomcat:服务器
- 一个web应用由多部分组成(静态web,动态web)
- html,css,js
- jsp,servlet
- Java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来同一管理;
1.3、静态web
-
*.html,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。通络;
he
-
静态web存在的缺点
- Web页面无法动态更新,所有用户看到都是同一个页面
- 轮播图,点击特效:伪动态
- JavaScript[实际开发中,它用的最多]
- VBScript
- 它无法和数据库交互|(数据无法持久化,用户无法交互)
- Web页面无法动态更新,所有用户看到都是同一个页面
1.4、动态web
页面会动态展示:“Web的页面展示的效果因人而异”;
缺点:
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
- 停机维护
优点:
-
Web页面可以动态更新,所有用户看到都不是同一个页面
-
它可以于数据库交互
图3.。。。。。。。。。。。。。。。
2、web服务器
2.1、技术讲解
ASP:
-
微软:国内最早流行的就是ASP;
-
在HTML中嵌入了VB的脚本,ASP+COM;
-
在ASP开发中,基本一个页面都有几千行的业务代码,页面极其换乱。
-
维护成本高!!!
-
IIS
<h1> <h1> <h1> </h1> </h1> <h1> <h1> <% System.out.println("Hello,Word!!!") %> </h1> </h1> <h1> <h1> </h1> </h1> </h1>
PHP:
- PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,WP)
- 无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览和服务器
C/S:客户端和服务器
- sun公司主推的B/S的架构
- 基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)
- 可以承载三高(高并发,高可用,高性能)问题带来的影响;
- 语法像ASP,ASP–>JSP,加强市场强度。
2.2、web服务器
服务器是一种别动操作,用来处理用户的一些请求和给用户一些响应信息。
IIS
微软的;ASP…Windows中自带的
Tomcat
面向百度编程
Tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,它是最佳的选择。
Tomcat实际上运行JSP页面和Servlet,目前Tomcat最新版本为10.0.5。
工作3-5年,尝试手写Tomcat服务器
3、Tomcat
3.1、下载 or 安装
下载
安装
解压下载的安装目录
3.2、Tomcat启动和配置
目录介绍
启动与关闭Tomcat
测试访问:http://localhost:8080/
效果如图:
可能遇到的问题:
- Java环境变量没有配置(会闪退)
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
启动失败:一闪就消失(闪退)
原因:Java没有配置环境变量
解决方法:重新配置环境变量。参考博文:https://blog.csdn.net/qq904069486/article/details/80909780
3.3、配置
可以配置启动的端口号
-
tomcat的默认端口号为:8080
-
mysql:3306
-
http:80
-
https:443
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPor
可以配置主机的名称
-
默认的主机名为:localhost->127.0.0.1
-
默认网站应用存放的位置为:webapps
<Host name="www.qingjiang12.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
-
高难度面试题:
请你谈谈网站是如何进行访问的!
1、输入一个域名:回车
2、检查本机的C:\Windows\System32\drivers\etc
配置文件下有没有这个域名映射;
-
有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1 www.qingjiang12.com
-
没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;
图。。。。。。。
3、可以配置一下环境变量(可选性)
3.4、发布一个web网站
不会就先模仿
-
将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webbapps)下,就可以访问了网站应该有的结构
--webapps:Tomcat服务器的web目录 -ROOT -kuangstudy:网站的目录名 - WEB-INF -classes:java程序 -lib:web应用所依赖的jar包 -web.xml:网站配置文件 - index.html 默认的首页 - static -css -style.css -js -img -......
4、Http
4.1、什么是HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html,字符串,~…
- 超文本:图片,音乐,视频,定位,地图…
- 端口:80
Https:安全的
- 端口:443
4.2、两个时代
- http1.0
- HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接
- http2.0
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
4.3、Http请求
-
客户端—发请求(Request)—服务器
百度:
Request URL: https://www.baidu.com/ 请求地址 Request Method: GET get方法/post方法 Status Code: 200 OK 状体码:200 Remote(远程) Address: 14.215.177.38:443
1、请求行
- 请求行中的请求方式:GET
- 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT…
- get:请求能够携带的参数较少,大小由限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数木有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
2、消息头
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
Host: 主机.../...
4.4、Http响应
-
服务器—响应—客户端
百度:
Cache-Control: private 缓存控制 Connection: keep-alive 连接 Content-Encoding: gzip 编码 Content-Type: text/html;charset=utf-8 类型
1、响应体
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
Host: 主机.../...
Refresh: 告诉客户端,多久刷新一次;
Location: 让网页重新定义
2、响应状态码
200:请求相应成功
3xx:请求重新定向
- 重定向:你重新到我给你的新位置去;
4xx:找不到资源 404
- 资源不存在:
5xx:服务器代码错误 500 502:网关错误
???常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
5、Maven
我们为什么要学习这个技术?
-
在JavaWeb开发中,需要使用大量的jar包,我们手动去导入;
-
如何能够让一个东西自动帮我导入和配置这jar包。
由此,Maven诞生了!
5.1、Maven项目架构管理工具
我们目前用来就是方便导入jar包的!
Maven的核心思想:约定大于配置
- 有约束,不要去违反
Maven会规定好你该如如何去编写我们的Java代码,必须要按照这个规范来;
5.2、下载安装Maven
官网:Maven – Welcome to Apache Maven
下载完成后,解压即可;
建议:电脑上的所有环境都放在一个文件夹下,方便管理;
5.3、配置环境变量
在我们的系统环境变量中
配置如下配置:
-
M2_HOME maven目录下的bin目录
-
MACEN_HOME maven的目录
-
在系统的path中配置%MACEN_HOME%\bin
测试Maven是否安装成功,保证必须配置完毕!
5.4、阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
</mirror>
</mirrors>
5.5、本地仓库
在本地的仓库,远程仓库;
建立一个本地仓库:localRepository
<localRepository>E:\apache-maven-3.8.1\maven-repo</localRepository>
5.6、在IDEA中使用Maven
-
启动IDEA
-
创建一个Maven项目
加载失败:hotos文件里添加127.0.0.1 localhost
-
等待项目初始化完毕
-
观察maven创库多了什么东西!!!
-
IDEA中的Maven设置
IDEA项目创建成功后,看一眼Maven的配置!
-
到这里,Maven在IDEA中的配置和使用就OK了!
5.7、创建一个普通的Maven项目
在这个只有Web应用下才会有!
5.8、标记文件夹功能
5.9、在IDEA中配置Tomcat
解决警告问题
必须要的配置:为什么会有这个问题:我们访问一个网站,需要指定一个文件夹名字;
测试:
5.10、pom文件
pom.xml是Maven的核心配置文件
5.11、IDEA操作
5.12、解决遇到的问题
-
Maven3.6.2
解决方法:降级3.6.1
Unable to import maven project:See logs for details
-
Tomcat闪退
-
IDEA中每次都要重复配置Maven
在IDEA中的全局默认配置中去配置
-
Maven项目中Tomcat无法配置
-
maven默认web项目中的web.xml版本问题
-
替换为webapp4.0版本和tomcat一致
-
Maven仓库的使用
地址:https://mvnrepository.com/
6、Servlet
6.1、Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中。
把实现了Servlet接口的Java程序叫做,Servlet
6.2、HellooServlet
Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericSerrvlet
-
构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Moudel;这个空工程就是Maven主工程
-
关于Maven父子工程的理解:
父项目中会有
<modules> <module>servlet-01</module> <module>servlet-01</module> </modules>
子项目会有
父项目中的java子项目可以直接使用
son extends father
-
Maven环境优化
- 修改web.xml为最新的
- 将Maven的结构搭建完整
-
编写一个Servlet程序
-
编写一个普通类
-
实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet { //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); //响应流 writer.print("Hellw,Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
-
编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
<!-- 注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.cen.servlet.HelloServlet</servlet-class> </servlet> <!-- Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
6.4、Mapping问题
-
一个Servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet可以指定多个映射路径
<!-- 注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.cen.servlet.HelloServlet</servlet-class> </servlet> <!-- Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</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>/*</url-pattern> </servlet-mapping>
-
指定一些后缀或者前缀等等…
<!--可以自定义后缀实现请求映射 注意点,*前面不能加项目映射的路径 hello/sajdsfdsfsdf.qinjiang --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.qinjiang</url-pattern> </servlet-mapping>
-
优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.cen.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
6.5、ServletContext
web容器再启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
1、共享数据
我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;
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 context = this.getServletContext();
String username = "秦将"; //数据
context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为:username,值为username
}
}
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 {
doPost(req, resp);
}
}
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.cen.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.cen.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
测试访问结果;
2、获取初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>hello</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
3、请求转发
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
// RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发请求路径
// requestDispatcher.forward(req,resp); //调用forward实现请求转发
context.getRequestDispatcher("/gp").forward(req,resp);
}
4、读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建一个properties
发现:都被打包到了一个路径下:classes,我们俗称这个路径为classpath;
思路:需要一个文件流
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher is = this.getServletContext().getRequestDispatcher("/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);
}
6.6、HttpServletResponse
web服务器接收到客户的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletServletResponse;
- 如果要获取客户端请求过来的参数,找HttpServletRequest;
- 如果要给客户端响应一些信息,找HttpServletResponse;
1、简单分类
负责向浏览器发送数据的方法
servletOutputStream getOutputStream() throws IOException;
Printwriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
2、常见应用
- 向浏览器输出消息
- 下载文件
- 要获取下载文件的路径
- 下载的文件名是啥?
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffter缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
3、验证码功能
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("Content-Disposition","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成随机数
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();
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>filedown</servlet-name>
<servlet-class>com.cen.servlet.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>filedown</servlet-name>
<url-pattern>/down</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.cen.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/Img</url-pattern>
</servlet-mapping>
4、实现重定向
一个web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程叫做重定向
常见场景:
- 用户登录
测试:
public class RedirecctServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setHerder("Location","/r/img")
resp.setStatus(302)
*/
resp.sendRedirect("/r/img");
}
-
面试题:请你聊聊重定向和转发的区别?
相同点:
- 页面都会实现跳转
不同点:
- 请求转发的时候,url不会产生变化:307
- 重定向时候,url地址栏会发生变化:302
Tomcat10.0.5版本servlet依赖包名不是javax.servlet.,而是jakarta.servlet.
6.7、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest获得客户端的所有信息
获取参数、请求转发
@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[] hobbys = req.getParameterValues("hobbys");
System.out.println("============================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
System.out.println("============================");
System.out.println(req.getContextPath());
//通过请求转发
//这里的/代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
7、Cookie、Session
7.1、会话
**会话:**用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为有状态会话
**有状态会话:**一个同学来过教室,下次再来教室,我们会知道这个同学,曾今来过,称之为有状态会话
一个网站,怎么证明你来过?
- 服务器给客户端一个信件,客户端下次访问服务器端带上信件就可以了;Cookie
- 服务器登记你过来了,下次你来的时候我来匹配你;seesion
7.2、保存会话的两种技术
Cookie
- 客户端技术(响应,请求)
Session
- 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!
常见问题:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!
7.3、Cookie
-
从请求中拿到cookie信息
-
服务器响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得Cookie cookies.getName(); //获得cookie中的key cookies.getValue(); //获得cookie中的value值 new Cookie("lastLoginTime",System.currentTimeMillis() + ""); //新建一个cookie cookies.setMaxAge(24*60*60); //设置cookie的有效期 resp.addCookie(cookies); //响应给客户端一个cookie
cookie:一般会保存再本地的用户目录下appdata
一个网站cookie是否存在上限!聊聊细节问题
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- Cookie大小有限制4kb;;
- 300个cookie浏览器上限
删除Cookie:
-
不设置有效期,关闭浏览器,自动失效
-
设置有效时间为0
//创建一个cookie,名字必须要和要删除的名字一致 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //将cookie有效期设置为0,立马过期 cookie.setMaxAge(0); resp.addCookie(cookie);
编码问题:
//编码
URLEncoder.encode("秦将","utf-8")
//解码
URLDecoder.decode(cookie.getValue(),"utf-8")
7.4、Session
什么是Session
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–>保存用户的信息;保存购物车的信息…
Session和Cookie的区别
- Cookie是把 用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务器创建
使用场景:
- 保存一个登录用户信息;
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
使用Session:
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","哈哈");
//获取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:
//得到Session
HttpSession session = req.getSession();
Person name = (Person) session.getAttribute("name");
System.out.println(name.toString());
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
会话自动过期:web.xml配置(这也是注销Seesion的一种方法)
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失败,以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>
8、JSP
8.1、什么是JSP
Java Server Pages:Java服务器端页面也和Servlet一样,用于动态web技术!
最大的特点:
- 写JSP就像在写HTML
- JSP和HTML的区别:
- HTML只给用户提供静态的数据
8.2、JSP原理
思路:JSP到底怎么执行的!
-
代码层面没有任何问题
-
服务器内部工作
Tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA的Tomcat中产生一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换成一个java类
JSP本质上就是一个Servlet
//初始化
public void _jspInit(){
}
//销毁
public void _jspDestroy(){
}
//JSPServi
public void _jspService(HttpServletRequest request, HttpServletResponse response){
}
-
判断请求
-
内置一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文 javax.servlet.http.HttpSession session = null; //session final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWiter out = null; //out final java.lang.Object page = this; //page:当前 HttpServletRequest request; //请求 HttpServletResponse response; //响应
-
输出页面增加代码量
在JSP页面中:
只要是Java代码就会原封不动的输出;
如果是HTML代码,就会被转换为:
out.write("<html>\r\n");
这样的格式,输出到前端!
8.3、JSP基础语法
任何语言都有自己的语法,Java中有,JSP作为Java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!
JSP表达式
<%--JSP表达式
作用,用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
Jsp脚本片段
脚本片段的在实现
JSP声明
8.4、JSP指令
8.5、9大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application【SerlvetContext】存东西
- config【SerlvetConfig】
- out
- page
- exception
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没有用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据!
8.6、JSP标签、JSTL标签、EL表达式
<!-- JSTL表达式的依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${ }
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<%--jsp:include--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuang"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
JSTL表达式
JSTL标签库的使用就是为了弥补HTMl标签的不足,它自定义许多标签,可以供我们使用,标签的功能和java代码一样!
格式化标签
SQL标签
XML标签
核心标签(掌握部分)
-
在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
c:choose
c:forEach
9、JavaBean
实体类
JavaBean有特定的写法
- 必须有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
易班用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表—>类
- 字段—>属性
- 行记录—>对象
class People{
private int id;
private String name;
private int name;
private String address;
}
class A{
new People(1,"哈哈1号",3,"北京")
new People(2,"哈哈2号",3,"北京")
new People(3,"哈哈3号",3,"北京")
}
- 过滤器
- 文件上传
- 邮件发送
- JDBC复习:如何使用JDBC,JDBC crud,JDBC 事务
10、MVC三层架构
什么是MVC:Moderl View Controller 模型 视图 控制器
10.1、早些年
图。。。
用户直接访问控制层,控制层就可以直接操作数据库;
servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护
Servlet的代码中,处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的!
程序员调用
|
JDBC
|
Mysql ORacle SqlServer
10.2、MVC三层架构
图。。。
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 数据展示
- 提供链接发起Servlet请求(a,form,img…)
Controller(Servlet)
-
接收用户的请求(req:请求参数,Session信息…)
-
交给业务层处理对应的代码
-
控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确,事务)--->Dao层查询用户名和密码是否正确--->数据库
11、Filter
Filter:过滤器,用来过滤网站的数据;
-
处理中文乱码
-
登录验证
图。。。
-
导包
-
编写过滤器
-
导包不要导错
图。。。
-
实现Filter接口,重写对应的方法即可
-
在web.xml配置中配置Filter
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.cen.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--只要是/servlet的任何请求,会经过这个过滤器--> <url-pattern>/servlet/*</url-pattern> <!--<url-pattern>/*</url-pattern>--> </filter-mapping>
-
12、监听器
-
web.xml中注册监听器
<!--注册监听器--> <listener> <listenser-class>com.cen.listener.OnlineCountListener</listenser-class> </listener>
-
看情况是否使用!
13、过滤器、监听器常见应用
监听器:GUI编程中经常使用
用户登录之后才能进入主页!用户注销后就不能进入主页了!
-
用户登录只有,向Session中放入用户的数据
-
进入主页的时候要判断是否已经登录;要求:在过滤器中实现!
HttpServletRequest reqest = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; if(request.getSessio().getAttribute(Constant.USER_SESSION)==null){ response.sendRedirect("/error.jsp"); } chain.doFilter(request.response);
111、tomcat查错
错误查询:(转载:https://www.freesion.com/article/5883880231/)
在项目的WEB-INF下的classes(没有就动手写一个)建立一个log输出文件logging.properties书写以下内容:
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = error-debug.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
重新启动服务器,就可以在看到输出的报错详细信息。
l-pattern>
```
12、监听器
-
web.xml中注册监听器
<!--注册监听器--> <listener> <listenser-class>com.cen.listener.OnlineCountListener</listenser-class> </listener>
-
看情况是否使用!
13、过滤器、监听器常见应用
监听器:GUI编程中经常使用
用户登录之后才能进入主页!用户注销后就不能进入主页了!
-
用户登录只有,向Session中放入用户的数据
-
进入主页的时候要判断是否已经登录;要求:在过滤器中实现!
HttpServletRequest reqest = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; if(request.getSessio().getAttribute(Constant.USER_SESSION)==null){ response.sendRedirect("/error.jsp"); } chain.doFilter(request.response);
111、tomcat查错
错误查询:(转载:https://www.freesion.com/article/5883880231/)
在项目的WEB-INF下的classes(没有就动手写一个)建立一个log输出文件logging.properties书写以下内容:
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = error-debug.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
重新启动服务器,就可以在看到输出的报错详细信息。