JavaWeb
1、基本概念
基本概念
web开发:
- web,网页的意思
- 静态web
- html,css
- 提供给所有人看的数据始终不会发生变化!
- 动态web
- 淘宝,几乎所有的网站都是动态
- 提供给所有人看的数据始终会发生变化,每个人在不同时间看到的不相同!
- 技术栈:Servlet/JSP,ASP,PHP
在java中,动态web资源开发的技术统称为javaweb
web应用程序
web应用程序:可以提供浏览器你访问的程序
2、web服务器
2.1、技术讲解
ASP:
- 微软:国内最早流行的就是ASP;
- 在HTML中嵌入了VB的脚本,ASP + COM;
- 在ASP 开发中,基本一个页面都有几千行的业务代码,页面极其混乱
- 维护成本高!
- C#
- IIS
<h1>
<%
System.out.println("hello")
%>
<h1>
php:
- php开发速度很快,功能很强大,跨平台,代码很简单
- 无法承载大访问量的情况
JSP/Servlet:
- sun公司主推的 B/S 架构
- 基于Java语言的
- 可以承载三高问题带来的影响,高并发,高可用,高性能
- 语法想ASP
......
2.2、web服务器
静态服务:主要提供静态资源,不同用户访问到的资源相同
动态服务:提供动态服务,不同用户访问到的资源不同
服务器的几个叫法:
web服务器:广义上来说,就是响应用户的需求,提供服务,当下所有的服务器软件都可以称之为web服务器软件
HTTP服务器(静态服务):使用HTTP协议传输资源,提供服务
应用服务器(动态服务):一个特定应用的承载容器
常见的轻量级服务器软件:
1、Nginx:典型的静态服务器,可做反向代理、负载均衡,一般放在最前面直面用户,和后端Tomcat打配合;纯C写的,性能贼高、内存消耗极少、稳定性也相当好,互联网公司重度使用
2、Tengine:阿里出品,基于Nginx服务器做的改造(加强和封装),对大流量场景做了很多高级功能,性能、稳定性优秀
3、Apache http server:也是静态服务器,但是不如Nginx
3、IIS:微软开发,只能用在Windows下,具有应用服务器能力的http服务器
4、Tomcat:Apache出品,典型的应用服务器软件,符合Servlet标准的应用容器,也可以提供http服务,但一般不会作为http服务器;是Spring Boot框架默认的内置服务器
5、Jetty:跟Tomcat是一个性质的东西,比Tomcat更加轻量一些,符合Servlet标准的应用容器,也是Spring Boot框架支持的服务器,但不是默认的
6、Undertow:红帽子出品,跟Tomcat、Jetty一样也是Spring Boot框架支持的服务器,但不是默认的;高并发时性能优于Tomcat、Jetty
几款商用重量级的服务器软件:
1、JBoss(从8版开始更名为 WildFly):不仅是Servlet应用容器,更是EJB的应用容器,整套JavaEE框架部署的解决方案(EJB时代。)
2、WebLogic:Oracle公司出品,用于部署企业级JavaEE应用,全能型,几乎支持JavaEE所有的应用规范
3、WebSphere:IBM公司出品,支持更多JavaEE的应用规范的综合应用服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;
Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0.37。
... ...
工作 3-5 年之后,可以尝试手写 Tomcat 服务器;
下载tamcat:
- 安装 or 解压
- 了解配置文件及目录结构
- 这个东西的作用
3、Tomcat服务器
3.1、安装Tomcat
3.2、tomcat启动、配置
启动:startup.bat
停止:shutdown.bat
配置
HTTP协议:面试
Maven:构建工具
- Maven安装包
Servlet入门
- HelloWorld
- Servlet配置
- 原理
3-1、JBoss服务器
安装JBoss
启动、配置
4、Http
4.1、什么是HTTP
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
Status Code: 200 OK
Remote Address: 36.152.44.95:443
Referrer Policy: unsafe-url
1、请求行
- 请求行中的请求方式:GET
- 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT。。。。
- get:请求参数比较少,大小有限制,显式显示,不安全,高效
- post:参数没有限制,大小无显式,不会显示数据内容,安全,但不高效
2、消息头
- Request Headers
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie:
Host: www.baidu.com
Referer: https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=02003390_25_hao_pg&wd=tomcat%20startup%20%E4%B9%B1%E7%A0%81&oq=cmd%2520%25E4%25B8%258D%25E6%2598%25BE%25E7%25A4%25BA%25E4%25B8%25AD%25E6%2596%2587&rsv_pq=da753c370000a01e&rsv_t=6835bLC9zbaSP%2BcVCGxnVa57qua6qwwc1g8cuGpq2YJDd9Wd%2FO1hwrn%2B8hR4Qlg6%2B%2BtzES5vNmjv&rqlang=cn&rsv_enter=1&rsv_dl=ts_9&rsv_sug3=16&rsv_sug1=15&rsv_sug7=100&rsv_sug2=1&rsv_btype=t&prefixsug=tomcat%2520startup%2520&rsp=9&inputT=8763&rsv_sug4=8764
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
4.4、http响应
- 服务器 -> 响应(request) -> 客户端
- Response Headers
Bdpagetype: 2
Bdqid: 0xc2c3c159000033c1
Cache-Control: private //缓存控制
Connection: keep-alive //连接
Content-Encoding: gzip //编码
Content-Type: text/html;charset=utf-8 //类型
Date: Wed, 14 Oct 2020 12:51:11 GMT
Expires: Wed, 14 Oct 2020 12:51:10 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=134; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=32617_1433_32844_7566_31253_32723_32230_7516_7605_32116; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1602679871073634970614034273451812860865
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1
1、响应体
Accept:
Accept-Encoding:
Accept-Language:
Cache-Control:
Connection:
HOST:
Refresh: //多久就刷新一次
Location:
2、响应状态码
200:成功
3xx:请求重定向
4xx:找不到资源
- 404:找不到资源
5xx:服务器代码错误
- 500:
- 502:网关错误
5、Maven
为什么学习这个?
- 在 javaweb 开发中,需要使用大量的 jar 包,我们手动去导入
- 如何能够让一个东西自动帮我们导入和配置这个 jar 包
5.1、Maven项目架构管理工具
5.2、下载安装Maven
去官网
5.3、配置环境变量
- M2_MAVEN maven目录下的bin目录
- MAVEN_HOME maven的目录
- 在系统path中配置 %MAVEN_HOME%in
启动测试
mvn -version
5.4、阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
配置
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
哪个能用用哪里吧
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
5.5、本地仓库
配置
<localRepository>E:Environmentapache-maven-3.6.3maven-repo</localRepository>
5.6、在IDEA中配置Maven
- 启动idea
- 创建一个maven项目
4.观察 maven 仓库中多了什么东西
6.到这里,maven在idea中的配置和使用就OK了
5.7、创建一个普通的maven项目
不勾选 maven 模板
这是一个干净的项目
这是只有在 maven web 模板下的项目
5.8、 标记文件夹功能
方法一:
方法二:
5.9、idea配置tomcat
太难了,自己摸索。。。
tomcat乱码
添加:
-Dfile.encoding=UTF-8
sout乱码
VM options 设置为 -Dfile.encoding=UTF-8 ,重启tomcat
5.10 、pom文件
pom.xml是 Maven的核心文件
https://blog.csdn.net/qq_33363618/article/details/79438044
5.11、IDEA操作问题
5.12、解决遇到的问题
项目导出资源有问题是,配置 pom.xml 中寻找配置方案
pom.xml
//建立项目的一些配置
<build>
// plugins 的配置
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8888</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}
</webAppSourceDirectory>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
// resources 的配置
<resources>
<resource>
// 项目启动时会 导出 properties 和 xml 后缀相关的配置
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
6、Servlet
6.1、Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤。
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web 服务器中
把实现了Servlet接口的Java程序叫做,Servlet
6.2、HelloServlet
Servlet接口sun公司有两个默认的实现类:HttpServlet,
-
构建一个普通的Maven项目,删掉里面的src目录,以后我们学习就在这个项目里建立Moudel;这个空的工程就是Maven主工程;
-
关于Maven父子工程的理解:
父项目中会有
<name>javaweb-01-maven</name> <modules> <module>servlet-01</module> </modules>
子项目中会有
<parent> <artifactId>javaweb-01-maven</artifactId> <groupId>com.kutsu</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的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 { System.out.println("进入doGet方法ssss"); resp.setCharacterEncoding("UTF-8"); PrintWriter writer = resp.getWriter(); writer.write("hellowrold"); writer.write("<div >你好<div>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
-
编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需给他一个浏览器访问的路径
<servlet> <servlet-name>hello1</servlet-name> <servlet-class>com.qq.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello1</servlet-name> <url-pattern>/he1</url-pattern> </servlet-mapping>
-
配置tomcat
注意:配置项目发布的路径就可以了
-
启动测试
6.3、Servlet原理
Servlet是由web服务器调用,web服务器在收到浏览器请求在之后,会:
6.4、Mapping问题
-
一个Servlet可以指定一个映射路径
-
一个Servlet可以指定多个映射路径
-
一个Servlet可以指定通用映射路径
-
一个Servlet可以指定一个映射路径
-
指定一些后缀或者前缀等等....
-
优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
6.5、ServletContext
web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
以后会使用一下功能替代 context
-
共享数据:Sesion、request的一些方法 替代 context
-
获取web.xml 中的数据:几乎不用
-
请求转发:request
-
读取资源文件:类加载、反射
1、共享数据
2、初始化参数web.xml中获取
public class mybatis extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet方法ssss");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
}
<servlet>
<servlet-name>hello2</servlet-name>
<servlet-class>com.qq.servlet.mybatis</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
3、请求转发
请求转发一般不用getServletContext做
用request做
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入servlet");
context.getRequestDispatcher("/gp").forward(req,resp);
}
}
4、读取资源文件
使用了 Properties 类
Properties
- 在java目录下新建 properties
- 在resources目录下新建 properties
发现:都被打包到了同一个路径下:classes。我们俗称这个路径为classpath
思路:需要一个文件流
@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);
}
测试即可 ok。
6.6、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的httpServletRequest对象,代表响应的一个 HttpServletResponse;
- 如果要获取客户端请求过来的参数:找 httpServletRequest
- 如果要给客户端响应一些信息:找 HttpServletResponse
HttpServletResponse 源码结构展示:
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOExeption;
2、常见应用
- 向浏览器输出消息(一直在讲,就不说了)
- 下载文件
- 1、要获取下载文件的路径
- 2、下载的文件名是啥?
- 3、设置 想办法让浏览器能够下载我们需要的东西
- 4、获取下载文件的输入流
- 5、创建缓冲区
- 6、获取 OutputStream 对象
- 7、将FileOutputStream流写入到 buffer 缓冲区
- 8、使用 OutputStream 将缓冲区中的数据输出到客户端
package com.qq.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 downfile extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filepath = "E:\code\Javaweb\javaweb-01-maven\servlet-01\src\main\resources\logo十一子.png";
String filename = filepath.substring(filepath.lastIndexOf("\") + 1);
resp.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode(filename,"UTF-8"));
FileInputStream in = new FileInputStream(filepath);
int len=0;
byte[] buffer = new byte[1024];
ServletOutputStream out = resp.getOutputStream();
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
网页中请求这个类就可以下载了。
3、验证码功能
生成随机数图片
package com.qq.servlet;
import com.sun.prism.PresentableState;
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, 80, BufferedImage.TYPE_INT_BGR);
//得到图片
Graphics g = image.getGraphics();//笔
//设置图片的背景颜色
g.setColor(Color.CYAN);
g.fillRect(0,0,80,50);
//给图片写数据
g.setColor(Color.RED);
g.setFont(new Font(null, Font.BOLD,20));
g.drawString(makeNum(),1,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/png");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("exires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"png",resp.getOutputStream());
}
//生成随机数
String makeNum(){
Random random = new Random();
String num = random.nextInt(99999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
sb.append("0");
}
num = sb.toString() + num;
return num;
}
}
4、实现重定向(重点)
B一个web资源受到客户端A请求后,B他会通知A客户端去访问C获取资源
web注册请求路径,login
测试前端画面,要引入 jsp 包,点击submit之后,请求 login 页面路径
login 请求页面,进行 重定向 资源 success.jsp 页面
resp.sendRedirect("/r/success.jsp");
success.jsp 资源
测试:访问 ss11 项目 根 网站,就ok。
6.7、HttpServletRequest
HttpServletRequest 代表客户端的请求,用户通过Http
req.getRequestDispatcher("").forward(req,resp);
面试题:请你聊聊重定向和转发的区别?
相同点
- 页面都会实现跳转
不同点
- 请求转发的时候,utl不会产生变化 307
- 重定向时候,url地址栏会发生变化 302
7、Cookie、Session
cookie:饼干
session:会话
7.1、会话
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称为会话。
有状态会话:
一个网站,怎么证明你来过?
- 服务器给客户端 cookie
- 服务器记录客户端记录 session
下面写错了:ApplicationContext
7.2、保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务器技术
常见:登录之后,下次不用再登录了,第二次直接访问就上去了
7.3、Cookie(重点)
例子:实现记录客户最后一次登录 时间
package com.kutsu;
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 servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你,你来的时间,把这个时间封装称为一个信件。
//你来过来,我就知道是你了
//解决中文乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/javascript; charset=utf-8");
PrintWriter out = resp.getWriter();
//cookie,服务器从弄个客户端获取呀;
Cookie[] cookies = req.getCookies();
//判断cookie是否存在
if (cookies != null) {
//如果存在,怎么搞
out.write("上次访问的时间是");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("lastLoginTime") ) {
//获取cookie中的值
long lasttime = Long.parseLong(cookie.getValue());
Date dade =new Date(lasttime);
out.write(dade.toLocaleString());
}
}
}else {
out.write("这是第一次访问");
}
//服务给 客户端 响应一个 cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis() + "");
//设置有效期 24分钟
cookie.setMaxAge(24*60);
resp.addCookie(cookie);
}
}
cookie:一般会保存在本地的 用户目录下 appdata
一个网站cookie是否存在上限!聊聊细节问题
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制 4kb
- 300个 cookie浏览器上限
删除cookie:
- 不设置有效期cookie,关闭浏览器,自动失效
- 设置有效期时间为0;
编码解码
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 CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你,你来的时间,把这个时间封装称为一个信件。
//你来过来,我就知道是你了
//解决中文乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/javascript; charset=utf-8");
HttpSession session = req.getSession();
session.setAttribute("name","this is string session");
String id = session.getId();
resp.getWriter().write("session id="+id);
}
}
注销session
HttpSession session = req.getSession();
session.invalidate();
web.xml 设置 session 过期时间
<session>
<!--15分钟后 session 自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session>
8、JSP
8.1、什么是JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术。
最大的特点:
- 写JSP就像在写HTML
- 区别:
- HTML只会给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据
8.2、JSP原理
思路:JSP到底怎么执行的!
-
代码层面没有任何问题
-
服务器内部工作
1、tomcat中有一个 work目录
E:Environmentapache-tomcat-9.0.39workCatalinalocalhostROOTorgapachejsp
2、IDEA中使用Tomcat的会在IDEA的tomat中产生一个work目录
win10可能在这个目录下
win7 可能在这个目录下
C:UsersAdministrator.SmartTomcatjavaweb-01-mavenjava-session-cookieworkCatalinalocalhostROOTorgapachejsp
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换成为一个Java类
JSP本质上就是一个Servlet
1.判断请求
2.内置一些对象
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
类比
3.输出页面前增加的代码
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
4.以上的这些个对象我们可以在JSP页面中直接使用!
在JSP页面中
只要是Java代码就会原封不动输出
如果是HTML代码,就会被转换为:
这样的格式,输出到前端
8.3、JSP基础语法
任何语言都有自己的语法,java中有。JSP作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可)。java所有语法都支持。
jsp表达式:<%=变量或表达式>
方法一:
<%= new java.util.Date() %>
简写:
${=new java.util.Date()}
jsp脚本片段:
<%
int sum=0;
for (int i = 0; i < sum; i++) {
sum+=i;
}
out.print(sum);
%>
JSP声明:
!
<%!
static {
System.out.println("loading");
}
private int mmm=0;
public void mmmss(){
System.out.println("jinru rr");
}
%>
jsp声明:会被编译到jsp生成java 的类中!其他的,就会被生成到 _jspService方法中!
在JSP,嵌入java代码即可!
8.4、JSP指令
<%@ page %>
<%@ page />
<%@ include %>
<%@ include file="/common/header.jsp"/>
<h1>网页主体</h1>
<%@ include file="/common/header.jsp"/>
会将 @ 的页面 和 本页面 ,两个页面合二为一。
8.5、JSP标签
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/header.jsp"/>
会将 include 的页面 和 本页面 ,两个页面拼接。
8.6、9大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application【ServletContexe】 存东西
- config【ServletConfig】
- out
- page
- exception
<%
//保存数据只在一个页面中有效
pageContext.setAttribute("name1","测试1");
//保存数据只在一次请求中有效,请求转发会携带这个数据
request.setAttribute("name2","测试2");
//保存数据只在一个会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name3","测试3");
//保存数据只在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4","测试4");
%>
//使用 EL 表达式输出 ${}
<h1>取出值为</h1>
<h2>${name1}</h2>
8.7、JSP标签、JSTL标签、EL表达式
导入包:
<!-- JSTL 表达式 依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard 标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
注意:Tomcat服务器也需要导入 这两个包
JSP标签
- jsp:forward
- jsp:param
JSTL表达式
JSTL标签库的使用就是为了弥补 HTML 标签的不足;它自定义许多标签,可以供我们使用,标签的功能和java代码一样!
核心标签(掌握部分)
引用核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
例子:c-if
例子:c:set
例子:c:forEach
格式化标签
引用格式化标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML 标签
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL函数
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
9、JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get、set方法
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表 --> 类
- 字段 --> 属性
- 行记录 --> 对象
10、MVC三层架构
什么是MVC?:
Model:模型
View:视图
- 展示数据模型
- 提供可以供我们操作的请求
Controller:控制器
- 接收用户的请求
响应给客户端内容(交给业务层去做)- 重定向、转发
10.1、早些年2层结构
用户直接访问控制层,控制层就可以直接操作数据库;
servlet --> CRUD --> 数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的!
10.2、mvc三层架构
Model:
- 业务处理:业务逻辑(service)
- 数据持久层:CRUD(Dao)
View:视图
- 展示数据
- 提供链接发起Servlt请求(a,form,img。。。)
Controller:控制器(Servlet)
-
接收用户的请求:(req:请求参数,Session信息。。。)
-
交给业务层处理对应的代码
-
控制视图的跳转
登录 -->> 接收用户的登录请求 -->> 处理用户的请求(获取用户登录的参数,username,password) -->> 交给业务层处理登录业务(判断用户名密码是否正确:事务) -->> Dao层查询用户名和密码是否正确 -->> 数据库
11、Filter
Filter:过滤器,,用来过滤网站的数据
- 处理中文乱码
- 登录验证
Filter
web.xml配置
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.kutsu.filter.CharachterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/ser/*</url-pattern>
</filter-mapping>