Java Web
1.基本概念
1.1 介绍
web开发:
- web 网页的意思
- 静态web
- HTML,css
- 提供给所有人看的数据始终不会发生变化
- 动态web
- 每个人看到的页面不同
- 技术栈:Servlet/JSP,ASP,PHP
在Java中,动态web资源开发的技术统称为JavaWeb
1.2 web应用程序
web应用程序:可以提供浏览器访问的程序
- a.html,b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务
- URL
- 统一的web资源会被放在同一个文件夹下
- 一个web应用由多个部分组成
- html,css,js
- jsp,servlet
- java程序
- jar包
- 配置文件(peoperties)
web应用程序编写完毕后,若想提供给外界访问:需要服务器来管理
2.web服务器
2.1 技术讲解
ASP:
- 微软:国内最早流行的就是ASP
- 在HTML中嵌套VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面就有几千行的业务代码
- 维护成本高
PHP:
- PHP开发速度很快,功能强大,跨平台,代码简单
- 无法承受大访问量的情况
JSP/Servlet:
B/S:浏览器和服务器
C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于JAVA
- 可承受三高问题带来的影响(高并发,高可用,高性能)
2.2 web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
IIS
微软的 ASP…Windows自带的
Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
3.Tomcat
3.1 安装Tomcat
文件夹:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vztH53xR-1599700208887)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601153944270.png)]
3.2 启动Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CB4YikB2-1599700208889)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601154120284.png)]
访问测试:http://localhost:8080/
面试题:
谈谈网站是如何进行访问的
- 输入一个域名,回车
- 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射
- 有:直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
- 没有:去DNS服务器找
4. Http
4.1 什么是HTTP
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。 80端口
HTTPS安全的 443端口
4.2 HTTP请求
- 客户端-----发请求 (request)------ 服务器
// 通用
Request URL: https://cn.bing.com/ // 请求地址
Request Method: GET // 请求方法
Status Code: 200 //状态码
Remote(远程) Address: 202.89.233.100:443 // 远程地址
accept-encoding: gzip, deflate, br // 编码格式
accept-language: zh-CN,zh;q=0.9 // 语言
cache-control: max-age=0 // 缓存控制
- 请求行
- 请求方式:GET,POST
- GET:请求能够携带的参数比较少,大小有限制,会在URL栏显示参数数据内容,不安全,但高效
- POST:请求能够携带的参数无限制,大小无限制,不会在URL栏显示参数数据内容,安全,不高效
- 消息头
Accept:告诉浏览器所支持的数据类型
Accept-Encoding 支持哪种编码格式
Accept-Langeage 语言环境
Cache-control 缓存控制
Connection 告诉浏览器,请求完成时断开还是连接
4.3 HTTP响应
- 服务器----响应----客户端
Cache(缓存)-Control(控制): private
Connection: keep-alive 连接
Content-Encoding: gzip //编码
Content-Type: text/html;charset=utf-8 // 类型
4.3.1 状态码
200:请求响应成功 200
3**:请求重定向
- 重定向:你重新到我给你的新位置去
4**:找不到资源 404
- 资源不存在
5**:服务器代码错误 500 502 :网关错误
常见面试题:
当你的浏览器中地址栏输入地址回车的一瞬间到页面能展示回来,经历了什么?
5. Maven
在javaweb开发中,需要使用大量的Jar包,需要手动导入
由此,Maven诞生了
5.1 Maven项目架构管理工具
目前用来方便导入jar包
Maven的核心思想:约定大于配置
Maven会规定好你该如何去编写我们的Java代码
5.2 下载Maven
官网:http://maven.apache.org/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2mqxW28-1599700208891)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601164659535.png)]
5.3 配置环境变量
配置如下配置:
- M2_HOME maven目录下的bin目录
- MAVEN_HOME maven目录
- 在系统path中配置 %MAVEN_HOME%\bin
在控制台测试
mvn -version
5.4 阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
5.5 本地仓库
在本地的仓库,远程仓库
建立一个本地仓库:
在C:\Program Files (x86)\Maven\apache-maven-3.6.3\conf\settings.xml文件中添加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjqeXVye-1599700208892)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601180714190.png)]
5.6 在IDEA中使用Maven
- 创建一个Maven web项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GFJJZpH-1599700208894)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181104589.png)]
- 创建组ID,和项目名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9Ga3PmU-1599700208896)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181222963.png)]
- 选择Maven目录,settings配置文件路径,本地仓库路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJ9wjRXj-1599700208897)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181256423.png)]
- 等待Maven自动下载Jar包
5.7 创建一个普通的Maven项目
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLIuMIxX-1599700208898)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182019270.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlkQynlR-1599700208899)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182053704.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ei7phXG7-1599700208901)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182210016.png)]
5.8 在IDEA中配置Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ucg4VsO7-1599700208903)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182500061.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7KogMBeA-1599700208904)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182707752.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OdAkuuee-1599700208906)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182731628.png)]
5.9 pom文件
pom.xml是Maven的核心配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYimryaN-1599700208907)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601183103839.png)]
5.10 Maven的问题
Maven由于他的约定大于配置,我们之可能碰到我们写的配置文件,无法被导出后生效的问题
解决方案:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</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,GenericServlet
- 创建一个普通的Maven项目,删除src目录
- 导入所依赖的jar包
# Servlet依赖包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
# JSP依赖包
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
-
创建一个Model(模板)
父子工程:
父工程中会有
<modules>
<module>Servlet-01</module>
<module>Servlet-01</module>
</modules>
子工程中有
<parent>
<artifactId>Maven-02-Servlet</artifactId>
<groupId>org.xu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的jar包子项目都可以使用
- 替换最新的web.xml
- 创建Java,resources目录
- 编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,这里我们直接继承
package com.xu.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 {
super.doGet(req, resp);
}
}
-
编写Servlet的映射
为什么需要映射:我们写的是Java程序,但需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径
<!-- 注册Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.xu.servlet.HelloServlet</servlet-class> </servlet> <!--Servlet请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
-
启动测试
6.3 Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器的请求后,会:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhhbNyEt-1599700208940)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200603181901706.png)]
6.4 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>/hello1</url-pattern>
</servlet-mapping><servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping><servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping><servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello4</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>*.xu</url-pattern>
</servlet-mapping>
- 默认路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
-
优先级问题
指定了固有的映射路径优先级最高,如果找不到就好走默认的处理请求
6.5 ServletContext
web容器在启动的时候,它会为每个web程序都创建了一个对应的ServletContext对象,它代表了当前的web应用
6.5.1 共享数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIzMkouU-1599700208942)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200604112026138.png)]
public class Context01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = "徐安康"; //数据
context.setAttribute("name",name); //添加一个键值对 将一个数据保存在servlet context
}
}
public class Context02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");
resp.setContentType("text/html"); //设置类型
resp.setCharacterEncoding("utf-8"); //设置编码格式
resp.getWriter().print(name); //输出
}
}
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.xu.ServletContext.Context01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>set</servlet-name>
<servlet-class>com.xu.ServletContext.Context02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>set</servlet-name>
<url-pattern>/set</url-pattern>
</servlet-mapping>
测试结果
6.5.2 获取初始化参数
public class Context03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.setContentType("text");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(url);
}
}
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306/数据库?参数&参数</param-value>
</context-param>
<servlet>
<servlet-name>get2</servlet-name>
<servlet-class>com.xu.ServletContext.Context03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get2</servlet-name>
<url-pattern>/get2</url-pattern>
</servlet-mapping>
测试结果
6.5.3 转发请求
public class Context04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
// 转发到get2路径
context.getRequestDispatcher("/get2").forward(req,resp);
}
}
<servlet>
<servlet-name>get3</servlet-name>
<servlet-class>com.xu.ServletContext.Context04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get3</servlet-name>
<url-pattern>/get3</url-pattern>
</servlet-mapping>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r237qkCb-1599700208944)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200604120316926.png)]
6.5.4 获取资源文件
Properites
- 在Java目录下新建Properties
- 在resources目录下新建Properties
发现:都被打包到了同一路径下:Classes
思路:需要一个文件流
public class Context05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/classes/properties");
Properties prop = new Properties();
prop.load(input);
String username = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(username);
resp.getWriter().print(pwd);
}
<servlet>
<servlet-name>get4</servlet-name>
<servlet-class>com.xu.ServletContext.Context05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get4</servlet-name>
<url-pattern>/get4</url-pattern>
</servlet-mapping>
6.6 HTTPServletRequest
HTTPServletRequest代表客户端的请求,用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HTTPServletRequest,通过这个HTTPServletRequest的方法,获得客户端信息
获取前端数据
- getParameter
- getParmeterValues
6.7 HTTPServletResponse
web服务器接收到客户端的Http请求,针对这个请求,分别创建一个代表请求的HTTPServletRequest对象,代表响应的一个HTTPServletResponse;
- 如果要获取客户端的请求过来的参数:找HTTPServletRequest
- 如果要给客户端响应一些信息:找HTTPServletResponse
6.7.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);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
常见应用
- 向浏览器输出东西 (之前使用的)
- 下载文件
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取文件路径
String realPath = "D:\\Idea Project\\Javaweb-02-Servlet\\Response\\src\\main\\resources\\1.png";
System.out.println(realPath);
// 获取文件名称 通过截取路径名获取文件名称
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 设置浏览器支持的下载 设置下载文件名的编码
resp.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(realPath,"UTF-8"));
// 获取输入流
FileInputStream input = new FileInputStream(realPath);
// 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 获取输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 使用input写入缓冲区 使用outputStream输出给客户端
while ((len = input.read(buffer)) > 0){
outputStream.write(buffer,0,len);
}
// 关闭流
outputStream.close();
input.close();
}
}
- 验证码实现
public class Image extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 使浏览器5秒刷新一次
resp.setHeader("refresh","5");
// 创建一个图片
BufferedImage image = new BufferedImage(100,40,BufferedImage.TYPE_INT_RGB);
// 得到图片
Graphics2D g = (Graphics2D) image.getGraphics();
// 设置图片的背景颜色
g.setColor(Color.WHITE);
g.fillRect(0,0,100,40);
// 给图片写入参数
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.BOLD,30));
g.drawString(makeNum(),20,20);
resp.setContentType("image/png");
ImageIO.write(image,"png",resp.getOutputStream());
}
/**
* 获取随机数
* @return 随机数字符
*/
private String makeNum(){
Random random = new Random();
String num = String.valueOf(random.nextInt(9999));
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 4 - 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);
}
}
- 实现重定向
public class Redirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setHeader("Location","/xu/down");
// resp.setStatus(302);
// 等价 原理
resp.sendRedirect("/xu/down");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
重定向与转发的区别
相同点
- 页面都会实现跳转
不同点
- 转发,URL不会变化
- 重定向,URL会发生变化
7. Cookie,Session
7.1 会话
会话:用户打开一个浏览器,点击多个超链接,访问多个web资源,关闭浏览器,这个过程可以称为会话
有状态的会话:你之前来过,下次再来,服务器会知道你,曾经来过,称为有状态会话
一个网站,怎么证明你来过?
客户端 服务端
- 服务端给客户端一个cookie,客户端下次访问服务器带上cookie就可以了
- 服务器登记你来过,下次你来的时候我来匹配你 seesion
7.2 保存会话的两种技术
7.2.1 cookie
- 客户端技术(响应,请求)
- 从请求中拿到Cookie信息
- 从服务器响应客户端Cookie
req.getCookie()//获得cookie
cookie.getName()//获得cookie的key
cookie.getvalue()// 获得cookie的value
new Cookie("LastLoginTime",System.currentTimeMillis()+"")//新建一个Cookie
cookie.setMaxAge(24*60*60)//设置cookie的有效期
resp.addCookie()// 响应给客户端一个cookie
一个网站cookie是否存在上限
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制4KB
- 300个cookie浏览器上限
删除cookie:
- 设置有效期为0
- 不设置有效期,关闭浏览器,自动失效
编码解码:
URLEncoder.encode("编码内容","UTF-8");
URLDecoder.decode("解码内容","UTF-8");
7.2.1 session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中
什么是Session:
- 服务器会给每个用户(浏览器)创建一个Session对象
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登录之后,整个网站它都可以访问—> 保存用户的信息
常用方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0POzK27c-1599700208945)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608155701030.png)]
Session与Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占的Session中,服务端保存
- Session对象由服务器创建
使用场景:
- 保存一个登陆用户的信息
- 保存购物车信息
- 在整个网站中经常会用到的数据,保存在Session中
// 获得session
HttpSession session = req.getSession();
// 设置属性
session.setAttribute("name","徐安康");
// 获取sessionId
session.getId();
// 注销Session
session.invalidate();
// 移除一个属性
session.removeAttribute("name");
自动删除Session:配置web.xml
<session-config>
<!--使Session30分钟后注销-->
<session-timeout>30</session-timeout>
</session-config>
Cookie图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f49FhCdT-1599700208947)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608163249629.png)]
Session图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpvdlysn-1599700208948)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608163410991.png)]
8. JSP
8.1 什么是JSP
Java Server Pages :Java服务器端页面,也和Servlet一样,用于动态Web技术
最大的特点:
- 写JSP就像在写HTML
- 区别
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据
8.2 JSP原理
思路:JSP到底怎么执行的
-
代码层面
-
服务器内部工作
- Tomcat中有一个work目录
- 在IDEA中也会生成一个tomcat的work目录
C:\Users\who\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\未命名_Javaweb-02-Servlet_2\work\Catalina\localhost\xu\org\apache\jsp
发现页面转变为Java程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0g7YcgM-1599700208948)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200611141000316.png)]
浏览器想服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会转换成Java类
JSP本质就是一个Servlet
// 初始化
public void _jspInit() {
}
// 销毁
public void _jspDestroy() {
}
// JSPService
public void _jspService(final HttpServletRequest request, final 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.JspWriter out = null; // out
final java.lang.Object page = this; // page:当前
- 输出对象前的操作
response.setContentType("text/html;charset=UTF-8"); // 设置响应的页面类型
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;
- 以上的对象在JSP界面中可以直接使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZVehu9u-1599700208950)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608165628027.png)]
在JSP中只要是Java代码,会原封不动的输出
如果是HTML代码会使用out输出
8.3 JSP基础语法
JSP作为Java技术的一种应用,它拥有一些扩展的语法,Java所有语法都支持
8.3.1 JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new Date()%>
8.3.2 JSP脚本片段
<%
int sum = 0;
for (int i = 1; i < 100; i++) {
sum+=i;
}
out.print("<h1>sum = "+ sum + "</h1>");
%>
8.3.3 JSP声明
<%!
static {
System.out.println("JSP声明");
}
public void xu(){
System.out.println("该方法在类下面");
}
%>
JSP声明:会被编译到JSP生产的Java的类中,其他的会被生产到jspService方法中
8.4 JSP指令
<%@ page args....%>
<%@ include file = "" %>
8.5 9大内置对象
- PageContext 存东西 保存的数据只在一个页面中有效
- Request 存东西 保存的数据只在一次请求中有效,请求转发会携带这个数据
- Response
- Session 存东西 保存的数据只在一次会话中有效,从打开浏览器到关闭
- Application (ServletContext) 存东西 保存的数据到服务器
- Config (ServletConfig)
- out
- page 不用,只是在当前界面
- exception
8.6 JSP标签、JSTL标签、EL表达式
需要导包
EL表达式:${}
- 获取数据
- 执行运算
- 获取Web开发的常用对象
JSP标签:
<JSP:forward page = "转发页面">
<%--转发所携带的属性--%>
<JSP:param name = "name" value = "xu an kang"></JSP:param>
<JSP:param name = "age" value = "12"></JSP:param>
</JSP:forward>
<JSP:include page = "要拼接的页面"></JSP:include>
JSTL表达式:
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了许多的标签,可以供我们使用,标签的功能和Java一样
核心标签
需要导入标签库
<%--导入标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sg6nVJZO-1599700208951)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200614113922421.png)]
9. JavaBean
实体类
JavaBean有特定的写法:
- 必须要一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般涌来和数据库的字段做映射 ORM
ORM:对象关系映射
- 表---->类
- 字段—>属性
- 行记录---->对象
10. MVC三层架构
10.1 什么是MVC
Model View Controller 模型 视图 控制器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRtvDv4c-1599700208952)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615160418544.png)]
Model
-
业务处理:业务逻辑(Service)
-
数据持久层:CRUD(Dao)
View
- 展示数据
- 提供链接发起Servlet请求(a,form,img…)
Controller (Servlet):
- 接收用户请求:(请求参数,Session信息)
- 交给业务层处理对应的代码
- 控制视图的跳转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pXZhghJ-1599700208953)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615161027706.png)]
11. Filter
Filter:过滤器,用来过滤网站的数据
- 处理中文乱码
- 登录验证
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWySqs1I-1599700208954)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615173110054.png)]
Filter开发步骤:
-
导包
-
编写过滤器
-
导包为Servlet中的Filter
-
编写Filter类
-
package com.xu.Filter; import javax.servlet.*; import java.io.IOException; // 导入的为Servlet.Filter类 public class CharacterEncodingFilter implements Filter { //初始化:在web服务器开始的时候调用 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化"); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=UTF-8"); // 必须要执行的代码 让请求可以往下走 如果不写,则请求不会传递给下一个 filterChain.doFilter(servletRequest,servletResponse); } // 销毁:在web服务器关闭的时候调用 public void destroy() { System.out.println("销毁"); } }
-
-
在web.xml中配置Filter
-
<filter> <filter-name>charset</filter-name> <filter-class>com.xu.Filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>charset</filter-name> <!--使Servlet下面的请求调用filter这个过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
12. 监听器
实现监听器的接口:有很多种接口
- 实现监听器接口
- web.xml中注册监听器
13. 过滤器常用应用
用户权限过滤:
- 用户登录,想session存放用户的数据
- 进入主页的时候需要判断用户是否已经登录,在过滤器中实现
14. SMBMS项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWnGXIpi-1599700208955)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200617160837901.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Ke0BHkF-1599700208956)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200618140217395.png)]
14.1 项目搭建
- 创建maven项目
- 配置Tomcat
- 导入JAR包
- 创建项目结构
- 编写实体类
- 编写基础公共类
- 数据库配置文件
- 编写数据库的公共类
- 编写字符编码过滤器
- 导入静态资源
14.2 登录功能的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gI5BGrb-1599700208957)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200620102832681.png)]
-
编写前端页面
-
在web.xml设置欢迎页(首页)
-
编写Dao层登录用户登录的接口
-
编写Dao接口的实现类
-
业务层接口
-
业务层实现类
-
编写Servlet
-
测试登录页面
登录功能优化(权限,登出)
登出:
删除Session,跳转到登录界面
权限:
设置过滤器,判断session中的值是否为空。过滤JSP下的所有请求
修改密码实现
- UserDao接口方法
- UserDao实现类
- 实现数据库密码修改方法
- Service接口
- Service实现类
- 处理修改密码业务
- 编写Servlet类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOP7Iwa1-1599700208959)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200702165037315.png)]
用户列表展示实现
- Dao层通过StringBuffer创建SQL
- 判断用户是否添加约束条件